14.4. 使用命令行将 PCI 设备附加到虚拟机
使用虚拟机(VM)时,您可以访问和控制附加到主机系统的 PCI 设备(如存储或网络控制器)。在这种情况下,主机系统会将设备的控制权传递给虚拟机。这也被称为 PCI 设备分配或 PCI 透传。
要使用附加到虚拟机(VM)中主机的 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 设备的步骤,请参阅以下步骤:
- 将 SR-IOV 网络设备附加到虚拟机
- 为虚拟机分配 GPU
- 将 SR-IOV 网络设备附加到虚拟机
获取您要使用的设备的 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