QEMU 中的网络分为两个部分:
- 提供给虚拟机的虚拟网络设备(例如 PCI 网卡)。
- 与(模拟) NIC 交互的网络后端(例如,将数据包放到主机的网络上)。
默认情况下, 如果你啥都没有指定:QEMU 将为 guest 创建一个 SLiRP 用户网络后端和一个合适的虚拟网络设备(可能是 e1000),但对于现代操作系统而言,不是最佳的使用方式
1. 网络后端
1.1 如何创建网络后端?
ini
-netdev TYPE,id=NAME,...
该 id
选项提供虚拟网络设备和网络后端相互关联的名称。
如果您希望虚拟机内部有多个虚拟网络设备,则每个设备都需要自己的网络后端。
该名称用于区分后端,即使只指定了一个后端,也必须使用该名称。
1.2 tap 设备
tap 网络后端使用主机中的 tap 网络设备。它提供了非常好的性能,并且可以配置为创建几乎任何类型的网络拓扑。
不幸的是,它需要在主机中配置该网络拓扑,这往往因您使用的作系统而异。一般来说,它还要求您具有 root 权限。
ini
-netdev tap,id=mynet0
3. 使用 virtio-net(半虚拟化)网络适配器,因为它具有最佳性能
对于现代客户(虚拟)机,应该使用 virtio-net(半虚拟化)网络适配器,因为它具有最佳性能,但它需要特殊的客户(虚拟)机驱动程序支持,这在非常旧的作系统上可能不可用。
使用选项 -device
将特定虚拟网络设备添加到虚拟机:
ini
-device TYPE,netdev=NAME
这里的 netdev
和上面定义的 -netdev
名字一致,从而让虚拟网络设备和网络后端相关联。
其他可选参数:
qemu-system-x86_64 -device help
可以查看所有可选列表
比如:
-device DEVNAME,netdev=NET-ID,mac=MACADDR,DEV-OPTS
DEVNAME
是设备(例如,i82559c
对于 Intel i82559C 以太网设备)NET_ID
是要连接设备的网络标识符(请参阅-netdev
的描述)MACADDR
是设备的 MAC 地址,DEV-OPTS
您可能希望传递的任何其他设备选项(例如bus=PCI-BUS,addr=DEVFN
,用于控制 PCI 设备地址),如果设备支持。
其他:
bash
-netdev user,id=n1 -device virtio-net-pci,netdev=n1
bash
-nic user,model=virtio-net-pci
最简单的方式
bash
-nic tap
bash
-nic tap,mac=02:ca:fe:f0:0d:01
2. 在 Linux 上设置 Tap
bash
# ip link add br0 type bridge
# ip tuntap add dev tap0 mode tap
# ip link set dev tap0 master br0 # set br0 as the target bridge for tap0
# ip link set dev eth0 master br0 # set br0 as the target bridge for eth0
# ip link set dev br0 up
参考: