16.2.2. 使用 SR-IOV
本节介绍了使用 PCI 透传将支持 SR-IOV 的虚拟功能(multiport 网卡)为虚拟机为虚拟机分配为网络设备。
通过添加带有 virsh edit 或 virsh attach-device 命令的
<hostdev> 中的设备条目,可将 SR-IOV 虚拟功能(VF)分配给虚拟机。但是,这个问题可能会有问题,因为与常规网络设备不同,SR-IOV VF 网络设备没有永久唯一的 MAC 地址,每次主机重启时都会分配一个新的 MAC 地址。因此,即使客户端重启后分配了相同的 VF,当主机重启时,客户机确定其网络适配器具有新的 MAC 地址。因此,客户机在每次都连接了新硬件,通常需要对客户机的网络设置进行重新配置。
libvirt 包含
<interface type='hostdev'> 接口设备。通过使用此接口设备,libvirt 将首先执行指示的任何网络特定硬件/交换机初始化(如设置 MAC 地址、VLAN 标签或 802.1Qbh 虚拟端口参数),然后对客户机执行 PCI 设备分配。
使用
<interface type='hostdev'> 接口设备需要:
- 支持 SR-IOV 的网卡,
- 支持 Intel VT-d 或 AMD IOMMU 扩展的主机硬件
- 要分配的 VF 的 PCI 地址。
重要
将 SR-IOV 设备分配给虚拟机需要主机硬件支持 Intel VT-d 或 AMD IOMMU 规格。
要在 Intel 或 AMD 系统中附加 SR-IOV 网络设备,请按照以下步骤执行:
过程 16.8. 在 Intel 或 AMD 系统中附加 SR-IOV 网络设备
在 BIOS 和内核中启用 Intel VT-d 或者 AMD IOMMU 规格
在 Intel 系统中,在 BIOS 中启用 Intel VT-d(如果尚未启用)。请参阅 过程 16.1, “为 PCI 设备分配准备 Intel 系统” 在 BIOS 和内核中启用 Intel VT-d 中的程序帮助。如果 Intel VT-d 已经启用并正常工作,请跳过这一步。在 AMD 系统中,在 BIOS 中启用 AMD IOMMU 规格(如果尚未启用)。请参阅 过程 16.2, “为 PCI 设备分配准备 AMD 系统” 有关在 BIOS 中启用 IOMMU 的过程帮助。验证支持
验证是否检测到具有 SR-IOV 功能的 PCI 设备。这个示例列出了支持 SR-IOV 的 Intel 82576 网络接口卡。使用 lspci 命令验证该设备是否已检测到。lspci
# lspci 03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,输出已被修改来删除所有其它设备。激活虚拟功能
运行以下命令:echo ${num_vfs} > /sys/class/net/enp14s0f0/device/sriov_numvfs# echo ${num_vfs} > /sys/class/net/enp14s0f0/device/sriov_numvfsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使虚拟功能持久
要使虚拟功能在重新引导时持久保留,请使用您选择的编辑器创建类似如下的 udev 规则,其中指定 VF 的预期数量(本例中为 2),最多使用网络接口卡支持的限制。在以下示例中,将 enp14s0f0 替换为 PF 网络设备名称,并调整ENV{ID_NET_DRIVER}值以匹配正在使用的驱动程序:vim /etc/udev/rules.d/enp14s0f0.rules
# vim /etc/udev/rules.d/enp14s0f0.rulesCopy to Clipboard Copied! Toggle word wrap Toggle overflow ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ATTR{device/sriov_numvfs}="2"ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ATTR{device/sriov_numvfs}="2"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这将确保在引导时启用该功能。检查新的虚拟功能
使用 lspci 命令,列出附加到 Intel 82576 网络设备的新增虚拟功能。(此外,使用 grep 搜索虚拟功能,以搜索支持虚拟功能的设备。)Copy to Clipboard Copied! Toggle word wrap Toggle overflow PCI 设备标识符通过 lspci 命令的-n参数找到。物理功能与0b:00.0和0b:00.1对应。所有虚拟功能在描述中包含虚拟功能。使用 virsh 验证设备是否存在
libvirt服务必须在向虚拟机中添加设备前识别该设备。libvirt使用与lspci 输出类似的标记。lspci 输出的所有标点字符 : 和 . 均更改为下划线(_)。使用 virsh nodedev-list 命令和 grep 命令从可用主机设备列表中过滤 Intel 82576 网络设备。0b是本例中 Intel 82576 网络设备的过滤器。这可能会因您的系统而异,并可能导致额外的设备。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 虚拟功能和物理功能的 PCI 地址应该位于列表中。使用 virsh 获取设备详情
pci_0000_0b_00_0是物理功能之一,pci_0000_0b_10_0是物理功能第一个对应的虚拟功能。使用 virsh nodedev-dumpxml 命令获取这两个设备的详情。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 本例将虚拟功能pci_0000_03_10_2添加到第 8 步的虚拟机。请注意虚拟功能的bus、插槽和功能参数:这些是添加该设备所必需的。将这些参数复制到临时 XML 文件中,例如/tmp/new-interface.xml。<interface type='hostdev' managed='yes'> <source> <address type='pci' domain='0x0000' bus='0x03' slot='0x10' function='0x2'/> </source> </interface><interface type='hostdev' managed='yes'> <source> <address type='pci' domain='0x0000' bus='0x03' slot='0x10' function='0x2'/> </source> </interface>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意当虚拟机启动时,它应该会看到物理适配器提供的类型的网络设备,并配置了 MAC 地址。此 MAC 地址将在主机间保持不变,并且 guest 重新启动。以下<interface>示例显示可选<mac address>、<virtualport>和<vlan>元素的语法。在实践中,使用<vlan>或<virtualport>元素,不能同时使用这两个元素,如示例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您没有指定 MAC 地址,则会自动生成一个地址。<virtualport>元素仅在连接到 802.11Qbh 硬件交换机时使用。<vlan>元素将透明地将客户机的设备放在标记42的 VLAN 上。将虚拟功能添加到虚拟机
通过以下命令,将虚拟功能添加到虚拟机,以及上一步中创建的临时文件。这会立即附加新设备,并保存它以便在以后的客户机重启。virsh attach-device MyGuest /tmp/new-interface.xml --live --config
virsh attach-device MyGuest /tmp/new-interface.xml --live --configCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 virsh attach-device 指定--live选项,将新设备附加到运行的客户机中。使用--config选项可确保新设备在以后的客户机重启后可用。注意只有在客户机运行时接受--live选项。如果在非运行的客户机中使用--live选项,则 virsh 将返回错误。
虚拟机检测到一个新的网卡。这个新卡是 SR-IOV 设备的虚拟功能。