无垠之码

深度剖析代码之道


qemu网络配置

0.Qemu虚拟机网络


Qemu虚拟机网络包含两部分:

  • 网络前端,提供给虚拟机的虚拟网卡部分
  • 网络后端,与虚拟网卡交互部分,实现数据包与宿主机通信
  1. the virtual network device that is provided to the guest, a PCI network card
  2. interacts with the emulated NIC, puts packets onto the host’s network

默认情况下,qemu将创建一个SLiRP网络后端,同时为虚拟机创建合适的网络前端。例如针对大多数x86虚拟机,qemu将创建e1000-pci网络前端。取消默认的网络配置,可以使用-nic none(使用-nodefaults也可以取消默认网络配置,但会影响其他设备的默认选项)。

注意,使用默认的SLiRP网络后端,ICMP协议不被支持,TCP/UDP没有影响。在SLiRP下不能使用ping测试网络联通性

通过命令行的指定的任何网络参数,Qemu要求同时提供足够的信息定义网络前端和后端。忘记指定网络前端或后端,Qemu在运行过程中会提示警告信息。例如,“Warning:netdev net0 has no peer”, “Warning: hub 0 is not connected to host network” “Warning: hub 0 with no nics” Qemu虚拟机将正常启动,但不能提供正常网络服务

1.Qemu虚拟机网卡


Qemu虚拟机支持板载和可插拔两种类型的网卡。

  • 板载网卡,板载网卡一般指主板自带的网络适配器(Onboard NIC basically means a Network interfaces controller built into the motherboard of a PC or a laptop, etc. You don’t have to insert or purchase it separately)。

  • 可插拔网卡,安装于可插拔总线上的网络适配器设备。qemu命令的device参数只能用于可插拔的网卡,nic参数支持非插拔的板载网络适配器(The -device option can only be used for pluggable NICs. The -nic option can be used to configure on-board non-pluggable NICs)。

其实如何选择合适的虚拟机网卡,取决于用户需要的客户端环境(模拟的硬件环境)。如果希望模拟特定的嵌入式设备,应该使用自带的虚拟网络设备。针对提供pci总线或其他可插拔的总线的设备,选择范围更加广泛。e1000是一些虚拟机的默认网络设备,更早类型的虚拟机可能是rtl8139。如果考虑性能因素,稍现代虚拟机可以使用半虚拟化的网络适配器提供更高的收发包性能。

一般情况使用qemu的-nic选项(qemu新特性)配置虚拟机网络:-nic TYPE,model=DEVNAME,nic参数统一配置网络前端和后端,简化qemu命令参数。效果与使用老式的语法-netdev TYPE,id=n1 -device DEVNAME,netdev=n1相同。

qemu-system-aarch64 -machine virt -nic model=?
Supported NIC models:
e1000  
e1000-82544gc  
e1000-82545em  
e1000e  
i82550  
i82551  
i82557a  
i82557b  
i82557c  
i82558a  
i82558b  
i82559a  
i82559b  
i82559c  
i82559er  
i82562  
i82801  
ne2k_pci  
pcnet  
pvrdma  
rocker  
rtl8139  
tulip  
virtio-net-pci  
virtio-net-pci-non-transitional  
virtio-net-pci-transitional  
vmxnet3

qemu-system-aarch64 -machine virt -device help
Network devices:
name "e1000", bus PCI, alias "e1000-82540em", desc "Intel Gigabit Ethernet"
name "e1000-82544gc", bus PCI, desc "Intel Gigabit Ethernet"
name "e1000-82545em", bus PCI, desc "Intel Gigabit Ethernet"
name "e1000e", bus PCI, desc "Intel 82574L GbE Controller"
name "i82550", bus PCI, desc "Intel i82550 Ethernet"
name "i82551", bus PCI, desc "Intel i82551 Ethernet"
name "i82557a", bus PCI, desc "Intel i82557A Ethernet"
name "i82557b", bus PCI, desc "Intel i82557B Ethernet"
name "i82557c", bus PCI, desc "Intel i82557C Ethernet"
name "i82558a", bus PCI, desc "Intel i82558A Ethernet"
name "i82558b", bus PCI, desc "Intel i82558B Ethernet"
name "i82559a", bus PCI, desc "Intel i82559A Ethernet"
name "i82559b", bus PCI, desc "Intel i82559B Ethernet"
name "i82559c", bus PCI, desc "Intel i82559C Ethernet"
name "i82559er", bus PCI, desc "Intel i82559ER Ethernet"
name "i82562", bus PCI, desc "Intel i82562 Ethernet"
name "i82801", bus PCI, desc "Intel i82801 Ethernet"
name "ne2k_pci", bus PCI
name "pcnet", bus PCI
name "pvrdma", bus PCI, desc "RDMA Device"
name "rocker", bus PCI, desc "Rocker Switch"
name "rtl8139", bus PCI
name "tulip", bus PCI
name "usb-bt-dongle", bus usb-bus
name "usb-net", bus usb-bus
name "virtio-net-device", bus virtio-bus
name "virtio-net-pci", bus PCI, alias "virtio-net"
name "virtio-net-pci-non-transitional", bus PCI
name "virtio-net-pci-transitional", bus PCI
name "vmxnet3", bus PCI, desc "VMWare Paravirtualized Ethernet v3"

