为 Red Hat Virtualization 中的虚拟机设置 NVIDIA GPU

Red Hat Virtualization 4.4

如何在 Red Hat Virtualization 中配置虚拟机以使用专用 GPU 或 vGPU。

摘要

本文档论述了如何使用带有图形处理单元(GPU)的主机来运行红帽虚拟化中的虚拟机以进行图形密集型任务和在没有 GPU 的情况下无法运行的软件。

前言

= 在 {virt-product-fullname} 中为虚拟机设置 NVIDIA GPU:context: assemble_managing-vgpu-devices :context: GPU_setup_on_vm_standalone_doc :GPU_setup_on_vm_standalone_doc:

您可以使用具有兼容图形处理单元(GPU)的主机在 {virt-product-fullname} 中运行适合图形密集型任务的虚拟机,以及运行在没有 GPU(如 CAD)的情况下无法运行的软件。

您可以使用以下方法之一为虚拟机分配 GPU:

  • GPU 直通 :您可以将主机 GPU 分配到单个虚拟机,因此虚拟机,而不是主机,使用 GPU。
  • 虚拟 GPU(vGPU) :您可以将物理 GPU 设备划分为一个或多个虚拟设备,称为修复的设备。然后,您可以将这些 mediated 设备作为虚拟 GPU 分配给一个或多个虚拟机。这些虚拟机共享单个物理 GPU 的性能。对于某些 GPU,只能为单个客户机分配一个介质的设备。vGPU 支持只在所选 NVIDIA GPU 中可用。

    例如:

    个主机有四个 GPU。每个 GPU 最多可支持 16 个 vGPU,总支持 64 个 vGPU。些可能的 vGPU 分配有:

    • 带有 64 个 vGPU 的虚拟机
    • 64 个虚拟机,每个虚拟机都有一个 vGPU
    • 32 个虚拟机,每个虚拟机有一个 vGPU;8 个虚拟机,每个虚拟机具有两个 vGPU;4 个虚拟机,每个虚拟机具有四个 vGPU

第 1 章 GPU 设备直通:将主机 GPU 分配给单个虚拟机

对于一些基于 NVIDIA PCIe 的 GPU 设备,作为非 VGA 图形设备,红帽虚拟化支持 PCI VFIO(也称为设备直通)。

除了其中一个标准模拟图形界面外,您还可以通过主机 GPU 将一个或多个主机 GPU 附加到单个虚拟机。虚拟机使用仿真图形设备来预启动和安装,GPU 会在加载其图形驱动程序时获得控制。

有关您可以传递给单个虚拟机的主机 GPU 数量的详情,请参考 NVIDIA 网站。

要为虚拟机分配 GPU,请按照以下步骤执行:

以下步骤详述如下。

先决条件

  • 您的 GPU 设备支持 GPU 直通模式。
  • 您的系统被列为经过验证的服务器硬件平台。
  • 您的主机芯片组支持 Intel VT-d 或 AMD-Vi

有关支持的硬件和软件的更多信息,请参阅 NVIDIA GPU 软件发行注记中的 https://docs.nvidia.com/grid/latest/grid-vgpu-release-notes-red-hat-el-kvm/index.html#validated-platforms 验证平台

1.1. 启用主机 IOMMU 支持并将 nouveau 列入黑名单

主机计算机上的 I/O 内存管理单元(IOMMU)支持是使用虚拟机上的 GPU 所必需的。

流程

  1. 在管理门户中,单击 menu:Compute[Hosts]。选择主机并单击 btn:[编辑]。此时将显示 Edit Hosts 窗格。
  2. Kernel 标签页。
  3. 选中 Hostdev Passthrough & SR-IOV 复选框。此复选框通过将 intel_iommu=on 或 amd_iommu=on 添加到内核命令行来启用对具有 Intel VT-d 或 AMD Vi 的主机的 IOMMU 支持。
  4. 选中黑名单 Nouveau 复选框
  5. 单击 btn:[OK]。
  6. 选择主机并单击菜单:Management[维护] 和 btn:[OK]。
  7. 单击 menu:Installation[Reinstall]。
  8. 在重新安装完成后,重启主机。
  9. 主机机器重新引导后,单击菜单:Management[Activate]。
注意

要启用使用命令行的 IOMMU 支持,编辑虚拟机中的 grub.conf 文件(./entries/rhvh-4.4.<machine id>.conf)以包含选项 intel_iommu=on

1.2. 从主机分离 GPU

如果 GPU 绑定到主机内核驱动程序,则无法将 GPU 添加到虚拟机,因此您必须在将其添加到虚拟机前从主机中解耦 GPU 设备。主机驱动程序通常不支持 GPU 的动态取消绑定,因此建议手动排除该设备绑定到主机驱动程序。

流程

  1. 在主机上,通过运行 lspci 命令识别设备插槽名称和 ID。在以下示例中,使用 NVIDIA Quadro 或 GRID 卡等图形控制器:

    # lspci -Dnn | grep -i NVIDIA
    0000:03:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK104GL [Quadro K4200] [10de:11b4] (rev a1)
    0000:03:00.1 Audio device [0403]: NVIDIA Corporation GK104 HDMI Audio Controller [10de:0e0a] (rev a1)

    输出显示安装了 NVIDIA GK104 设备。它有一个图形控制器和一个音频控制器,具有以下属性:

    • graphics 控制器的设备插槽名称是 0000:03:00.0,graphics 控制器的 vendor-id:device-id 为 10de:11b4
    • 音频控制器的设备插槽名称为 0000:03:00.1,音频控制器的 vendor-id:device-id 为 10de:0e0a
  2. 防止主机机器驱动程序使用 GPU 设备。您可以将 vendor-id:device-id 与 pci-stub 驱动程序一起使用。为此,请将 pci-stub.ids 选项和 vendor-id:device-id 作为其值附加到位于 /etc/sysconfig/grub 配置文件中的 GRUB_CMDLINX_LINUX 环境变量,例如:

    GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/vg0-lv_swap rd.lvm.lv=vg0/lv_root rd.lvm.lv=vg0/lv_swap rhgb quiet intel_iommu=on pci-stub.ids=10de:11b4,10de:0e0a"

    为 pci-stub 添加其他厂商 ID 和设备 ID 时,请使用逗号分隔它们。

  3. 使用 grub2-mkconfig 重新生成引导装载程序配置使其包含这个选项:

    # grub2-mkconfig -o /etc/grub2.cfg
    注意

    使用基于 UEFI 的主机时,目标文件应为 /etc/grub2-efi.cfg

  4. 重启主机计算机。
  5. 确认启用 IOMMU,主机设备被添加到 pci-stub.ids 列表中,Nouveau 已列入黑名单:

    # cat /proc/cmdline
    BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-147.el8.x86_64 root=/dev/mapper/vg0-lv_root ro crashkernel=auto resume=/dev/mapper/vg0-lv_swap rd.lvm.lv=vg0/lv_root rd.lvm.lv=vg0/lv_swap rhgb quiet intel_iommu=on 1
    pci-stub.ids=10de:11b4,10de:0e0a 2
    rdblacklist=nouveau 3
1
IOMMU 被启用
2
主机设备添加到 pci-stub.ids 列表中
3
Nouveau 列入黑名单

1.3. 将 GPU 附加到虚拟机

从主机内核驱动程序取消绑定 GPU 后,您可以将其添加到虚拟机并启用正确的驱动程序。

流程

  1. 按照《虚拟机管理指南》中将主机设备添加到 虚拟机中的步骤进行操作
  2. 运行虚拟机并进行登录。
  3. 在虚拟机上安装 NVIDIA GPU 驱动程序。详情请查看 第 1.4 节 “在虚拟机上安装 GPU 驱动程序”
  4. 使用 lspci -nnk 命令验证正确的内核驱动程序是否用于 GPU。例如:

    # lspci -nnk
    00:07.0 VGA compatible controller [0300]: NVIDIA Corporation GK104GL [Quadro K4200] [10de:11b4] (rev a1)
    Subsystem: Hewlett-Packard Company Device [103c:1096]
    Kernel driver in use: nvidia
    Kernel modules: nouveau, nvidia_drm, nvidia

1.4. 在虚拟机上安装 GPU 驱动程序

流程

  1. 运行虚拟机并使用 VNC 或 SPICE 控制台连接到该虚拟机。
  2. 将驱动程序下载到虚拟机。有关获取驱动程序的详情,请查看 NVIDIA 网站上的 Drivers 页面
  3. 安装 GPU 驱动程序。

    重要

    仅 Linux:在 Linux 客户机操作系统上安装驱动程序时,系统会提示您更新 xorg.conf。如果您在安装过程中没有更新 xorg.conf,则需要手动更新。如需更多信息,请参阅 第 1.5 节 “更新和启用 xorg(Linux 虚拟机)”

  4. 安装完驱动程序后,重启机器。对于 Windows 虚拟机,请从管理门户或虚拟机门户完全关闭客户机,而不是从客户机操作系统内关闭。

    重要

    仅 Windows:从 Windows 客户机操作系统内关闭虚拟机有时会将虚拟机发送到休眠模式,这不会完全清除内存,并可能导致后续问题。使用管理门户或虚拟机门户关闭虚拟机,强制其彻底清理内存。

  5. 将监视器连接到主机 GPU 输出接口并运行虚拟机。
  6. 为每个 vGPU 设置 NVIDIA vGPU 客户机软件许可,并在 NVIDIA 仪表板中添加许可证凭证。如需更多信息,请参阅 NVIDIA 虚拟 GPU 软件文档中 NVIDIA vGPU 软件许可增强功能

1.5. 更新和启用 xorg(Linux 虚拟机)

在虚拟机上使用 GPU 之前,您需要在虚拟机上更新并启用 xorg。NVIDIA 驱动程序安装应自动执行此操作。查看 /etc/X11/xorg.conf 检查 xorg 是否已更新并启用:

# cat /etc/X11/xorg.conf

前两行指出它是否由 NVIDIA 生成。例如:

# cat /etc/X11/xorg.conf
# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig: version 390.87 (buildmeister@swio-display-x64-rhel04-14) Tue Aug 21 17:33:38 PDT 2018

流程

  1. 在虚拟机上,使用以下命令生成 xorg.conf 文件:

    # X -configure
  2. 使用以下命令将 xorg.conf 文件复制到 /etc/X11/xorg.conf 中:

    # cp /root/xorg.conf.new /etc/X11/xorg.conf
  3. 重启虚拟机。
  4. 查看 /etc/X11/xorg.conf 来验证 xorg 是否已更新并启用:

    # cat /etc/X11/xorg.conf

    搜索 Device 部分。您应该看到类似以下部分的条目:

    Section "Device"
        Identifier     "Device0"
        Driver         "nvidia"
        VendorName     "NVIDIA Corporation"
    EndSection

GPU 现已分配给虚拟机。

第 2 章 分配虚拟 GPU

要设置 NVIDIA vGPU 设备,您需要:

  1. 获取并为您的 GPU 设备安装正确的 NVIDIA vGPU 驱动程序
  2. 创建 mediated devices
  3. 将每个 mediated 设备分配给虚拟机
  4. 在每台虚拟机上安装客户机驱动程序.

以下流程说明了此过程。

2.1. 在主机上设置 NVIDIA vGPU 设备

注意

在客户机操作系统上安装 NVIDIA vGPU 驱动程序前,您需要了解许可要求并获取正确的许可证凭证。

先决条件

  • 您的 GPU 设备支持虚拟 GPU(vGPU)功能。
  • 您的系统被列为经过验证的服务器硬件平台。

有关支持的 GPU 和验证平台的更多信息,请参阅 www.nvidia.com 上的 NVIDIA vGPU CERTIFIED SERVERS

流程

  1. 为主机下载并安装 NVIDIA 驱动程序。有关获取驱动程序的详情,请查看 NVIDIA 网站上的 Drivers 页面
  2. 如果 NVIDIA 软件安装程序没有创建 /etc/modprobe.d/nvidia-installer-disable-nouveau.conf 文件,请手动创建该文件。
  3. 在文本编辑器中打开 /etc/modprobe.d/nvidia-installer-disable-nouveau.conf 文件,并将以下行添加到文件的末尾:

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

    # dracut --force
    # reboot

    另外,如果您需要使用之前支持的带有 mediated 设备的内核版本,请为所有安装的内核版本重新生成初始 ramdisk:

    # dracut --regenerate-all --force
    # reboot
  5. 检查内核是否已载入 nvidia_vgpu_vfio 模块:

    # lsmod | grep nvidia_vgpu_vfio
  6. 检查 nvidia-vgpu-mgr.service 服务是否正在运行:

    # systemctl status 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)
     [...]
  7. 通过在终端中输入以下行来获取可用 mdev 类型的列表,或者在脚本中输入以下行:

    for device in /sys/class/mdev_bus/; do for mdev_type in $device/mdev_supported_types/; do
        MDEV_TYPE=$(basename $mdev_type)
        DESCRIPTION=$(cat $mdev_type/description)
        NAME=$(cat $mdev_type/name)
        echo "mdev_type: $MDEV_TYPE --- description: $DESCRIPTION --- name: $NAME";
      done;
    done | sort | uniq
    注意

    有关特定 GPU 设备的 type-id 值,请参阅虚拟 GPU 软件文档中的虚拟 GPU 类型。请注意,在 Linux 虚拟机上仅支持 Q-series NVIDIA vGPU(如 GRID P4-2Q)作为 mediated device GPU 类型。

    输出结果类似如下:

    mdev_type: nvidia-11 --- description: num_heads=2, frl_config=45, framebuffer=512M, max_resolution=2560x1600, max_instance=16 --- name: GRID M60-0B
    mdev_type: nvidia-12 --- description: num_heads=2, frl_config=60, framebuffer=512M, max_resolution=2560x1600, max_instance=16 --- name: GRID M60-0Q
    ...
    mdev_type: nvidia-22 --- description: num_heads=4, frl_config=60, framebuffer=8192M, max_resolution=4096x2160, max_instance=1 --- name: GRID M60-8Q
  8. 在管理门户中,单击菜单:Compute[Virtual Machines]。选择一个虚拟机并点击 btn:[Edit]。此时会出现编辑虚拟机对话框
  9. 单击 Custom Properties。如果您没有看到 Custom Properties,请首先点 Show Advanced Options
  10. Custom Properties 对话框中,单击菜单:请选择一个键[mdev_type]。如果没有看到 Please select a key,请单击 btn:[+] 按钮。
  11. 在出现的文本字段中,指定以下项目:

    1. 您之前确定的 GPU 类型或类型。例如: nvidia-12。您可以使用逗号分隔列表向虚拟机中添加多个 vGPU。例如: nvidia22,nvidia22

      注意

      多个 vGPU 必须是相同的 mdev 类型。例如,您无法使用 nvidia22,nvidia15

    2. 用于确保虚拟机中始终可用的控制台的 nodisplay 选项。例如: nodisplay,nvidia22。这个选项添加第二个仿真 QXL 或 VGA 图形适配器,作为除 vGPU 之外的控制台的主要图形适配器。

现在,您已完成了主机上安装和配置 GPU,您可以继续在每个虚拟机上安装并配置 vGPU。

2.2. 在虚拟机上安装 vGPU 驱动程序

