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 支持

  1. 编辑内核命令行

    对于 Intel VT-d 系统,IOMMU 通过在内核命令行中添加 intel_iommu=oniommu=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"
    
    Copy to Clipboard Toggle word wrap
    注意
    有关 IOMMU 的详情,请参考 附录 E, 使用 IOMMU 组
  2. 重新生成引导装载程序配置

    要应用内核命令行的更改,请使用 grub2-mkconfig 命令重新生成引导装载程序配置:
    # grub2-mkconfig -o /etc/grub2.cfg
    Copy to Clipboard Toggle word wrap
    请注意,如果您使用基于 UEFI 的主机,则目标文件应当是 /etc/grub2-efi.cfg
  3. 重启主机

    要使更改生效,请重启主机机器:
    # reboot
    Copy to Clipboard Toggle word wrap

过程 16.14. 将 GPU 设备绑定到主机物理机器驱动程序中排除

对于 GPU 分配,建议将设备从绑定到主机驱动程序中排除,因为这些驱动程序通常不支持动态未绑定设备。
  1. 识别 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)
    
    Copy to Clipboard Toggle word wrap
    生成的搜索显示,这个设备的 PCI 总线地址为 0000:02:00.0,该设备的 PCI ID 为 10de:11fa。
  2. 防止原生主机机器驱动程序使用 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"
    
    Copy to Clipboard Toggle word wrap
    要为 pci-stub 添加额外的 PCI ID,使用逗号分隔它们。
  3. 重新生成引导装载程序配置

    使用 grub2-mkconfig 来重新生成引导装载程序配置,使其包含这个选项:
    # grub2-mkconfig -o /etc/grub2.cfg
    Copy to Clipboard Toggle word wrap
    请注意,如果您使用基于 UEFI 的主机,则目标文件应当是 /etc/grub2-efi.cfg
  4. 重启主机机器

    要使更改生效,重启主机机器:
    # reboot
    Copy to Clipboard Toggle word wrap

过程 16.15. 可选:编辑 GPU IOMMU 配置

在附加 GPU 设备前,可能需要编辑其 IOMMU 配置以便 GPU 在客户机上正常工作。
  1. 显示 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
    Copy to Clipboard Toggle word wrap
    <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>
    
    Copy to Clipboard Toggle word wrap
    注意 XML 的 <iommuGroup> 元素。iommuGroup 表示一组由于 IOMMU 功能和 PCI 总线拓扑考虑了与其他设备隔离的设备。iommuGroup 内的所有端点设备(认为不是 PCIe 根端口、网桥或交换机端口的设备)都需要从原生主机驱动程序中绑定,才能分配到客户机。在上面的示例中,组由 GPU 设备(0000:02:00.0)和 companion 音频设备(0000:02:00.1)组成。如需更多信息,请参阅 附录 E, 使用 IOMMU 组
  2. 调整 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
      
      Copy to Clipboard Toggle word wrap

过程 16.16. 附加 GPU

GPU 可使用以下任一方法附加到客户端:
  1. 使用 虚拟机管理器 接口.详情请查看 第 16.1.2 节 “使用 virt-manager 分配 PCI 设备”
  2. 为 GPU 创建 XML 配置片段并使用 virsh attach-device 附加它:
    1. 为该设备创建 XML,如下所示:
      <hostdev mode='subsystem' type='pci' managed='yes'>
       <driver name='vfio'/>
       <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
       </source>
      </hostdev>
      
      Copy to Clipboard Toggle word wrap
    2. 将它保存到文件中,并运行 virsh attach-device [domain] [file] --persistent,以在客户机配置中包含 XML。请注意,除了客户机机器中现有仿真图形设备外,还添加了分配的 GPU。分配的 GPU 作为虚拟机中的辅助图形设备进行处理。不支持作为主图形设备分配,不应删除 guest XML 中的模拟图形设备。
  3. 使用 virsh edit 命令编辑客户机 XML 配置并手动添加相应的 XML 段。

过程 16.17. containerruntimeodify 在客户机上的 Xorg 配置

客户机上的 GPU PCI 总线地址将与主机上的不同。要启用主机正确使用 GPU,将 guest 的 Xorg 显示服务器配置为使用分配的 GPU 地址:
  1. 在客户机中,使用 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)
    
    Copy to Clipboard Toggle word wrap
    在本例中,总线地址为 00:09.0。
  2. 在客户机上的 /etc/X11/xorg.conf 文件中,在检测到的地址添加一个 BusID 选项,如下所示:
    		Section "Device"
    		    Identifier     "Device0"
    		    Driver         "nvidia"
    		    VendorName     "NVIDIA Corporation"
    		    BusID          "PCI:0:9:0"
    		EndSection
    
    Copy to Clipboard Toggle word wrap
    重要
    如果第 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 的热插拔支持可用。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat