Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

16.2.4. 从 SR-IOV 虚拟功能池设置 PCI 设备分配

将特定虚拟功能(VF)的 PCI 地址硬编码到客户机配置中有两个严重的限制:
  • 任何虚拟机启动后,指定的 VF 都必须可用。因此,管理员必须将每个 VF 永久分配给一个客户机虚拟机(或者修改每个客户机虚拟机的配置文件,以便在每次启动客户机虚拟机时都指定目前未使用的 VF 的 PCI 地址)。
  • 如果 guest 虚拟机移动到另一台主机物理计算机,则该主机物理计算机必须在 PCI 总线上的同一位置拥有完全相同的硬件(或者启动之前必须修改客户机虚拟机配置)。
通过在包含 SR-IOV 设备的所有 VF 的设备池创建一个 libvirt 网络,从而避免这两个问题。完成后,配置 guest 虚拟机以引用此网络。每次启动客户机时,都会从池中分配单个 VF,并分配给客户机虚拟机。当客户机虚拟机停止后,VF 将返回到池,供其他客户机虚拟机使用。

过程 16.10. 创建设备池

  1. 关闭客户端虚拟机

    使用 virsh shutdown 命令,关闭名为 guestVM 的客户机虚拟机
    # virsh shutdown guestVM
  2. 创建配置文件

    使用首选的编辑器,在 /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>
          
    
    
  3. 加载新 XML 文件

    输入以下命令,将 /tmp/passthrough.xml 替换为您在上一步中创建的 XML 文件的名称和位置:
    # virsh net-define /tmp/passthrough.xml
  4. 重启客户端

    运行以下命令,将 passthrough.xml 替换为您在上一步中创建的 XML 文件的名称:
     # virsh net-autostart passthrough # virsh net-start passthrough 
  5. 重新启动 guest 虚拟机

    运行 virsh start 命令以在第一步中重启您关闭的客户机虚拟机(例如,使用 guestVM 作为客户机虚拟机的域名)。如需更多信息,请参阅 第 20.6 节 “启动、恢复和恢复虚拟机”
     # virsh start guestVM 
  6. 启动设备的透传

    虽然只会显示单一设备,但在客户机虚拟机首次启动时,libvirt 将自动获得与该 PF 关联的所有 VF 列表,如下所示:

    图 16.13. 接口网络定义的域 XML 示例

             
    <interface type='network'>
       <source network='passthrough'>
    </interface>
          
    
    
  7. 验证

    在启动使用网络的第一个客户机后,您可以运行 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>