4. QEMU网络配置
任务说明
本案例目标是在QEMU中启动一个Linux guest虚拟机,并配置虚拟网络,使host能够通过SSH连接到guest。采用用户态网络(user-mode networking)方案,guest通过QEMU内置的SLIRP协议栈获得网络访问能力,host通过端口转发访问guest的SSH服务。
网络拓扑
实现步骤
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。
验证方法
按以下步骤验证配置是否成功:
- 网络连通性验证:在guest内执行
ping -c 3 10.0.2.2,能收到回复说明guest到host的虚拟网关连通。 - SSH端口转发验证:在host执行
ssh -p 2222 user@localhost,能成功登录即说明端口转发和SSH通信正常。 - 判定标准: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驱动支持。