14.7. 在虚拟机中管理 PCI 设备


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

14.7.1. 将 PCI 设备附加到虚拟机

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

先决条件

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

    # lsmod | grep vfio
    Copy to Clipboard Toggle word wrap

    输出必须包含以下模块:

    • vfio_pci
    • vfio_pci_core
    • vfio_iommu_type1
流程

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

  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: proc_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 Toggle word wrap
  2. 打开您要将 PCI 设备附加到的虚拟机的 XML 配置。

    # virsh edit vm-name
    Copy to Clipboard Toggle word wrap
  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 Toggle word wrap
  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 Toggle word wrap

    在本例中:

    • 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 Toggle word wrap

验证

  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 Toggle word wrap

14.7.2. 使用 web 控制台将设备附加到虚拟机

要为虚拟机添加特定的功能,您可以使用 web 控制台将主机设备附加到虚拟机。

注意

不能同时附加多个主机设备。一次只能附加一个设备。

如需更多信息,请参阅 RHEL 9 已知问题。

先决条件

  • 您已安装了 RHEL 9 web 控制台。
  • 您已启用了 cockpit 服务。
  • 您的用户帐户被允许登录到 web 控制台。

    具体步骤请参阅安装并启用 Web 控制台

  • 如果要附加 PCI 设备,请确保 hostdev 元素的 managed 属性的状态被设为 yes

    注意

    将 PCI 设备附加到虚拟机时,请不要省略 hostdev 元素的 managed 属性,或者将其设为 no。如果您这样做了,当把 PCI 设备传给虚拟机时,会无法自动将 PCI 设备与主机分离。当您关闭虚拟机时,也不能自动将它们重新附加到主机上。

    因此,主机可能会变得无响应,或者意外关闭。

    您可以在虚拟机的 XML 配置中找到 managed 属性的状态。以下示例打开 example-VM-1 虚拟机的 XML 配置。

    # virsh edit example-VM-1
    Copy to Clipboard Toggle word wrap
  • 备份虚拟机中的重要数据。
  • 可选:备份虚拟机的 XML 配置。例如,要备份 example-VM-1 虚拟机:

    # virsh dumpxml example-VM-1 > example-VM-1.xml
    Copy to Clipboard Toggle word wrap
  • Web 控制台 VM 插件已安装在您的系统上

流程

  1. 登录到 RHEL 9 web 控制台。

    详情请参阅 登录到 web 控制台

  2. Virtual Machines 接口中,点击您要给其附加主机设备的虚拟机。

    这会打开一个新页面,其中包含有关所选虚拟机基本信息的 概述,以及访问虚拟机图形界面的 控制台 部分。

  3. 滚动到 Host devices

    主机设备 部分显示有关附加到虚拟机的设备的信息,以及 A添加删除 设备的选项。

  4. 点击 Add host device

    此时会出现 Add host device 对话框。

  5. 选择您要附加到虚拟机的设备。
  6. 添加

    所选设备被附加到虚拟机。

验证

  • 运行虚拟机并检查该设备是否出现在 Host devices 部分中。

14.7.3. 使用命令行从虚拟机中删除 PCI 设备

要从虚拟机(VM)中删除 PCI 设备,请从虚拟机的 XML 配置中删除设备信息。

流程

  1. 在附加 PCI 设备的虚拟机的 XML 配置中,使用设备的设置在 < hostdev&gt ; 部分找到 < address domain > 行。

    # virsh dumpxml <VM-name>
    
    [...]
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <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 Toggle word wrap
  2. 使用 virsh detach-device 命令及 the-- hostdev 选项和设备地址。

    例如,以下命令会永久删除上一步中的设备。

    # virt detach-device <VM-name> --hostdev 0000:65:00.0 --config
    Domain 'VM-name' defined successfully.
    Copy to Clipboard Toggle word wrap
    注意

    要从正在运行的虚拟机中删除 PCI 设备,请在上一个命令中添加 - live 参数。

  3. 可选:将 PCI 设备重新附加到主机。例如,以下命令重新附加从上一步中虚拟机中删除的设备:

    # virsh nodedev-reattach pci_0000_65_00_0
    Device pci_0000_65_00_0 re-attached
    Copy to Clipboard Toggle word wrap

验证

  1. 再次显示虚拟机的 XML 配置,检查设备的 < hostdev& gt; 部分是否不再显示。

    # virsh dumpxml <VM-name>
    Copy to Clipboard Toggle word wrap

14.7.4. 使用 web 控制台从虚拟机中删除设备

要释放资源,修改虚拟机的功能或两个都做,您可以使用 Web 控制台来修改虚拟机,并删除不再需要的主机设备。

警告

使用 Web 控制台删除附加的 USB 主机设备可能会失败,因为设备和 USB 设备的总线号之间的关联不正确。

如需更多信息,请参阅 RHEL 9 已知问题。

作为临时解决方案,使用 virsh 工具从虚拟机的 XML 配置中删除 USB 设备的 <hostdev> 部分。以下示例打开 example-VM-1 虚拟机的 XML 配置:

# virsh edit <example-VM-1>
Copy to Clipboard Toggle word wrap

先决条件

  • 您已安装了 RHEL 9 web 控制台。
  • 您已启用了 cockpit 服务。
  • 您的用户帐户被允许登录到 web 控制台。

    具体步骤请参阅安装并启用 Web 控制台

  • Web 控制台 VM 插件已安装在您的系统上
  • 可选:使用 virsh dumpxml example-VM-1 备份虚拟机的 XML 配置,并将输出发送到文件。例如,以下命令将 testguest1 虚拟机的配置备份为 testguest1.xml 文件:

    # virsh dumpxml testguest1 > testguest1.xml
    # cat testguest1.xml
    <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
      <name>testguest1</name>
      <uuid>ede29304-fe0c-4ca4-abcd-d246481acd18</uuid>
      [...]
    </domain>
    Copy to Clipboard Toggle word wrap

流程

  1. Virtual Machines 接口中,点击您要从中删除主机设备的虚拟机。

    这会打开一个新页面,其中包含有关所选虚拟机基本信息的 概述,以及访问虚拟机图形界面的 控制台 部分。

  2. 滚动到 Host devices

    主机设备 部分显示有关附加到虚拟机的设备的信息,以及 A添加删除 设备的选项。

  3. 点击您要从虚拟机中删除设备旁边的 Remove 按钮。

    此时会出现删除设备确认对话框。

  4. 点击 Remove

    该设备从虚拟机中删除。

故障排除

  • 如果删除主机设备导致虚拟机无法启动,请使用 virsh define 工具通过重新载入之前备份的 XML 配置文件来恢复 XML 配置。

    # virsh define testguest1.xml
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat