Red Hat Training

A Red Hat training course is available for RHEL 8

12.2. 管理 NVIDIA vGPU 设备

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

重要

将物理 GPU 分配给使用或不使用中介设备的虚拟机,使主机无法使用 GPU。

12.2.1. 设置 NVIDIA vGPU 设备

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

先决条件

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

    • 如果您不知道主机正在使用哪个 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)
     [...]

    另外,如果基于 NVIDIA Ampere GPU 设备创建 vGPU,请确保为物理 GPU 启用虚拟功能。具体步骤请查看 NVIDIA 文档

  5. 生成设备 UUID。

    # uuidgen
    30820a6f-b1a5-4503-91ca-0c10ba58692a
  6. 根据检测到的 GPU 硬件,使用 mediated 设备配置准备 XML 文件。例如,以下命令会在 0000:01:00.0 PCI 总线上运行的 NVIDIA Tesla P4 卡中配置 nvidia-63 vGPU 类型的介质设备,并使用上一步中生成的 UUID。

    <device>
        <parent>pci_0000_01_00_0</parent>
        <capability type="mdev">
            <type id="nvidia-63"/>
            <uuid>30820a6f-b1a5-4503-91ca-0c10ba58692a</uuid>
        </capability>
    </device>
  7. 根据您准备的 XML 文件定义 vGPU 介质设备。例如:

    # virsh nodedev-define vgpu-test.xml
    Node device mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 created from vgpu-test.xml
  8. 可选: 验证中介设备是否被列为不活动状态。

    # virsh nodedev-list --cap mdev --inactive
    mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
  9. 启动您创建的 vGPU 介质设备。

    # virsh nodedev-start mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
    Device mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 started
  10. 可选: 确保 中介设备被列为活动状态。

    # virsh nodedev-list --cap mdev
    mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
  11. 将 vGPU 设备设置为在主机重启后自动启动

    # virsh nodedev-autostart mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
    Device mdev_d196754e_d8ed_4f43_bf22_684ed698b08b_0000_9b_00_0 marked as autostarted
  12. 将 mediated 设备附加到要共享 vGPU 资源的虚拟机。要做到这一点,请将以下行以及之前生成的 UUID 添加到虚拟机 XML 配置的 <devices/> 部分。

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

    请注意,每个 UUID 每次只能分配给一个虚拟机。另外,如果虚拟机没有 QEMU 视频设备,如 virtio-vga,在 <hostdev> 行中添加 ramfb='on' 参数。

  13. 要使 vGPU 中介设备的全部功能在分配的虚拟机上可用,请在虚拟机上设置 NVIDIA vGPU 虚拟机软件许可。有关详情和说明,请参阅 NVIDIA Virtual GPU Software License Server User Guide

验证

  1. 查询您创建的 vGPU 的功能,并确保它列为 active 和 persistent。

    # virsh nodedev-info mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
    Name:           virsh nodedev-autostart mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
    Parent:         pci_0000_01_00_0
    Active:         yes
    Persistent:     yes
    Autostart:      yes
  2. 启动虚拟机并验证客户端操作系统是否检测到 mediated device 作为 NVIDIA GPU。例如,如果虚拟机使用 Linux:

    # lspci -d 10de: -k
    07:00.0 VGA compatible controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 32GB] (rev a1)
            Subsystem: NVIDIA Corporation Device 12ce
            Kernel driver in use: nvidia
            Kernel modules: nouveau, nvidia_drm, nvidia

已知问题

  • 将 NVIDIA vGPU 介质设备分配给使用 RHEL 8 客户机操作系统的虚拟机当前禁用该虚拟机上的 Wayland 会话,并改为加载 Xorg 会话。这是因为 NVIDIA 驱动程序和 Wayland 之间的不兼容。

其它资源

12.2.2. 删除 NVIDIA vGPU 设备

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

先决条件

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

