Red Hat Training

A Red Hat training course is available for RHEL 8

第 12 章 在虚拟机中管理 GPU 设备

为提高 RHEL 8 主机上的虚拟机(VM)的图形性能,您可以为虚拟机分配主机 GPU。要做到这一点:

  • 您可以从主机上分离 GPU,并将 GPU 的完整控制直接传递给虚拟机。
  • 您可以从物理 GPU 创建多个介质设备,将这些设备作为虚拟 GPU(vGPU)分配给多个客户机。目前,这只在所选 NVIDIA GPU 中支持,且只有一个介质设备可以分配给单个客户机。

12.1. 将 GPU 分配给虚拟机

要访问和控制附加到主机系统的 GPU,您必须将主机系统配置为将 GPU 直接控制传递给虚拟机(VM)。

注意

如果您要查找分配虚拟 GPU 的信息, 请参阅管理 NVIDIA vGPU 设备

先决条件

  • 您必须在主机机器内核中启用 PoliciesMU 支持。

    • 在 Intel 主机上,您必须启用 VT-d:

      1. 使用 intel_iommu=on 参数重新生成 GRUB 配置:

        # grubby --args="intel_iommu=on" --update-kernel DEFAULT
      2. 如果 intel_iommu=on 正常工作,您可以尝试用 iommu=pt 替换它来切换到 passthrough 模式。

        # grubby --args="iommu=pt" --update-kernel DEFAULT
        注意

        pt 选项只为使用 pass-through 模式的设备启用 HOMU,并提供更好的主机性能。然而,并非所有硬件都支持该选项。如果 iommu=pt 选项在您的主机上无法正常工作,则恢复到 intel_iommu=on 选项。

      3. 重启主机。
    • 在 AMD 主机上,您必须启用 AMD-Vi。

      请注意,在 AMD 主机上,ITMU 默认启用,您可以添加 iommu=pt 来切换到 pass-through 模式:

      1. 使用 iommu=pt 参数重新生成 GRUB 配置:

        # grubby --args="iommu=pt" --update-kernel DEFAULT
        注意

        pt 选项只为使用 pass-through 模式的设备启用 HOMU,并提供更好的主机性能。然而,并非所有硬件都支持该选项。无论是否启用这个选项,您仍可以分配设备。

      2. 重启主机。

流程

  1. 防止驱动程序绑定到 GPU。

    1. 标识附加 GPU 的 PCI 总线地址。

      # lspci -Dnn | grep VGA
      0000:02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106GL [Quadro K4000] [10de:11fa] (rev a1)
    2. 防止主机的图形驱动程序使用 GPU。要做到这一点,请使用带有 pci-stub 驱动程序的 GPU 的 PCI ID。

      例如,以下命令可防止驱动程序绑定到在 10de:11fa bus 上附加的 GPU:

      # grubby --args="pci-stub.ids=10de:11fa" --update-kernel DEFAULT
    3. 重启主机。
  2. 选: 如果因为支持限制,某些 GPU 功能(比如音效)无法传递给虚拟机,您可以修改 FTMU 组中端点的驱动程序绑定,以只传递必要的 GPU 功能。

    1. 将 GPU 设置转换为 XML,并记录您要防止附加到主机驱动程序的端点的 PCI 地址。

      要做到这一点,通过在地址中添加 pci_ 前缀将 GPU 的 PCI 总线地址转换为 libvirt 兼容格式,并将分隔符转换为下划线。

      例如,以下命令显示附加到 0000:02:00.0 总线地址的 GPU 的 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>
        <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>
    2. 防止端点附加到主机驱动程序。

      在这个示例中,要将 GPU 分配给虚拟机,防止与 audio 功能 <address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/> 对应的端点附加到主机 audio 驱动程序,而是将端点附加到 VFIO-PCI。

      # driverctl set-override 0000:02:00.1 vfio-pci
  3. 将 GPU 附加到虚拟机

    1. 使用 PCI 总线地址为 GPU 创建 XML 配置文件。

      例如,您可以使用 GPU 的总线地址中的参数来创建以下 XML 文件 GPU-Assign.xml。

      <hostdev mode='subsystem' type='pci' managed='yes'>
       <driver name='vfio'/>
       <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
       </source>
      </hostdev>
    2. 在主机系统中保存该文件。
    3. 将文件与虚拟机 XML 配置合并。

      例如,以下命令将 GPU XML 文件 GPU-Assign.xml 与 System1 虚拟机的 XML 配置文件合并。

      # virsh attach-device System1 --file /home/GPU-Assign.xml --persistent
      Device attached successfully.
      注意

      GPU 作为辅助图形设备附加到虚拟机。分配 GPU,因为主图形设备不被支持,因此红帽不推荐在虚拟机 XML 配置中删除主模拟图形设备。

验证

12.2. 管理 NVIDIA vGPU 设备

vGPU 功能可将物理 NVIDIA GPU 设备划分为多个虚拟设备,称为 mediated devices。然后可将这些 mediated devices 分配给多个虚拟机(VM)作为虚拟 GPU。因此,这些虚拟机可以共享单个物理 GPU 的性能。

重要

为虚拟机分配物理 GPU,在使用或不使用 mediated devices 时,会导致主机无法使用 GPU。

12.2.1. 设置 NVIDIA vGPU 设备

要设置 NVIDIA vGPU 功能,您需要为 GPU 设备下载 NVIDIA vGPU 驱动程序,创建介质设备,并将其分配给预期的虚拟机。具体步骤请查看以下说明。

先决条件

  • 已安装 mdevctl 软件包。

    # yum install mdevctl
  • 您的 GPU 支持 vGPU 介质设备。有关支持创建 vGPU 的 NVIDIA GPU 的最新列表,请参阅 NVIDIA GPU 软件文档

    • 如果您不知道您的主机正在使用哪个 GPU,请安装 lshw 软件包并使用 lshw -C display 命令。以下示例显示系统使用与 vGPU 兼容的 NVIDIA Tesla P4 GPU。

      # lshw -C display
      
      *-display
             description: 3D controller
             product: GP104GL [Tesla P4]
             vendor: NVIDIA Corporation
             physical id: 0
             bus info: pci@0000:01:00.0
             version: a1
             width: 64 bits
             clock: 33MHz
             capabilities: pm msi pciexpress cap_list
             configuration: driver=vfio-pci latency=0
             resources: irq:16 memory:f6000000-f6ffffff memory:e0000000-efffffff memory:f0000000-f1ffffff

流程

  1. 下载 NVIDIA vGPU 驱动程序并在您的系统中安装它们。具体步骤请查看 NVIDIA 文档
  2. 如果 NVIDIA 软件安装程序没有创建 /etc/modprobe.d/nvidia-installer-disable-nouveau.conf 文件,请在 /etc/modprobe.d/ 中创建可以是任何名称的 conf 文件,并在文件中添加以下行:

    blacklist nouveau
    options nouveau modeset=0
  3. 为当前内核重新生成初始 ramdisk,然后重启。

    # dracut --force
    # reboot
  4. 检查内核是否已载入 nvidia_vgpu_vfio 模块以及 nvidia-vgpu-mgr.service 服务是否正在运行。

    # lsmod | grep nvidia_vgpu_vfio
    nvidia_vgpu_vfio 45011 0
    nvidia 14333621 10 nvidia_vgpu_vfio
    mdev 20414 2 vfio_mdev,nvidia_vgpu_vfio
    vfio 32695 3 vfio_mdev,nvidia_vgpu_vfio,vfio_iommu_type1
    
    # systemctl status nvidia-vgpu-mgr.service
    nvidia-vgpu-mgr.service - NVIDIA vGPU Manager Daemon
       Loaded: loaded (/usr/lib/systemd/system/nvidia-vgpu-mgr.service; enabled; vendor preset: disabled)
       Active: active (running) since Fri 2018-03-16 10:17:36 CET; 5h 8min ago
     Main PID: 1553 (nvidia-vgpu-mgr)
     [...]
  5. 生成设备 UUID。

    # uuidgen
    30820a6f-b1a5-4503-91ca-0c10ba58692a
  6. 从您探测到的 GPU 硬件创建介质设备,并将生成的 UUID 分配给该设备。

    以下示例演示了如何在运行在 0000:01:00.0 PCI 总线的 NVIDIA Tesla P4 卡中创建 nvidia-63 vGPU 类型的 media 设备:

    # mdevctl start -u 30820a6f-b1a5-4503-91ca-0c10ba58692a -p 0000:01:00.0 --type nvidia-63
    注意

    有关特定 GPU 设备的 vGPU 类型值,请参阅 Virtual GPU 软件文档

  7. 使 mediated 设备持久:

    # mdevctl define --auto --uuid 30820a6f-b1a5-4503-91ca-0c10ba58692a

  8. 将 mediated 设备附加到要共享 vGPU 资源的虚拟机。要做到这一点,请将以下行以及之前生成的 UUID 添加到虚拟机 XML 配置的 <devices/> 部分。

    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
      <source>
        <address uuid='30820a6f-b1a5-4503-91ca-0c10ba58692a'/>
      </source>
    </hostdev>

    请注意,每个 UUID 每次只能分配给一个虚拟机。

  9. 为了在分配的虚拟机上完全正常工作 vGPU 介质设备,请在虚拟机上设置 NVIDIA vGPU 客户机软件许可证。有关详情和说明,请参阅 NVIDIA Virtual GPU Software License Server User Guide

验证

  • 列出主机上的活动介质设备。如果输出显示有使用 UUID 的定义设备,则代表正确配置了 NVIDIA vGPU。例如:

    # mdevctl list
    85006552-1b4b-45ef-ad62-de05be9171df 0000:01:00.0 nvidia-63
    30820a6f-b1a5-4503-91ca-0c10ba58692a 0000:01:00.0 nvidia-63 (defined)

其它资源

  • 有关使用 mdevctl 工具的更多信息,请使用 man mdevctl

12.2.2. 删除 NVIDIA vGPU 设备

要更改分配的 vGPU 介质设备 的配置,您需要从分配的虚拟机中删除现有设备。具体步骤请查看以下操作:

先决条件

  • 已安装 mdevctl 软件包。

    # yum install mdevctl
  • 要从中删除该设备的虚拟机关闭。

流程

  1. 获取您要删除的介质设备的 UUID。要做到这一点,使用 mdevctl list 命令:

    # mdevctl list
    85006552-1b4b-45ef-ad62-de05be9171df 0000:01:00.0 nvidia-63 (defined)
    30820a6f-b1a5-4503-91ca-0c10ba58692a 0000:01:00.0 nvidia-63 (defined)
  2. 停止 mediated vGPU 设备的运行实例。要做到这一点,使用带有该设备的 UUID 的 mdevctl stop 命令。例如:要停止 30820a6f-b1a5-4503-91ca-0c10ba58692a 设备:

    # mdevctl stop -u 30820a6f-b1a5-4503-91ca-0c10ba58692a
  3. 从虚拟机 XML 配置中删除该设备。要做到这一点,使用 virsh edit 实用程序编辑虚拟机 XML 配置,并删除 mdev 的配置片段。这个片段类似如下:

    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
      <source>
        <address uuid='30820a6f-b1a5-4503-91ca-0c10ba58692a'/>
      </source>
    </hostdev>

    请注意,停止和分离 mediated 设备不会删除它,而是将其保留为 defined。因此,您可以 重启 该设备并 将其附加 到不同的虚拟机。

  4. 可选: 要删除已停止的介质设备,请移除其定义:

    # mdevctl undefine -u 30820a6f-b1a5-4503-91ca-0c10ba58692a

