14.4. 使用命令行将 PCI 设备连接到虚拟机
使用虚拟机(VM)时,您可以访问并控制连接到主机系统的 PCI 设备,如存储或网络控制器。在这种情况下,主机系统会将设备的控制权传递给虚拟机。这也被称为 PCI 设备分配或 PCI 直通。
要在虚拟机(VM)中使用连接到主机的 PCI 硬件设备,您可以从主机中分离该设备,然后将其分配给虚拟机。
此流程描述了通用 PCI 设备分配。有关分配特定类型的 PCI 设备的步骤,请查看相关步骤:
先决条件
如果您的主机使用 IBM Z 架构,则必须在主机上载入
vfio内核模块。要进行验证,请使用以下命令:# lsmod | grep vfio输出必须包含以下模块:
-
vfio_pci -
vfio_pci_core -
vfio_iommu_type1
-
流程
获取您要使用的设备的 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: 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)