qemu对于网络的虚拟化需要两个命令行参数来指定,其中一个用于指定网络的前端驱动,也就是客户机中的实现,另一个用于指定网络的后端实现,也就是在宿主机中的实现。
qemu支持两种方式来实现上面的功能,一种是旧版本上使用的,参数为 -net
配合 -net
,另一种是在新版本上支持的 -device
配合 -netdev
。qemu的发展趋势是倾向于用 -device
一种命令格式来虚拟出不同的设备,其中包括网卡设备。
使用如下命令来虚拟网络配置,前端:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vectors=v]
可以使用如下的命令来查询qemu支持的虚拟网卡类型:
qemu-system-x86_64 -net nic,model=?
此命令将打印qemu支持的虚拟网卡型号,然后通过指定model来在客户机中虚拟特定的网卡,比如对于virtio类型:
qemu-system-x86_64 -net nic,model=virtio
这里只虚拟了网卡,但是客户机中的操作系统中的网络依然无法工作,必须要对网络做了后端的配置,才能保证网络畅通。对于网络的后端配置,可以使用下面的参数来配置:
-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile][,helper=helper]
对于虚拟机网络的连接方式有多种,比如桥接,nat以及qemu内部实现的user网络。我们可以使用如下的命令来配置桥接网络,此参数配置的时宿主机中的网络。比如:
qemu-system-x86_64 -smp 2 -m 2048 -enable-kvm -net nic -net tap,ifname=tap0,script=no linux.img
再比如:
qemu-system-x86_64 -smp 2 -m 2048 -enable-kvm -net nic,model=virtio -net tap,ifname=tap0,script=no linux.img
需要注意的是,如果启动一个虚拟机时,没有指定网络参数,那么将会默认使用 user
网络,采用 -net nic -net user
作为默认参数,使用完全基于QEMU内部实现的用户模式下的网络协议栈来虚拟网络。
新版本的qemu当然也支持老的命令参数,不过qemu的趋势是更加统一的使用 -device
命令来对外设进行虚拟化。
使用新格式的参数配置网络设备前端:
-device virtio-net-pci,netdev=tap0
网络设备的后端参数如下:
-netdev tap,id=id[,fd=h][,ifname=name][,script=file][,downscript=dfile][,helper=helper]
举个实际例子,比如:
qemu-system-x86_64 -smp 2 -m 2048 -enable-kvm -device virtio-net-device,netdev=tap0 -netdev tap,id=tap0,ifname=tap0,script=no linux.increase.qcow2
再比如:
qemu-system-x86_64 -smp 2 -m 2048 -enable-kvm -device e1000,netdev=user0 -netdev user,id=user0 linux.increase.qcow2
sudo apt install bridge-utils
,并且创建虚拟的桥接网卡:brctl addbr virbr0 #创建
brctl show #查看
brctl addif virbr0 enp0s31f6 #绑定到物理网卡
ifconfig virbr0 up #使能虚拟的桥接网卡
现在我们宿主机中已经有了桥接网卡,那么接下来就要看如何让虚拟机来使用该网络,qemu使用tap网络来连接到宿主机上的该bridge网卡,然后在客户机中虚拟出不同类型的网卡。qemu启动时需要指定qemu与宿主机的网络连接方式为 tap0
,并且最后把 tap0
加入到虚拟网桥virbr0中:
sudo tunctl -u `whoami` -t tap0
brctl addif virbr0 tap0
最后使用如下的命令启动qemu虚拟机:
sudo qemu-system-x86_64 -smp 2 -m 2048 -enable-kvm -net nic -net tap,ifname=tap0,script=no linux.increase.qcow2
qemu默认实现了一个用户态的tcp/ip协议栈,用来模拟网络,这种方式配置上最为简单,不用过多配置宿主机的网络,但是缺点在于性能,和功能的完善度上不如桥接方式:
qemu-system-x86_64 -smp 2 -m 2048 -enable-kvm -net nic -net user linux.increase.qcow2
使用新版本的参数如下:
qemu-system-x86_64 -smp 2 -m 2048 -enable-kvm -device e1000,netdev=user0 -netdev user,id=user0 linux.increase.qcow2