2.Qemu网络后端


命令模式: -netdev TYPE,id=NAME,…

qemu使用netdev参数指定网络后端,type=user|tap|vde|socket…,id表示与网络后端相关联的前端设备名称。如果仅仅使用虚拟机上网,访问网页,SLiRP模式是不错的选择。但如果希望对外提供网络服务或让虚拟机接入网络,tap通常是最佳选择。

注意以下标题加粗小节,为qemu默认支持的网络后端,无需重新源码编译qemu程序,否则可能需要在编译时,查看编译选项开启相关特性。

User

-netdev user,id=net0,net=10.0.2.0/24,dhcpstart=10.0.2.15

User模式在Qemu内部使用slirp实现模拟TCP/IP栈,实现虚拟的NAT网络。SLiRP作为默认的网络后端,容易使用,不需要管理员权限。但是存在如下限制:

  • 调用开销大,性能存在问题
  • 通常不支持ICMP流量,ping命令失效
  • 宿主机或外部网络不能访问虚拟机
  • Linux宿主机需要root做一些初始化工作,才能正常使用ping命令

slirp_concept

SLiRP网络高级选项:

  • restrict选项将创建一个隔离的slrip网络环境,使用该选项虚拟机将不能访问网络和宿主机,-netdev user,id=net0,restrict=y
  • dns选项设置dns服务器地址,-netdev user,id=n0,dns=addr
  • 使用tftp选项使用qemu模拟的tftp服务器,-netdev user,id=n0,tftp=xxx,bootfile=yyy
  • 激活qemu内置smb服务器,-netdev user,id=n0,smb=dir,smbserver=addr
  • 宿主机与虚拟机端口映射,-netdev user,id=n0,hostfwd=protocol:hostip:hostport-guestip:guestport
sudo qemu-system-aarch64 -machine virt \
        -cpu max \
        -smp 4 \
        -m 2G \
        --nographic \
        -kernel ./image \
        -device virtio-net-device,netdev=eth0 \
        -netdev user,id=eth0,restrict=y \
        -hda ./rootfs.img \
        -append 'root=/dev/vda rw nokaslr'

Tap|Bridge

-netdev tap,id=net0
-netdev bridge,id=net0

注意: 无线网卡不能加入网桥, can’t add wlp2s0 to bridge br0: Operation not supported

tap模式与bridge模式基本相同,bridge命令简化tap网络配置。Tap网络后端使用宿主机tap网络接口。Tap后端提供了非常好的性能,并且可以创建几乎任何类型的网络拓扑。但通常Tap后端需要设置宿主机网络,并且因操作系统不同配置方法也存在差异,一般来说,需要root权限。

@startuml
!include <office/Devices/workstation>
!include <office/Devices/router>
!include <office/Servers/virtual_server>
!include <office/Servers/server_farm>

nwdiag {
    internet [shape = cloud];
    internet -- router;
    network LAN {  
        address = "192.168.225.x/24";
        router [address = "192.168.225.1" description = "<$router>\n  router"];  
        host [address = "192.168.225.67" description = "<$workstation>\n  host"];
    }
    host -- br0;
    br0 -- tap
    tap -- vs;
    vs [address = "192.168.225.87" description = "<$virtual_server>\n  vs"];
}
@enduml

slirp_concept

