关于 QEMU 的网络策略
QEMU 提供 4 种网络通信方法,它们分别是:

User mode stack:用户协议栈方式,这种方式的大概原理是在 QEMU 进程中实现一个协议栈,这个协议栈可以被视为一个主机与虚拟机之间的 NAT 服务器,它负责将 QEMU 所模拟的系统网络请求转发到外部网卡上面,从而实现网络通信。但是不能将外面的请求转发到虚拟机内部,并且虚拟机 VLAN 中的每个接口必须放在 10.0.2.0 子网中。
socket: 为 VLAN 创建套接字,并把多个 VLAN 连接起来。
TAP/bridge:最重要的一种通信方式,我们想要实现 QEMU 虚拟机和外部通信就需要使用这种方式。
VDE:也是用于连接 VLAN 的,如果没有 VLAN 连接需求基本用不到。
重点解释一下 tap 模式,TAP 属于 LInux 内核支持的一种虚拟化网络设备,还有 TUN 也属于这种设备,它们完全由软件模拟实现,TUN/TAP 负责在内核协议栈和用户进程之间传送协议数据单元。TUN 工作在网络层,而 TAP 工作在数据链路层,TUN 负责与应用程序交换 IP 数据包,而 TAP 与应用程序交换以太网帧。所以 TUN 经常涉及路由,而 TAP 常用于网络桥接。

所谓桥接可以简单理解为在两张网卡之间搭一座桥,一端有数据就可以通过桥走到另一端,对于实现 QEMU 虚拟机通信正合适。桥接技术在 VMWARE 中非常常用,我们设置虚拟机网络的时候就能看见桥接选项,实际上 VMware 在物理机上虚拟化了 3 张网卡,分别负责桥接、仅主机、共享网络。

具体的配置过程
(首先确定你的机器支持 TAP/TUN 虚拟设备)

首先安装如下软件

apt-get install bridge-utils        # 虚拟网桥工具
apt-get install uml-utilities       # UML(User-mode linux)工具

添加网桥,大部分操作都需要 root 权限:

ifconfig <你的网卡名称(能上网的那张)> down    # 首先关闭宿主机网卡接口
brctl addbr br0                     # 添加名为 br0 的网桥
brctl addif br0 <你的网卡名称>        # 在 br0 中添加一个接口
brctl stp br0 off                   # 如果只有一个网桥,则关闭生成树协议
brctl setfd br0 1                   # 设置 br0 的转发延迟
brctl sethello br0 1                # 设置 br0 的 hello 时间
ifconfig br0 0.0.0.0 promisc up     # 启用 br0 接口
ifconfig <你的网卡名称> 0.0.0.0 promisc up    # 启用网卡接口
dhclient br0                        # 从 dhcp 服务器获得 br0 的 IP 地址
brctl show br0                      # 查看虚拟网桥列表
brctl showstp br0                   # 查看 br0 的各接口信息

当配置完成之后执行 ifconfig 结果应该如下:

qemu msys 虚拟机安装 qemu虚拟机配置网络_网络

此时网桥已经得到了 IP,并且能够连接网络的网卡 enp0s5 也加入了网桥,此时我们的网桥状态大致是这种情况

qemu msys 虚拟机安装 qemu虚拟机配置网络_运维_02

桥的一端连接到 enp0s5,我们只需要再把另一端接到 QEMU 虚拟机(准确的说是 VLAN )上面就可以了。

创建一个 TAP 设备,作为 QEMU 一端的接口:

tunctl -t tap0 -u root              # 创建一个 tap0 接口,只允许 root 用户访问
brctl addif br0 tap0                # 在虚拟网桥中增加一个 tap0 接口
ifconfig tap0 0.0.0.0 promisc up    # 启用 tap0 接口
brctl showstp br0                   # 显示 br0 的各个接口

此时网桥的信息应该是:

qemu msys 虚拟机安装 qemu虚拟机配置网络_桥接_03

这样就相当于把两张网卡通过网桥连起来了:

qemu msys 虚拟机安装 qemu虚拟机配置网络_桥接_04

现在只需要启动镜像,指定网络连接模式是 TAP 即可。

sudo qemu-system-mipsel -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_squeeze_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no

特别说明一下参数含义:-net nic 表示希望 QEMU 在虚拟机中创建一张虚拟网卡,-net tap 表示连接类型为 TAP,并且指定了网卡接口名称(就是刚才创建的 tap0,相当于把虚拟机接入网桥)。

script 和 downscript 两个选项的作用是告诉 QEMU 在启动系统的时候是否调用脚本自动配置网络环境,如果这两个选项为空,那么 QEMU 启动和退出时会自动选择第一个不存在的 tap 接口(通常是 tap0)为参数,调用脚本 /etc/qemu-ifup 和 /etc/qemu-ifdown。由于我们已经配置完毕,所以这两个参数设置为 no 即可。

等到镜像 boot 完毕,在命令行中 ping 一下百度:

qemu msys 虚拟机安装 qemu虚拟机配置网络_linux_05

至此网络配置成功。

参考链接

https://shadow-file.blogspot.com/2013/05/running-debian-mips-linux-in-qemu.html