网络虚拟化

qemu对于网络的虚拟化需要两个命令行参数来指定,其中一个用于指定网络的前端驱动,也就是客户机中的实现,另一个用于指定网络的后端实现,也就是在宿主机中的实现。

命令行参数

qemu支持两种方式来实现上面的功能,一种是旧版本上使用的,参数为 -net 配合 -net ,另一种是在新版本上支持的 -device 配合 -netdev 。qemu的发展趋势是倾向于用 -device 一种命令格式来虚拟出不同的设备,其中包括网卡设备。

  • 对于旧版本的qemu来说

使用如下命令来虚拟网络配置,前端:

-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当然也支持老的命令参数,不过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 user网络

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

网络性能提升

  • virtio是属于半虚拟化驱动,它极大的提升了虚拟机的性能,主要是在客户机中需要载入设备的前端驱动,通过前端驱动和后端交互上的优化来实现性能的提升。网络虚拟化的前端是virtio-net driver,网络虚拟化的后端依然是qemu。
  • 对于后端的实现来说,都是有qemu来实现的,默认都是在应用层来实现,那么这样实际上还是不够完美,qemu支持了后端的驱动,把后端实现放到kernel层来实现,vhost-net驱动来作为后端,这进一步优化了网络性能
  • 另一种后端实现为vhost-user,它进一步增加了对于dpdk和open vswitch的支持,这样进一步优化网络性能。

你可能感兴趣的:(虚拟化,网络虚拟化,虚拟化,网络,qemu,virtio)