15.4. 使用命令行将 PCI 设备附加到虚拟机
使用虚拟机(VM)时,您可以访问和控制附加到主机系统的 PCI 设备(如存储或网络控制器)。在这种情况下,主机系统会将设备的控制权传递给虚拟机。这也被称为 PCI 设备分配或 PCI 透传。
要使用附加到虚拟机(VM)中主机的 PCI 硬件设备,您可以从主机中分离该设备并将其分配给虚拟机。
先决条件
如果您的主机使用 IBM Z 架构,则必须在主机上载入
vfio
内核模块。要验证,请使用以下命令:lsmod | grep vfio
# lsmod | grep vfio
Copy to Clipboard Copied! 输出必须包含以下模块:
-
vfio_pci
-
vfio_pci_core
-
vfio_iommu_type1
-
流程
以下步骤描述了通用 PCI 设备分配。有关分配特定类型的 PCI 设备的步骤,请参阅以下步骤:
- 将 SR-IOV 网络设备附加到虚拟机
- 为虚拟机分配 GPU
获取您要使用的设备的 PCI 地址标识符。例如,如果要使用附加到主机的 NVME 磁盘,以下输出将其显示为设备
0000:65:00.0
。lspci -nkD
# 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 Copied! 打开您要向其附加 PCI 设备的虚拟机的 XML 配置。
virsh edit vm-name
# virsh edit vm-name
Copy to Clipboard Copied! 将以下
<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>
<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 Copied! 可选:在 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>
<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 Copied! 在本例中:
-
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!
验证
- 启动虚拟机,并登录到其客户机操作系统。
在客户端操作系统中,确认是否列出了 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!