tap网络模式下,netdev网络后端的script属性可指定script脚本在qemu虚拟机启动时执行,默认为/etc/qemu-ifup,脚本中将ifname指定网卡up,将指定网卡加入默认(网桥)路由接口。downscript在虚拟机halt时执行,默认为/etc/qemu-ifdown。使用script=no,downscript=no关闭默认脚本。

可以使用特权账户启动qemu虚拟机,可也使用非特权用户运行qemu虚拟机。特权状态用户可以直接桥接相关网卡。非特权模式运行qemu虚拟机,使用helper参数配置接口桥接Tap,默认的桥接设备是br0。

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

sudo brctl addbr br0                     # 创建网桥设备br0 ip link add name br0 type bridge
sudo ip tuntap add dev tap0 mode tap     # 增加tuntap设备tap0
sudo brctl addif br0 usb0                # 将tuntap设备tap0加入网桥 ip link add set dev usb0 master br0等价
sudo brctl addif br0 tap0                # 将上网接口usb0加入网桥

sudo qemu-system-aarch64 -machine virt \
        -cpu max \
        -smp 4 \
        -m 2G \
        --nographic \
        -kernel ./image \
        -device virtio-net-device,netdev=eth0,mac=52:54:00:12:34:57 \
        -netdev tap,ifname=tap0,id=eth0,script=no,downscript=no \
        -hda ./rootfs.qcow2 \
        -append 'root=/dev/vda rw nokaslr'
# 非特权模式
sudo chmod u+s /usr/lib/qemu/qemu-bridge-helper
sudo brctl addbr br0
sudo mkdir -p /etc/qemu/ &&  echo "allow all" | sudo tee /etc/qemu/bridge.conf
qemu-system-aarch64 -machine virt \
        -cpu max \
        -smp 4 \
        -m 2G \
        --nographic \
        -kernel ./image \
        -device virtio-net-device,netdev=eth0,mac=52:54:00:12:34:57 \
        -netdev tap,id=eth0,br=br0,helper=/usr/lib/qemu/qemu-bridge-helper \
        -hda ./rootfs.qcow2 \
        -append 'root=/dev/vda rw nokaslr'

VDE

-netdev vde,id=net0

注意: ubuntu包管理工具提供的qemu默认不支持该特性,This option is only available if QEMU has been compiled with vde support enabled

Vde网络后端,允许虚拟机连接虚拟分布式以太网交换机。启动多个虚拟机,同时连接/tmp/switch发现虚拟机实例,所有qemu实例处于相同虚拟交换机下。

@startuml
!include <office/Devices/workstation>
!include <office/Devices/router>
!include <office/Servers/virtual_server>
!include <office/Servers/server_farm>

nwdiag {    
    internet [shape = cloud];
    internet -- router;
    network LAN {  
        address = "10.0.2.x/24";
        host [address = "10.0.2.15" description = "<$workstation>\n  host"];
        vs [address = "10.0.2.16" description = "<$virtual_server>\n  vs"];
        servers [address = "10.0.2.x" description = "<$server_farm>\n  servers"];
        dns [address = "10.0.2.3" description = "<$virtual_server>\n  dns"];
        router [address = "10.0.2.2" description = "<$router>\n  router"];
    }
}
@enduml

vde_concept

slirpvde创建一个vde网络的slirp实例,slirpvde实例连接交换机,如NAT/Masquerading路由器运行与vde网络中。默认情况slirpvde一个10.0.2.2的route,dns-server 10.0.2.3。

sudo apt-get install -y vde2 
vde_switch -F -sock /tmp/switch
slirpvde -s /tmp/switch --dhcp
qemu-system-aarch64 -machine virt \
        -cpu max \
        -smp 4 \
        -m 2G \
        --nographic \
        -kernel ./image \        
        -hda ./rootfs.img \
        -append 'root=/dev/vda rw nokaslr' \
        -device virtio-net-device,netdev=eth0  \ {>>使用mac=52:54:00:12:34:57参数指定不同的地址<<}
        -netdev vde,sock=/tmp/switch,id=eth0

Socket

-netdev socket,id=net0

socket网络后端,通常用来连接多个qemu实例,仿真一个共享网络,一般是以下三种使用场景:

  • 使用TCP连接qemu虚拟机
  • 连接位于不同宿主机的多Qemu实例,共享总线(UDP协议)
  • Uml实例通信
  1. TCP端对端通信

This host network backend can be used to connect the guest’s network to another QEMU virtual machine using a TCP socket connection

# 服务端
sudo qemu-system-aarch64 \
        -machine virt \
        -cpu max \
        -smp 4 \
        -m 2G \
        --nographic \
        -kernel ./image \
        -hda ./rootfs.img \
        -append 'root=/dev/vda rw nokaslr' \
        -device virtio-net-device,netdev=eth0,mac=52:54:00:12:34:57 \
        -netdev socket,id=eth0,listen=:1234
sudo ifconfig eth0 192.168.200.1 netmask 255.255.255.0
# 客户端
sudo qemu-system-aarch64 \
        -machine virt \
        -cpu max \
        -smp 4 \
        -m 2G \
        --nographic \
        -kernel ./image \
        -hda ./rootfs.img \
        -append 'root=/dev/vda rw nokaslr' \
        -device virtio-net-device,netdev=eth0,mac=52:54:00:12:34:58 \
        -netdev socket,id=eth0,connect=127.0.0.1:1234
sudo ifconfig eth0 192.168.200.2 netmask 255.255.255.0
  1. 总线共享

通常情况下,该方案仅适合局域网不同主机使用,因为大部分路由器不支持组播报文转发。There are some techniques to work around this (DVMRP, MOSPF and others) but they all require that you can configure all the routers between your server and the clients (or create a tunnel). There are backbone networks (Abilene, Mbone) with multicast support, but those are of most interest for universities and such. The normal consumer’s internet does not have multicast.

sudo qemu-system-aarch64 \
        -machine virt \
        -cpu max \
        -smp 4 \
        -m 2G \
        --nographic \
        -kernel ./image \
        -hda ./rootfs.img \
        -append 'root=/dev/vda rw nokaslr' \
        -device virtio-net-device,netdev=eth0,mac=52:54:00:12:34:57 \
        -netdev socket,id=eth0,mcast=230.0.0.1:1234
sudo ifconfig eth0 192.168.200.1 netmask 255.255.255.0
sudo qemu-system-aarch64 \
        -machine virt \
        -cpu max \
        -smp 4 \
        -m 2G \
        --nographic \
        -kernel ./image \
        -hda ./rootfs.img \
        -append 'root=/dev/vda rw nokaslr' \
        -device virtio-net-device,netdev=eth0,mac=52:54:00:12:34:58 \
        -netdev socket,id=eth0,mcast=230.0.0.1:1234
sudo ifconfig eth0 192.168.200.2 netmask 255.255.255.0
sudo qemu-system-aarch64 \
        -machine virt \
        -cpu max \
        -smp 4 \
        -m 2G \
        --nographic \
        -kernel ./image \
        -hda ./rootfs.img \
        -append 'root=/dev/vda rw nokaslr' \
        -device virtio-net-device,netdev=eth0,mac=52:54:00:12:34:59 \
        -netdev socket,id=eth0,mcast=230.0.0.1:1234
sudo ifconfig eth0 192.168.200.3 netmask 255.255.255.0
  1. Uml实例通信
sudo qemu-system-aarch64 \
        -machine virt \
        -cpu max \
        -smp 4 \
        -m 2G \
        --nographic \
        -kernel ./image \
        -hda ./rootfs.img \
        -append 'root=/dev/vda rw nokaslr' \
        -device virtio-net-device,netdev=eth0,mac=52:54:00:12:34:57 \
        -netdev socket,id=eth0,mcast=230.0.0.1:1234
sudo ifconfig eth0 192.168.200.1 netmask 255.255.255.0
sudo ./linux ubda=rootfs.img umid=debian mem=512M eth0=mcast,52:54:00:12:34:58,230.0.0.1,1234
sudo ifconfig eth0 192.168.200.2 netmask 255.255.255.0

L2tpv3

-netdev l2tpv3,id=id,src=srcaddr,dst=dstaddr

二层隧道技术第三版,可以透传多种二层报文(如PPP、Ethernet、HDLC、ATM等),运用于用户侧的二层接入链路在分组交换网络中透明传递。l2tpv3网络后端使得虚拟机可以直接与其他虚拟机,路由器,防火墙通信。

Hubport

-netdev hubport,id=id,hubid=hubid[,netdev=nd]

它允许将虚拟机的网络接口连接到Qemu模拟的Hub集线器上,而不是直接连接到单个网络设备。这可以用于构建更复杂的虚拟网络拓扑。

