16.2.4. 从 SR-IOV 虚拟功能池设置 PCI 设备分配
将特定虚拟功能(VF)的 PCI 地址硬编码到客户机配置中有两个严重的限制:
- 任何虚拟机启动后,指定的 VF 都必须可用。因此,管理员必须将每个 VF 永久分配给一个客户机虚拟机(或者修改每个客户机虚拟机的配置文件,以便在每次启动客户机虚拟机时都指定目前未使用的 VF 的 PCI 地址)。
- 如果 guest 虚拟机移动到另一台主机物理计算机,则该主机物理计算机必须在 PCI 总线上的同一位置拥有完全相同的硬件(或者启动之前必须修改客户机虚拟机配置)。
通过在包含 SR-IOV 设备的所有 VF 的设备池创建一个 libvirt 网络,从而避免这两个问题。完成后,配置 guest 虚拟机以引用此网络。每次启动客户机时,都会从池中分配单个 VF,并分配给客户机虚拟机。当客户机虚拟机停止后,VF 将返回到池,供其他客户机虚拟机使用。
过程 16.10. 创建设备池
关闭客户端虚拟机
使用 virsh shutdown 命令,关闭名为 guestVM 的客户机虚拟机。# virsh shutdown guestVM
创建配置文件
使用首选的编辑器,在/tmp
目录中创建一个 XML 文件(名为 passthrough.xml )。确保将pf dev='eth3'
替换为您自己的 SR-IOV 设备物理功能(PF)的 netdev 名称。以下是一个示例网络定义,该定义将在主机物理机器上使用 PF(在主机物理机器上使用 PF)提供 SR-IOV 适配器的所有 VF 池:图 16.12. 网络定义域 XML 示例
<network> <name>passthrough</name> <!-- This is the name of the file you created --> <forward mode='hostdev' managed='yes'> <pf dev='myNetDevName'/> <!-- Use the netdev name of your SR-IOV devices PF here --> </forward> </network>
加载新 XML 文件
输入以下命令,将 /tmp/passthrough.xml 替换为您在上一步中创建的 XML 文件的名称和位置:# virsh net-define /tmp/passthrough.xml
重启客户端
运行以下命令,将 passthrough.xml 替换为您在上一步中创建的 XML 文件的名称:# virsh net-autostart passthrough # virsh net-start passthrough
重新启动 guest 虚拟机
运行 virsh start 命令以在第一步中重启您关闭的客户机虚拟机(例如,使用 guestVM 作为客户机虚拟机的域名)。如需更多信息,请参阅 第 20.6 节 “启动、恢复和恢复虚拟机”。# virsh start guestVM
启动设备的透传
虽然只会显示单一设备,但在客户机虚拟机首次启动时,libvirt 将自动获得与该 PF 关联的所有 VF 列表,如下所示:图 16.13. 接口网络定义的域 XML 示例
<interface type='network'> <source network='passthrough'> </interface>
验证
在启动使用网络的第一个客户机后,您可以运行 virsh net-dumpxml passthrough 命令进行验证 ; 您可能会得到类似如下的输出:图 16.14. XML 转储文件 透传 内容
<network connections='1'> <name>passthrough</name> <uuid>a6b49429-d353-d7ad-3185-4451cc786437</uuid> <forward mode='hostdev' managed='yes'> <pf dev='eth3'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x1'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x3'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x5'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x7'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x1'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x3'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x5'/> </forward> </network>