SR-IOV全称为Single Root I/O Virtualization,是一种基于硬件的虚拟化解决方案,可提高设备利用率,其功能实现最早在Linux系统中。SR-IOV标准允许在虚拟机之间共享PCI-E设备,并且它是在硬件中实现的,虚拟设备可以获得与透传方式相当的I/O性能。
SR-IOV中引入了物理功能(Physical Function)与虚拟功能(Virtual Function)两个概念,其中物理功能是指物理设备拥有可配置的完整资源,虚拟功能则使得虚拟设备能够共享一部分物理资源以提供给虚拟机使用。启用了SR-IOV并且具有适当的硬件和设备驱动支持的PCI-E设备在系统中可显示为多个独立的虚拟设备,每个都拥有自己的I/O空间。目前使用最多的SR-IOV设备是万兆网卡,主要厂商有Intel、QLogic等。
笔者将以支持SR-IOV功能的Intel 82599网卡为例介绍SR-IOV的完整使用过程,其中会涉及QEMU的vfio-pci透传设备模型以及设备IOMMU。
首先,我们需要修改主机启动引导参数以开启intel-iommu。此处读者可能会将inteliommu与iommu混淆,前者控制的是基于Intel VT-d的IOMMU,它可以使系统进行设备的DMA地址重映射(DMAR)等多种高级操作为虚拟机使用做准备,且此项默认关闭,而后者主要控制的是GART(Graphics Address Remapping Table)IOMMU,目的是让有32位内存访问大小的设备可以进行DMAR操作,通常用于USB设备、声卡、集成显卡等,会在主机内存3GB以上的系统中默认开启。
然后重新加载网卡驱动模块,并设置模块中的最大VF数以使得设备虚拟出一定数量的网卡。不同厂商的网卡的驱动模块不同,其打开虚拟功能的参数也不同。另外,部分设备由于厂商策略原因,Linux内核自带的驱动不一定拥有VF相关设置,需要从官网单独下载并替换原有驱动。(www.xing528.com)
虚拟网卡被主机发现以后,我们需要额外加载vfio-pci以及vfio-iommu-type1两个模块,然后将虚拟网卡与原驱动解绑并重新绑定至vfio-pci驱动。其中vfio-pci驱动是专门为现在支持DMAR和中断地址重映射的PCI设备开发的驱动模块,它依赖于VFIO驱动框架,并且借助于vfio-iommu-type1模块实现IOMMU的重用。
然后我们即可在虚拟机中使用这些虚拟网卡,需要在QEMU命令行中添加设备选项,形似“-device vfio-pci,host=04:10.0,id=hostdev0,bus=pci.0,multifunction=on,addr=0x9”,对应的libvirt定义如下。
如果使用vfio-pci透传PCI-E设备,需要使用QEMU机器模型Q35,并添加相应的PCI-E总线参数,除此之外,设备驱动的解绑与绑定操作可以简化为如下所示的脚本操作。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。