# 示例:两个虚拟机通过同一个 Hub(hubid=1)互联
qemu-system-x86_64 \
    -netdev hubport,id=port1,hubid=1 \          # 虚拟机1连接到 Hub
    -device e1000,netdev=port1

qemu-system-x86_64 \
    -netdev hubport,id=port2,hubid=1 \          # 虚拟机2连接到同一个 Hub
    -device virtio-net-pci,netdev=port2

扩展知识:

提到QEMU的网络配置,I/O虚拟化技术无疑是绕不开的话题。作为虚拟机实现高性能、高兼容性网络通信的核心支撑,I/O虚拟化贯穿了从设备模型选择、驱动适配到数据路径优化的整个技术体系。在虚拟化环境中,网络性能常常成为系统瓶颈,而I/O虚拟化技术的演进,正是围绕如何在性能与通用性之间取得平衡不断推进的。QEMU作为虚拟化平台的用户态核心,其网络配置实际是对底层I/O虚拟化能力的直接体现与利用。不同的网络配置模式(如emulated device、virtio、vhost-net、vhost-user、vhost-vDPA 等)背后,分别对应着I/O虚拟化的不同阶段和实现方式。

image

近年来,随着云计算、网络功能虚拟化(NFV)以及边缘计算的快速发展,对构建高性能、可扩展的现代虚拟化平台的需求日益迫切。作为虚拟化性能的关键瓶颈之一,I/O虚拟化技术也在不断演进与革新,以满足对高吞吐、低延迟、灵活部署等方面的严苛要求。

阶段1: 2008年前,业界一直使用I/O全虚拟化,通过纯软件的形式来模拟虚拟机的I/O请求

  • 虚拟机Guest OS中的驱动,比如e1000网卡驱动,执行了写操作(比如向某个寄存器写入数据,或者提交了数据包到网卡发送队列)。
  • I/O操作通常对应的是访问某个I/O寄存器或者MMIO 空间。在虚拟机环境中,这些访问会导致VM-exit(虚拟机陷出到宿主机),由素主机内核中的kvm模块截获
  • KVM内核模块发现有I/O请求要处理,但它本身不负责模拟设备行为,所以它会通过事件机制如eventfd、ioctl通知用户空间的QEMU进程
  • QEMU用户态进程维护着一套虚拟设备模型,比如emulated e1000、rtl8139 网卡、IDE 控制器等
  • QEMU完成模拟之后,通过KVM的接口返回结果比如数据写入完成、状态寄存器更新,然后恢复虚拟机继续运行

在纯软件I/O虚拟化模式下,Guest发起的I/O指令会被KVM拦截,并交由用户态的QEMU进行模拟处理,整个I/O完全由软件完成,虽然通用性高但性能较差,首先每一次I/O操作都要VM-exit → KVM → QEMU → 模拟处理 → 再回 VM,开销非常大。其次频繁切换用户态/内核态,增加CPU消耗。性能差、延迟高、吞吐低,不适合高性能应用 ba sh 阶段2: 2008年后,virtio的半虚拟化技术,通过共享内存和简化的抽象接口,在Guest和Host之间建立高效的数据交换机制

virtio主要由三部分组成:

  • 专用的网络前端驱动驻留在GuestOS中,如virtio-net,virtio-blk,virtio-scsi,virtio-console
  • 驻留在宿主机,负责处理I/O请求的相关驱动,vhost-net内核模块,vhost-user(DPDK等用户态后端),vhost-vDPA硬件抽象后端等
  • Virtqueue环形队列,核心的数据结构,由前后端共享内存组成,用来传递I/O请求和响应

其中Virtqueue主要包括描述符表,存储I/O请求的元数据(数据地址、长度、方向等),每个描述符指向Guest内存中的一个缓冲区,可用环由Guest维护,记录待处理的请求描述符索引,已用环由Host维护,记录已完成的请求描述符索引和处理结果

Guest内核的网络协议栈生成待发送的数据包如TCP/IP报文,virtio-net前端驱动将数据包拆分为一个或多个缓冲区例如:报文头 + 载荷,并填充到描述符表中。Guest将描述符索引写入可用环(Available Ring),并更新avail_idx指针,Guest通过PCI配置空间或MMIO通知Host触发虚拟中断或I/O 端口写入,Host的后端驱动如vhost-net内核模块检测到通知,从可用环读取avail_idx,获取待处理的描述符索引,根据描述符定位Guest内存中的数据缓冲区,直接通过DMA读取数据,Host将数据包发送到物理网络(如通过宿主机网卡或虚拟交换机),Host将已处理的描述符索引写入已用环Used Ring,并更新used_idx,Host向Guest发送中断或使用中断抑制机制优化性能,Guest的virtio-net驱动检查已用环,释放已完成的缓冲区内存

