4. QEMU网络配置

任务说明

本案例目标是在QEMU中启动一个Linux guest虚拟机,并配置虚拟网络,使host能够通过SSH连接到guest。采用用户态网络(user-mode networking)方案,guest通过QEMU内置的SLIRP协议栈获得网络访问能力,host通过端口转发访问guest的SSH服务。

网络拓扑

Host 主机 QEMU 进程 -netdev user,id=net0 SLIRP 用户态网络栈 guest IP: 10.0.2.15/24 网关: 10.0.2.2 hostfwd=tcp::2222-:22 Guest 虚拟机 Linux 内核网络 eth0: 10.0.2.15/24 SSH服务监听 :22 sshd 服务 监听端口 22 虚拟网卡 (e1000/virtio) ssh -p 2222 host:2222 → guest:22

实现步骤

1. 准备guest磁盘镜像

使用已安装好Linux系统(含SSH服务)的qcow2磁盘镜像。若尚无镜像,可用以下命令创建一个空白镜像并安装系统:

qemu-img create -f qcow2 guest.qcow2 10G

2. 启动QEMU并配置网络

使用-netdev user参数启用用户态网络,并通过hostfwd将host的2222端口转发至guest的22端口:

qemu-system-x86_64 \
  -m 1024 \
  -smp 2 \
  -drive file=guest.qcow2,format=qcow2 \
  -netdev user,id=net0,hostfwd=tcp::2222-:22 \
  -device e1000,netdev=net0 \
  -display none \
  -serial mon:stdio

参数说明:

  • -netdev user,id=net0:创建用户态网络后端,guest自动获得10.0.2.0/24网段地址
  • hostfwd=tcp::2222-:22:将host的TCP 2222端口转发到guest的22端口
  • -device e1000,netdev=net0:为guest添加e1000虚拟网卡并连接到net0

3. 在guest内确认网络与SSH服务

guest启动后,在guest控制台内执行:

ip addr show eth0
# 预期输出包含: inet 10.0.2.15/24

systemctl status sshd
# 或: service ssh status
# 确认sshd处于运行状态

4. 从host发起SSH连接

ssh -p 2222 user@localhost

其中user为guest内的用户名。连接时输入对应用户的密码即可登录guest。

验证方法

按以下步骤验证配置是否成功:

  1. 网络连通性验证:在guest内执行ping -c 3 10.0.2.2,能收到回复说明guest到host的虚拟网关连通。
  2. SSH端口转发验证:在host执行ssh -p 2222 user@localhost,能成功登录即说明端口转发和SSH通信正常。
  3. 判定标准:SSH登录成功后,在guest内执行hostname,返回guest的主机名而非host的主机名,即可确认已进入guest系统。

故障排查

  • 连接被拒绝:检查guest内sshd是否运行,执行ps aux | grep sshd确认进程存在。
  • 端口占用:若host的2222端口被占用,更换其他端口如hostfwd=tcp::2223-:22,并相应修改ssh命令端口。
  • guest无网络:确认QEMU启动命令中-netdev和-device参数均正确添加,且guest内核已编译e1000驱动支持。