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