16.7. 分配 GPU 设备
要将 GPU 分配给客户端,请使用以下方法之 一 :
- GPU PCI 设备分配 - 使用此方法,可以从主机中删除 GPU 设备并将其分配给单个客户端。
- NVIDIA vGPU 分配 - 这个方法可以从物理 GPU 创建多个介质设备,并将这些设备分配为多个客户端。这只在所选 NVIDIA GPU 上被支持,且只能将一个介质设备分配给单个客户端。
16.7.1. GPU PCI 设备分配
Red Hat Enterprise Linux 7 支持将以下基于 PCIe 的 GPU 设备分配为非VGA 图形设备:
- NVIDIA Quadro K-Series、M-Series、P-Series 以及更新的构架(型号为 2000 系列或更高版本)
- NVIDIA Tesla K-Series、M-Series 和更高的架构
注意
可附加到虚拟机的 GPU 数量受分配的最大 PCI 设备数的限制,在 RHEL 7 中,当前为 32。但是,将多个 GPU 附加到虚拟机可能会导致客户端上内存映射 I/O(MMIO)出现问题,这可能会导致 GPU 不可用。
要临时解决这个问题,请设置较大的 64 位 MMIO 空间并配置 vCPU 物理地址位,以使扩展 64 位 MMIO 空间可以寻址。
要将 GPU 分配给客户机虚拟机,您必须在主机中启用 I/O 内存管理单元(IOMMU),使用 lspci 命令确定 GPU 设备,将设备从主机分离,将其附加到客户端,并在客户端 - 如以下步骤中所述:
过程 16.13. 在主机机器内核中启用 IOMMU 支持
编辑内核命令行
对于 Intel VT-d 系统,IOMMU 通过在内核命令行中添加intel_iommu=on
和iommu=pt
参数来激活。对于 AMD-Vi 系统,所需的选项仅为iommu=pt
。要启用这个选项,请编辑或将GRUB_CMDLINX_LINUX
行添加到/etc/sysconfig/grub
配置文件,如下所示:GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01 vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/rhcrashkernel-param || :) rhgb quiet intel_iommu=on iommu=pt"
注意有关 IOMMU 的详情,请参考 附录 E, 使用 IOMMU 组。重新生成引导装载程序配置
要应用内核命令行的更改,请使用grub2-mkconfig
命令重新生成引导装载程序配置:# grub2-mkconfig -o /etc/grub2.cfg
请注意,如果您使用基于 UEFI 的主机,则目标文件应当是/etc/grub2-efi.cfg
。重启主机
要使更改生效,请重启主机机器:# reboot
过程 16.14. 将 GPU 设备绑定到主机物理机器驱动程序中排除
对于 GPU 分配,建议将设备从绑定到主机驱动程序中排除,因为这些驱动程序通常不支持动态未绑定设备。
识别 PCI 总线地址
要识别设备的 PCI 总线地址和 ID,请运行以下 lspci 命令。在本例中,使用的是 VGA 控制器,如 NVIDIA Quadro 或 GRID 卡:# lspci -Dnn | grep VGA 0000:02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106GL [Quadro K4000] [10de:11fa] (rev a1)
生成的搜索显示,这个设备的 PCI 总线地址为 0000:02:00.0,该设备的 PCI ID 为 10de:11fa。防止原生主机机器驱动程序使用 GPU 设备
要防止原生主机机器驱动程序使用 GPU 设备,您可以使用带有 pci-stub 驱动程序的 PCI ID。要做到这一点,将pci-stub.ids
选项及其值附加到位于/etc/sysconfig/grub
配置文件中的GRUB_CMDLINX_LINUX
行,例如:GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01 vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/rhcrashkernel-param || :) rhgb quiet intel_iommu=on iommu=pt pci-stub.ids=10de:11fa"
要为 pci-stub 添加额外的 PCI ID,使用逗号分隔它们。重新生成引导装载程序配置
使用grub2-mkconfig
来重新生成引导装载程序配置,使其包含这个选项:# grub2-mkconfig -o /etc/grub2.cfg
请注意,如果您使用基于 UEFI 的主机,则目标文件应当是/etc/grub2-efi.cfg
。重启主机机器
要使更改生效,重启主机机器:# reboot
过程 16.15. 可选:编辑 GPU IOMMU 配置
在附加 GPU 设备前,可能需要编辑其 IOMMU 配置以便 GPU 在客户机上正常工作。
显示 GPU 的 XML 信息
要以 XML 格式显示 GPU 的设置,您首先需要将其 PCI 总线地址转换为兼容 libvirt 的格式,方法是附加pci_
和将分隔符转换为下划线。在本例中,通过 0000:02:00.0 总线地址标识的 GPU PCI 设备( 如上一步中获取)将变为pci_0000_02_00_0
。使用 virsh nodedev-dumpxml 的设备 libvirt 地址显示其 XML 配置:# virsh nodedev-dumpxml pci_0000_02_00_0
<device> <name>pci_0000_02_00_0</name> <path>/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.0</path> <parent>pci_0000_00_03_0</parent> <driver> <name>pci-stub</name> </driver> <capability type='pci'> <domain>0</domain> <bus>2</bus> <slot>0</slot> <function>0</function> <product id='0x11fa'>GK106GL [Quadro K4000]</product> <vendor id='0x10de'>NVIDIA Corporation</vendor> <!-- pay attention to the following lines --> <iommuGroup number='13'> <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> <address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/> </iommuGroup> <pci-express> <link validity='cap' port='0' speed='8' width='16'/> <link validity='sta' speed='2.5' width='16'/> </pci-express> </capability> </device>
注意 XML 的<iommuGroup>
元素。iommuGroup 表示一组由于 IOMMU 功能和 PCI 总线拓扑考虑了与其他设备隔离的设备。iommuGroup 内的所有端点设备(认为不是 PCIe 根端口、网桥或交换机端口的设备)都需要从原生主机驱动程序中绑定,才能分配到客户机。在上面的示例中,组由 GPU 设备(0000:02:00.0)和 companion 音频设备(0000:02:00.1)组成。如需更多信息,请参阅 附录 E, 使用 IOMMU 组。调整 IOMMU 设置
在本例中,不支持分配 NVIDIA 音频功能,因为存在旧中断支持的硬件问题。另外,在没有 GPU 本身的情况下,G GPU 音频功能通常不有用。因此,为了将 GPU 分配给客户机,必须首先将音频功能与原生主机驱动程序分离。这可使用以下方法之一完成:- 检测设备的 PCI ID,并将其附加到
/etc/sysconfig/grub
文件中的pci-stub.ids
选项中,具体如 过程 16.14, “将 GPU 设备绑定到主机物理机器驱动程序中排除” - 使用 virsh nodedev-detach 命令,如下所示:
# virsh nodedev-detach pci_0000_02_00_1 Device pci_0000_02_00_1 detached
过程 16.16. 附加 GPU
GPU 可使用以下任一方法附加到客户端:
- 使用 虚拟机管理器 接口.详情请查看 第 16.1.2 节 “使用 virt-manager 分配 PCI 设备”。
- 为 GPU 创建 XML 配置片段并使用 virsh attach-device 附加它:
- 为该设备创建 XML,如下所示:
<hostdev mode='subsystem' type='pci' managed='yes'> <driver name='vfio'/> <source> <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> </source> </hostdev>
- 将它保存到文件中,并运行 virsh attach-device [domain] [file] --persistent,以在客户机配置中包含 XML。请注意,除了客户机机器中现有仿真图形设备外,还添加了分配的 GPU。分配的 GPU 作为虚拟机中的辅助图形设备进行处理。不支持作为主图形设备分配,不应删除 guest XML 中的模拟图形设备。
- 使用 virsh edit 命令编辑客户机 XML 配置并手动添加相应的 XML 段。
过程 16.17. containerruntimeodify 在客户机上的 Xorg 配置
客户机上的 GPU PCI 总线地址将与主机上的不同。要启用主机正确使用 GPU,将 guest 的 Xorg 显示服务器配置为使用分配的 GPU 地址:
- 在客户机中,使用 lspci 命令确定 GPU 的 PCI 总线适配器:
# lspci | grep VGA 00:02.0 VGA compatible controller: Device 1234:111 00:09.0 VGA compatible controller: NVIDIA Corporation GK106GL [Quadro K4000] (rev a1)
在本例中,总线地址为 00:09.0。 - 在客户机上的
/etc/X11/xorg.conf
文件中,在检测到的地址添加一个BusID
选项,如下所示:Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" BusID "PCI:0:9:0" EndSection
重要如果第 1 步中检测到的总线地址是十六进制的,您需要将分隔符之间的值转换为十进制系统。例如,00:0a.0 应转换为 PCI:0:10:0。
注意
当在客户机中使用分配的 NVIDIA GPU 时,只支持 NVIDIA 驱动程序。其他驱动程序可能无法正常工作,并可能会生成错误。对于 Red Hat Enterprise Linux 7 客户机,可以在安装期间在内核命令行中使用 modprobe.blacklist=nouveau 选项将 nouveau 驱动程序列入黑名单。 有关其他客户虚拟机的详情,请查看操作系统的特定文档。
根据载入 NVIDIA 驱动程序的客户机操作系统,客户机可能会同时使用仿真图形和分配的图形支持,也可以禁用模拟图形。请注意,对分配的图形帧缓冲的访问不是由 virt-manager 等应用程序提供的。如果分配的 GPU 未连接到物理显示,则可能需要基于 guest 的删除解决方案来访问 GPU 桌面。与所有 PCI 设备分配一样,不支持迁移带有分配 GPU 的客户机,每个 GPU 都由单个虚拟机所有。根据客户端操作系统,可能会对 GPU 的热插拔支持可用。