14.7. 在虚拟机中管理 PCI 设备
使用虚拟机(VM)时,您可以访问和控制附加到主机系统的 PCI 设备(如存储或网络控制器)。在这种情况下,主机系统会将设备的控制权传递给虚拟机。这也被称为 PCI 设备分配,或 PCI 透传。
14.7.1. 将 PCI 设备附加到虚拟机 复制链接链接已复制到粘贴板!
要使用附加到虚拟机(VM)中主机的 PCI 硬件设备,您可以从主机中分离该设备并将其分配给虚拟机。这也被称为 PCI 透传。
先决条件
如果您的主机使用 IBM Z 架构,则必须在主机上载入
vfio内核模块。要验证,请使用以下命令:# lsmod | grep vfio输出必须包含以下模块:
-
vfio_pci -
vfio_pci_core -
vfio_iommu_type1
-
以下步骤描述了通用 PCI 设备分配。有关分配特定类型的 PCI 设备的步骤,请参阅以下步骤:
获取您要使用的设备的 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打开您要向其附加 PCI 设备的虚拟机的 XML 配置。
# virsh edit vm-name将以下
<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>可选:在 IBM Z 主机上,您可以修改客户端操作系统如何检测 PCI 设备。要做到这一点,将 <
zpci>子元素添加到 <address>元素。在<zpci>行中,您可以调整uid和fid值,这会修改客户机操作系统中设备的 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>在本例中:
-
uid="0x0008"将虚拟机中设备的域 PCI 地址设置为0008:00:00.0。 fid="0x001807"将设备的插槽值设置为0x001807。因此,虚拟机的文件系统中的设备配置被保存到/sys/bus/pci/slots/00001087/address中。如果没有指定这些值,
libvirt会自动配置它们。
-
- 保存 XML 配置。
如果虚拟机正在运行,请将其关闭。
# virsh shutdown vm-name
验证
- 启动虚拟机,并登录到其客户机操作系统。
在客户端操作系统中,确认是否列出了 PCI 设备。
例如,如果您将客户机设备地址配置为
0000:02:00.0,请使用以下命令:# lspci -nkD | grep 0000:02:00.0 0000:02:00.0 8086:9a09 (rev 01)
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- 备份虚拟机中的重要数据。
可选:备份虚拟机的 XML 配置。例如,要备份
example-VM-1虚拟机:# virsh dumpxml example-VM-1 > example-VM-1.xml- Web 控制台 VM 插件已安装在您的系统上。
流程
登录到 RHEL 9 web 控制台。
详情请参阅 登录到 web 控制台。
在 接口中,点击您要给其附加主机设备的虚拟机。
这会打开一个新页面,其中包含有关所选虚拟机基本信息的 概述,以及访问虚拟机图形界面的 控制台 部分。
滚动到 。
主机设备 部分显示有关附加到虚拟机的设备的信息,以及 A添加 或 删除 设备的选项。
点击 。
此时会出现 Add host device 对话框。
- 选择您要附加到虚拟机的设备。
点
所选设备被附加到虚拟机。
验证
- 运行虚拟机并检查该设备是否出现在 Host devices 部分中。
14.7.3. 使用命令行从虚拟机中删除 PCI 设备 复制链接链接已复制到粘贴板!
要从虚拟机(VM)中删除 PCI 设备,请从虚拟机的 XML 配置中删除设备信息。
流程
在附加 PCI 设备的虚拟机的 XML 配置中,使用设备的设置在 <
hostdev>> 行。; 部分找到 <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> [...]使用
virsh detach-device命令及 the--hostdev选项和设备地址。例如,以下命令会永久删除上一步中的设备。
# virt detach-device <VM-name> --hostdev 0000:65:00.0 --config Domain 'VM-name' defined successfully.注意要从正在运行的虚拟机中删除 PCI 设备,请在上一个命令中添加 -
live参数。可选:将 PCI 设备重新附加到主机。例如,以下命令重新附加从上一步中虚拟机中删除的设备:
# virsh nodedev-reattach pci_0000_65_00_0 Device pci_0000_65_00_0 re-attached
验证
再次显示虚拟机的 XML 配置,检查设备的 <
hostdev> 部分是否不再显示。# virsh dumpxml <VM-name>
14.7.4. 使用 web 控制台从虚拟机中删除设备 复制链接链接已复制到粘贴板!
要释放资源,修改虚拟机的功能或两个都做,您可以使用 Web 控制台来修改虚拟机,并删除不再需要的主机设备。
使用 Web 控制台删除附加的 USB 主机设备可能会失败,因为设备和 USB 设备的总线号之间的关联不正确。
如需更多信息,请参阅 RHEL 9 已知问题。
作为临时解决方案,使用 virsh 工具从虚拟机的 XML 配置中删除 USB 设备的 <hostdev> 部分。以下示例打开 example-VM-1 虚拟机的 XML 配置:
# virsh edit <example-VM-1>
先决条件
- 您已安装了 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>
流程
在 接口中,点击您要从中删除主机设备的虚拟机。
这会打开一个新页面,其中包含有关所选虚拟机基本信息的 概述,以及访问虚拟机图形界面的 控制台 部分。
滚动到 。
主机设备 部分显示有关附加到虚拟机的设备的信息,以及 A添加 或 删除 设备的选项。
点击您要从虚拟机中删除设备旁边的 按钮。
此时会出现删除设备确认对话框。
点击 。
该设备从虚拟机中删除。
故障排除
如果删除主机设备导致虚拟机无法启动,请使用
virsh define工具通过重新载入之前备份的 XML 配置文件来恢复 XML 配置。# virsh define testguest1.xml