阶段3: 2014年前后,vfio的设备直通,允许虚拟机直接访问物理设备,避免数据包两次进入内核协议栈

  • 宿主机设备绑定vfio驱动,echo vfio-pci > /sys/bus/pci/devices/0000:3b:00.0/driver_override
  • QEMU启动VM并注册VFIO设备,-device vfio-pci,host=0000:3b:00.0
  • 网卡收到一个数据包,通过DMA把数据写入到VM的内存

物理网卡通过NIC的RX队列接收到数据包,触发DMA操作,由于设备已直通给VM,网卡的DMA目标地址是虚拟机的物理内存区域,网卡的DMA请求经过IOMMU,IOMMU根据虚拟机配置的I/O页表(由VFIO设置)将DMA地址转换为虚拟机物理地址GPA,IOMMU确保DMA仅访问虚拟机被分配的内存区域,数据包通过 DMA直接写入虚拟机的接收缓冲区,虚拟机的网卡驱动如igb/ixgbe检测到RX环有新数据包,通过MMIO读取网卡寄存器,确认DMA完成,从RX环中提取数据包,提交给虚拟机内核协议栈,虚拟机内核像处理物理机数据包一样,完成网络协议处理TCP/IP等

阶段4: 2018年左右,vDPA技术成熟,其融合virtio的标准化接口和VFIO的硬件直通能力,规范、灵活、系统级地实现I/O虚拟化

尽管vhost-user绕过内核协议栈,利用DMA、hugepage等技术可以实现高性能,高吞吐、低延迟的I/O虚拟化,但其无法支持热迁移,缺乏统一的设备抽象与管理接口(每个vhost-user后端实现不一样,没有标准的/dev接口,也难以统一挂到libvirt/kubevirt),并且无法直接绑定网卡VF的DMA。虽然可以配合DPDK绑定VF,但是DPDK要自己维护VF的隔离、IOMMU、安全策略,非常复杂,没有像VFIO一样统一的框架。

  • 架构上抽象,统一virtio与硬件加速设备的适配层
  • 功能上抽象,设备能力虚拟化与隔离机制的标准化
  • 接口上抽象,标准Linux设备管理接口/dev/vhost-vdpaX
       Guest VM
     +-----------+
     | virtio-net|  ← 标准接口
     +-----------+
          |
   +---------------+
   | vDPA Framework|  ← 抽象层(统一 virtio 和后端设备)
   +---------------+
      /        \
+--------+   +----------+
| SW vDPA|   | HW vDPA  | ← 软件或硬件后端(如mlx5、dpdk-vdpa等)
+--------+   +----------+
    |             |
vhost-net     VF+DMA/IOMMU

Vhost-user

-netdev vhost-user,chardev=id[,vhostforce=on|off][,queues=n]

sudo qemu-system-aarch64 -machine virt \
        -cpu max \
        -smp 4 \
        -m 2G \
        --nographic \
        -kernel ./image \
        -hda ./rootfs.qcow2 -append 'root=/dev/vda rw nokaslr' \
        -chardev socket,id=chr0,path=/tmp/aarch64.sock \
        -device virtio-net-device,netdev=eth0,mac=52:54:00:12:34:57 \
        -netdev vhost-user,id=eth0,chardev=chr0 

Vhost-vdpa

-netdev vhost-vdpa,vhostdev=/path/to/dev

vhost-vdpa是QEMU中一种高性能网络设备类型,它利用virtio数据路径与供应商特定的控制路径相结合的技术,为虚拟机提供接近物理设备性能的网络连接

qemu-system-x86_64 \
    -netdev vhost-vdpa,id=net0,vhostdev=/dev/vhost-vdpa0 \
    -device virtio-net-pci,netdev=net0

3.参考文献

  1. Documentation/Networking
  2. Slirp_the_PPP/SLIP_on_terminal_emulator
  3. 无线网卡桥接.md
  4. vhost:一种 virtio 高性能的后端驱动实现
  5. virtio与vhost-net 架构
comments powered by Disqus