流程

  1. 运行虚拟机并使用 VNC 控制台连接到该虚拟机。

    注意

    vGPU 不支持 SPICE.

  2. 将驱动程序下载到虚拟机。有关获取驱动程序的详情,请查看 NVIDIA 网站上的 Drivers 页面
  3. 按照 NVIDIA 虚拟 GPU 软件文档中 https://docs.nvidia.com/grid/latest/grid-vgpu-user-guide/index.html#installing-grid-vgpu-display-drivers 安装 NVIDIA vGPU 软件图形驱动程序中所述,安装 vGPU 驱动程序。

    重要

    仅 Linux:在 Linux 客户机操作系统上安装驱动程序时,系统会提示您更新 xorg.conf。如果您在安装过程中没有更新 xorg.conf,则需要手动更新。如需更多信息,请参阅 第 1.5 节 “更新和启用 xorg(Linux 虚拟机)”

  4. 安装完驱动程序后,重启机器。对于 Windows 虚拟机,请从管理门户或虚拟机门户完全关闭客户机,而不是从客户机操作系统内关闭。

    重要

    仅 Windows:从 Windows 客户机操作系统内关闭虚拟机有时会将虚拟机发送到休眠模式,这不会完全清除内存,并可能导致后续问题。使用管理门户或虚拟机门户关闭虚拟机,强制其彻底清理内存。

  5. 运行虚拟机并使用其中一个支持的远程桌面协议(如 Mechdyne TGX)连接到该虚拟机,然后打开 NVIDIA Control Panel 来验证 vGPU 是否已识别。在 Windows 上,您也可以打开 Windows 设备管理器。vGPU 应显示在 Display adapters 下。如需更多信息,请参阅 NVIDIA 虚拟 GPU 软件文档中的 NVIDIA vGPU 软件图形驱动程序
  6. 为每个 vGPU 设置 NVIDIA vGPU 客户机软件许可,并在 NVIDIA 仪表板中添加许可证凭证。如需更多信息,请参阅 NVIDIA 虚拟 GPU 软件文档中 NVIDIA vGPU 软件许可增强功能

2.3. 删除 NVIDIA vGPU 设备

要更改分配的 vGPU 介质设备的配置,必须从分配的 guest 中删除现有设备。

流程

  1. 从管理门户中,单击菜单:Compute[Virtual Machines]。
  2. 右键单击虚拟机并单击关闭
  3. 虚拟机关闭后,选择虚拟机并单击 Edit。这会打开 Edit Virtual Machine 窗口。
  4. Custom Properties 选项卡上 mdev 类型旁,单击减号 btn:[-] 按钮并单击 btn:[OK]。

2.4. 监控 NVIDIA vGPU

对于 NVIDIA vGPUS,若要获取有关物理 GPU 和 vGPU 的信息,您可以通过在主机上输入 nvidia-smi 命令来使用 NVIDIA 系统管理接口。如需更多信息,请参阅 NVIDIA 虚拟 GPU 软件文档中的 NVIDIA 系统管理接口 nvidia-smi

例如:

# nvidia-smi
Thu Nov  1 17:40:09 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.62                 Driver Version: 410.62                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla M60           On   | 00000000:84:00.0 Off |                  Off |
| N/A   40C    P8    24W / 150W |   1034MiB /  8191MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla M60           On   | 00000000:85:00.0 Off |                  Off |
| N/A   33C    P8    23W / 150W |   8146MiB /  8191MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla M60           On   | 00000000:8B:00.0 Off |                  Off |
| N/A   34C    P8    24W / 150W |   8146MiB /  8191MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla M60           On   | 00000000:8C:00.0 Off |                  Off |
| N/A   45C    P8    24W / 150W |     18MiB /  8191MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0     34432    C+G   vgpu                                         508MiB |
|    0     34718    C+G   vgpu                                         508MiB |
|    1     35032    C+G   vgpu                                        8128MiB |
|    2     35032    C+G   vgpu                                        8128MiB |
+-----------------------------------------------------------------------------+

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

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

  • HP-RGS
  • Mechdyne TGX - 目前无法将 Mechdyne TGX 与 Windows Server 2016 客户机配合使用。
  • NICE DCV - 在使用此流服务时,使用固定解析设置,因为在某些情况下使用动态解析会导致黑色屏幕。