流程

  1. 获取您要删除的介质设备的 ID。

    # virsh nodedev-list --cap mdev
    mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
  2. 停止 vGPU mediated 设备的运行实例。

    # virsh nodedev-destroy mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
    Destroyed node device 'mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0'
  3. 可选: 确保中介设备已被停用。

    # virsh nodedev-info mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
    Name:           virsh nodedev-autostart mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
    Parent:         pci_0000_01_00_0
    Active:         no
    Persistent:     yes
    Autostart:      yes
  4. 从虚拟机 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。因此,您可以重启并把设备附加到不同的虚拟机。

  5. 可选: 要删除已停用的中介设备,请删除其定义。

    # virsh nodedev-undefine mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
    Undefined node device 'mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0'

验证

  • 如果您只停止和分离该设备,请确保介质设备被列为 inactive。

    # virsh nodedev-list --cap mdev --inactive
    mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
  • 如果您也删除了该设备,请确保以下命令不会显示它。

    # virsh nodedev-list --cap mdev

其它资源

  • man virsh 命令

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

要评估可用的 vGPU 功能,您可以获取系统上关于中介设备的其它信息,例如:

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

流程

  • 要查看您主机上可以支持 vGPU 介质设备的可用 GPU 设备,请使用 virsh nodedev-list --cap mdev_types 命令。例如,下面显示了有两个 NVIDIA Quadro RTX6000 设备的系统。

    # virsh nodedev-list --cap mdev_types
    pci_0000_5b_00_0
    pci_0000_9b_00_0
  • 要显示特定 GPU 设备支持的 vGPU 类型以及其他元数据,请使用 virsh nodedev-dumpxml 命令。

    # virsh nodedev-dumpxml pci_0000_9b_00_0
    <device>
      <name>pci_0000_9b_00_0</name>
      <path>/sys/devices/pci0000:9a/0000:9a:00.0/0000:9b:00.0</path>
      <parent>pci_0000_9a_00_0</parent>
      <driver>
        <name>nvidia</name>
      </driver>
      <capability type='pci'>
        <class>0x030000</class>
        <domain>0</domain>
        <bus>155</bus>
        <slot>0</slot>
        <function>0</function>
        <product id='0x1e30'>TU102GL [Quadro RTX 6000/8000]</product>
        <vendor id='0x10de'>NVIDIA Corporation</vendor>
        <capability type='mdev_types'>
          <type id='nvidia-346'>
            <name>GRID RTX6000-12C</name>
            <deviceAPI>vfio-pci</deviceAPI>
            <availableInstances>2</availableInstances>
          </type>
          <type id='nvidia-439'>
            <name>GRID RTX6000-3A</name>
            <deviceAPI>vfio-pci</deviceAPI>
            <availableInstances>8</availableInstances>
          </type>
          [...]
          <type id='nvidia-440'>
            <name>GRID RTX6000-4A</name>
            <deviceAPI>vfio-pci</deviceAPI>
            <availableInstances>6</availableInstances>
          </type>
          <type id='nvidia-261'>
            <name>GRID RTX6000-8Q</name>
            <deviceAPI>vfio-pci</deviceAPI>
            <availableInstances>3</availableInstances>
          </type>
        </capability>
        <iommuGroup number='216'>
          <address domain='0x0000' bus='0x9b' slot='0x00' function='0x3'/>
          <address domain='0x0000' bus='0x9b' slot='0x00' function='0x1'/>
          <address domain='0x0000' bus='0x9b' slot='0x00' function='0x2'/>
          <address domain='0x0000' bus='0x9b' slot='0x00' function='0x0'/>
        </iommuGroup>
        <numa node='2'/>
        <pci-express>
          <link validity='cap' port='0' speed='8' width='16'/>
          <link validity='sta' speed='2.5' width='8'/>
        </pci-express>
      </capability>
    </device>

其它资源

  • man virsh 命令

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

在启用了 NVIDIA vGPU 或 NVIDIA GPU 直通 的 RHEL 8 hypervisor 上支持以下远程桌面流服务:

  • HP ZCentral Remote Boost/Teradici
  • NICE DCV
  • Mechdyne TGX

有关支持详情请查看适当的供应商支持列表。