验证

  • 如果您只停止和分离该设备,请列出活跃的介质设备以及定义的介质设备。

    # mdevctl list
    85006552-1b4b-45ef-ad62-de05be9171df 0000:01:00.0 nvidia-63 (defined)
    # mdevctl list --defined
    85006552-1b4b-45ef-ad62-de05be9171df 0000:01:00.0 nvidia-63 auto (active)
    30820a6f-b1a5-4503-91ca-0c10ba58692a 0000:01:00.0 nvidia-63 manual

    如果第一个命令没有显示该设备,但第二个命令会成功执行。

  • 如果您也删除了该设备,第二个命令不应该显示该设备。

    # mdevctl list
    85006552-1b4b-45ef-ad62-de05be9171df 0000:01:00.0 nvidia-63 (defined)
    # mdevctl list --defined
    85006552-1b4b-45ef-ad62-de05be9171df 0000:01:00.0 nvidia-63 auto (active)

其它资源

  • 有关使用 mdevctl 工具的更多信息,请使用 man mdevctl

12.2.3. 获取有关您系统的 NVIDIA vGPU 信息

要评估您可使用的 vGPU 功能的功能,您可以获取系统中 mediated devices 的更多信息,例如:

  • 可创建给定类型的 mediated 设备
  • 您的系统中已经配置了哪些介质设备。

先决条件

  • 已安装 mdevctl 软件包。

    # yum install mdevctl

流程

  • 要在主机上查看可用的 vGPU 类型,请使用 mdevctl types 命令。

    例如,下面的显示了使用 0000:41:00.0 PCI 总线下使用物理 Tesla T4 卡的系统信息:

    # mdevctl types
    0000:41:00.0
      nvidia-222
        Available instances: 0
        Device API: vfio-pci
        Name: GRID T4-1B
        Description: num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=16
      nvidia-223
        Available instances: 0
        Device API: vfio-pci
        Name: GRID T4-2B
        Description: num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=8
      nvidia-224
        Available instances: 0
        Device API: vfio-pci
        Name: GRID T4-2B4
        Description: num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=8
      nvidia-225
        Available instances: 0
        Device API: vfio-pci
        Name: GRID T4-1A
        Description: num_heads=1, frl_config=60, framebuffer=1024M, max_resolution=1280x1024, max_instance=16
        [...]
  • 要查看主机上的活跃 vGPU 设备,包括它们的类型、UUID 和父设备的 PCI buses,请使用 mdevctl list 命令:

    # mdevctl list
    85006552-1b4b-45ef-ad62-de05be9171df 0000:41:00.0 nvidia-223
    83c32df7-d52e-4ec1-9668-1f3c7e4df107 0000:41:00.0 nvidia-223 (defined)

    这个示例显示 85006552-1b4b-45ef-ad62-de05be9171df 设备正在运行但没有定义,83c32df7-d52e-4ec1-9668-1f3c7e4df107 则已定义并正在运行。

其它资源

  • 有关使用 mdevctl 工具的更多信息,请使用 man mdevctl

12.2.4. 用于 NVIDIA vGPU 的远程桌面流服务

以下远程桌面流服务已被成功测试以与 RHEL 8 主机中的 NVIDIA vGPU 功能一起使用:

  • HP-RGS - 请注意,当前无法在 RHEL 8 虚拟机中使用 HP-RGS。
  • Mechdyne TGX - 请注意,目前无法将 Mechdyne TGX 与 Windows Server 2016 虚拟机搭配使用。
  • NICE DCV - 在使用这个流传输服务时,红帽建议使用固定的解析设置,因为在某些情况下,使用动态解析功能会导致一个黑色屏幕。另外,当前还无法在 RHEL 8 虚拟机中使用 NICE DCV。

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。