15.4. 使用命令行将 PCI 设备附加到虚拟机


使用虚拟机(VM)时,您可以访问和控制附加到主机系统的 PCI 设备(如存储或网络控制器)。在这种情况下,主机系统会将设备的控制权传递给虚拟机。这也被称为 PCI 设备分配或 PCI 透传。

要使用附加到虚拟机(VM)中主机的 PCI 硬件设备,您可以从主机中分离该设备并将其分配给虚拟机。

先决条件

  • 如果您的主机使用 IBM Z 架构,则必须在主机上载入 vfio 内核模块。要验证,请使用以下命令:

    # lsmod | grep vfio
    Copy to Clipboard

    输出必须包含以下模块:

    • vfio_pci
    • vfio_pci_core
    • vfio_iommu_type1

流程

以下步骤描述了通用 PCI 设备分配。有关分配特定类型的 PCI 设备的步骤,请参阅以下步骤:

  • 将 SR-IOV 网络设备附加到虚拟机
  • 为虚拟机分配 GPU
  1. 获取您要使用的设备的 PCI 地址标识符。例如,如果要使用附加到主机的 NVME 磁盘,以下输出将其显示为设备 0000:65:00.0

    # lspci -nkD
    
    0000:00:00.0 0600: 8086:a708 (rev 01)
    	Subsystem: 17aa:230e
    	Kernel driver in use: igen6_edac
    	Kernel modules: igen6_edac
    0000:00:02.0 0300: 8086:a7a1 (rev 04)
    	Subsystem: 17aa:230e
    	Kernel driver in use: i915
    	Kernel modules: i915, xe
    0000:00:04.0 1180: 8086:a71d (rev 01)
    	Subsystem: 17aa:230e
    	Kernel driver in use: thermal_pci
    	Kernel modules: processor_thermal_device_pci
    0000:00:05.0 0604: 8086:a74d (rev 01)
    	Subsystem: 17aa:230e
    	Kernel driver in use: pcieport
    0000:00:07.0 0604: 8086:a76e (rev 01)
    	Subsystem: 17aa:230e
    	Kernel driver in use: pcieport
    0000:65:00.0 0108: 144d:a822 (rev 01)
        DeviceName: PCIe SSD in Slot 0 Bay 2
        Subsystem: 1028:1fd9
        Kernel driver in use: nvme
        Kernel modules: nvme
    0000:6a:00.0 0108: 1179:0110 (rev 01)
        DeviceName: PCIe SSD in Slot 11 Bay 2
        Subsystem: 1028:1ffb
        Kernel driver in use: nvme
        Kernel modules: nvme
    Copy to Clipboard
  2. 打开您要向其附加 PCI 设备的虚拟机的 XML 配置。

    # virsh edit vm-name
    Copy to Clipboard
  3. 将以下 <hostdev> 配置添加到 XML 文件的 <devices> 部分。

    address 行上的值替换为设备的 PCI 地址。另外,要更改虚拟机中使用的 PCI 地址,您可以在 < address type="pci "> 行中配置不同的地址。

    例如,如果主机上的设备地址为 0000:65:00.0,并且您希望它在客户机中使用 0000:02:00.0,请使用以下配置:

    <hostdev mode="subsystem" type="pci" managed="yes">
      <driver name="vfio"/>
       <source>
        <address domain="0x0000" bus="0x65" slot="0x00" function="0x0"/>
       </source>
       <address type="pci" domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
    </hostdev>
    Copy to Clipboard
  4. 可选:在 IBM Z 主机上,您可以修改客户端操作系统如何检测 PCI 设备。要做到这一点,将 < zpci> 子元素添加到 < address> 元素。在 <zpci> 行中,您可以调整 uidfid 值,这会修改客户机操作系统中设备的 PCI 地址和功能 ID。

    <hostdev mode="subsystem" type="pci" managed="yes">
      <driver name="vfio"/>
       <source>
        <address domain="0x0000" bus="0x65" slot="0x00" function="0x0"/>
       </source>
       <address type="pci" domain='0x0000' bus='0x02' slot='0x00' function='0x0'>
         <zpci uid="0x0008" fid="0x001807"/>
       </address>
    </hostdev>
    Copy to Clipboard

    在本例中:

    • uid="0x0008" 将虚拟机中设备的域 PCI 地址设置为 0008:00:00.0
    • fid="0x001807" 将设备的插槽值设置为 0x001807。因此,虚拟机的文件系统中的设备配置被保存到 /sys/bus/pci/slots/00001087/address 中。

      如果没有指定这些值,libvirt 会自动配置它们。

  5. 保存 XML 配置。
  6. 如果虚拟机正在运行,请将其关闭。

    # virsh shutdown vm-name
    Copy to Clipboard

验证

  1. 启动虚拟机,并登录到其客户机操作系统。
  2. 在客户端操作系统中,确认是否列出了 PCI 设备。

    例如,如果您将客户机设备地址配置为 0000:02:00.0,请使用以下命令:

    # lspci -nkD | grep 0000:02:00.0
    
    0000:02:00.0 8086:9a09 (rev 01)
    Copy to Clipboard
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat