在 Red Hat Virtualization 中为虚拟机设置 NVIDIA GPU
如何在 Red Hat Virtualization 中配置虚拟机以使用专用的 GPU 或 vGPU。
摘要
前言 复制链接链接已复制到粘贴板!
您可以使用带有兼容图形处理单元(GPU)的主机,在 Red Hat Virtualization 中运行适合图形密集型任务的虚拟机以及运行在没有 GPU(如 CAD)运行的软件。
您可以使用以下方法之一为虚拟机分配 GPU:
- GPU passthrough :您可以将主机 GPU 分配给单个虚拟机,因此是虚拟机而不是主机在使用 GPU。
虚拟 GPU(vGPU) :您可以将物理 GPU 设备划分为一个或多个虚拟设备,称为 介质设备。然后,您可以将这些介质设备分配给一个或多个虚拟机作为虚拟 GPU。这些虚拟机可以共享单个物理 GPU 的性能。对于某些 GPU,单个虚拟机只能分配一个介质设备。vGPU 支持只在选择的 NVIDIA GPU 上可用。
例如:
主机有四个 GPU。每个 GPU 最多支持 16 vGPU,共 64 个 vGPU。以下是一些可能的 vGPU 分配:
- 一台带有 64 个 vGPU 的虚拟机
- 64 台虚拟机,每个虚拟机均具有一个 vGPU
- 32 个虚拟机,每个有一个 vGPU;8 个虚拟机,每个配备 2 个 vGPU;4 个虚拟机,每个具有 4 个 vGPU
第 1 章 GPU 设备透传:将主机 GPU 分配给一个虚拟机 复制链接链接已复制到粘贴板!
Red Hat Virtualization 支持 PCI VFIO(也称为设备透传)作为非VGA 图形设备,适用于某些基于 NVIDIA PCIe 的 GPU 设备。
除了标准模拟图形界面之一外,您还可以通过主机 GPU 将一个或多个主机 GPU 附加到单个虚拟机。虚拟机使用仿真图形设备进行预引导和安装,并且 GPU 在加载其图形驱动程序时进行控制。
有关您可以传递给单个虚拟机的具体主机 GPU 数量的信息,请参阅 NVIDIA 网站。
要为虚拟机分配 GPU,请按照以下步骤执行:
这些步骤的详情如下。
先决条件
- 您的 GPU 设备支持 GPU 透传模式。
- 您的系统被列为是已经过验证的有效服务器硬件平台。
- 您的主机芯片组支持 Intel VT-d 或 AMD-Vi
有关支持的硬件和软件的更多信息,请参阅 NVIDIA GPU 软件发行注记中的验证的平台。
1.1. 启用主机 IOMMU 支持和将 nouveau 列入黑名单 复制链接链接已复制到粘贴板!
在主机上需要支持 I/O 内存管理单元(IOMMU)在虚拟机上使用 GPU。
流程
- 在管理门户中,点 Edit Hosts 窗格。 → 。选择主机,再点 。此时会显示
- 点 Kernel 选项卡。
-
选中 Hostdev Passthrough 和 SR-IOV 复选框。此复选框通过在内核命令行中添加
intel_iommu=on
或amd_iommu=on
来为带有 Intel VT-d 或 AMD Vi 的主机启用 IOMMU 支持。 - 选中 Blacklist Nouveau 复选框。
- 点击 。
- 选择主机,再单击 → 。
- 点 → 。
- 重新安装完成后,重启主机机器。
- 主机计算机重新引导后,点 → 。
1.2. 从主机中分离 GPU 复制链接链接已复制到粘贴板!
如果 GPU 绑定到主机内核驱动程序,则无法将 GPU 添加到虚拟机,因此您必须在主机中取消绑定 GPU 设备,然后才能将其添加到虚拟机。主机驱动程序通常不支持 GPU 的动态绑定,因此建议手动将设备从绑定到主机驱动程序中排除。
流程
在主机上,运行
lspci
命令识别该设备的设备插槽名称和 ID。在以下示例中,使用 NVIDIA Quadro 或 GRID 卡等图形控制器:lspci -Dnn | grep -i NVIDIA
# 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)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示安装了 NVIDIA GK104 设备。它具有图形控制器和带有以下属性的音频控制器:
-
图形控制器的设备插槽名称为
0000:03:00.0
,而 graphics 控制器的 vendor-id:device-id 是10de:11b4
。 -
音频控制器的设备插槽名称为
0000:03:00.1
,音频控制器的 vendor-id:device-id 是10de:0e0a
。
-
图形控制器的设备插槽名称为
防止主机机器驱动程序使用 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"
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"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为 pci-stub 添加附加厂商 ID 和设备 ID 时,使用逗号分隔它们。
使用 grub2-mkconfig 重新生成引导装载程序配置使其包含这个选项,如下所示:
grub2-mkconfig -o /etc/grub2.cfg
# grub2-mkconfig -o /etc/grub2.cfg
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在使用基于 UEFI 的主机时,目标文件应为
/etc/grub2-efi.cfg
。- 重启主机机器。
确认启用了 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 pci-stub.ids=10de:11b4,10de:0e0a rdblacklist=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 Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.3. 将 GPU 附加到虚拟机 复制链接链接已复制到粘贴板!
从主机内核驱动程序取消绑定 GPU 后,您可以将其添加到虚拟机并启用正确的驱动程序。
流程
- 按照虚拟机管理指南中的将主机设备添加到虚拟机中的步骤进行操作。
- 运行虚拟机并登录该虚拟机。
- 在虚拟机上安装 NVIDIA GPU 驱动程序。详情请查看 第 1.4 节 “在虚拟机上安装 GPU 驱动程序”。
使用
lspci -nnk
命令,验证是否为 GPU 使用了正确的内核驱动程序。例如:lspci -nnk
# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4. 在虚拟机上安装 GPU 驱动程序 复制链接链接已复制到粘贴板!
流程
- 运行虚拟机并使用串行控制台(如 SPICE 或 VNC)连接到该控制台。
- 将驱动程序下载到虚拟机。有关获取驱动程序的详情,请查看 NVIDIA 网站上的驱动程序页面。
安装 GPU 驱动程序。
重要仅限 Linux: 在 Linux 客户机操作系统上安装驱动程序时,系统将提示您更新 xorg.conf。如果您不在安装过程中更新 xorg.conf,则需要手动更新它。更多信息请参阅 第 1.5 节 “更新和启用 xorg(Linux 虚拟机)”。
在驱动程序完成安装后,重启机器。对于 Windows 虚拟机, 从管理门户或虚拟机门户中完全关闭客户机,而不是从客户机操作系统中。
重要仅 Windows: 从 Windows 虚拟机操作系统中关闭虚拟机有时会将虚拟机变为休眠模式,这不会完全清除内存,并可能会导致后续的问题。使用管理门户或虚拟机门户关闭虚拟机会强制完全清理内存。
- 将监视器连接到主机 GPU 输出接口,并运行虚拟机。
- 为每个 vGPU 设置 NVIDIA vGPU 客户机软件许可,并在 NVIDIA 控制面板中添加许可证凭证。如需更多信息,请参阅 NVIDIA Virtual GPU 软件文档中的 NVIDIA vGPU 软件许可证的使用方法。
1.5. 更新和启用 xorg(Linux 虚拟机) 复制链接链接已复制到粘贴板!
在在虚拟机上使用 GPU 之前,您需要在虚拟机上更新并启用 xorg。NVIDIA 驱动程序安装应该自动执行此操作。查看 /etc/X11/xorg.conf
来检查 xorg 是否已更新并启用:
cat /etc/X11/xorg.conf
# 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
# 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
流程
在虚拟机上,使用以下命令生成
xorg.conf
文件:X -configure
# X -configure
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令,将
xorg.conf
文件复制到/etc/X11/xorg.conf
:cp /root/xorg.conf.new /etc/X11/xorg.conf
# cp /root/xorg.conf.new /etc/X11/xorg.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 重启虚拟机。
通过查看
/etc/X11/xorg.conf
来验证 xorg 是否已更新并启用:cat /etc/X11/xorg.conf
# cat /etc/X11/xorg.conf
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 搜索
Device
部分。您应该看到类似如下的条目:Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" EndSection
Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" EndSection
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
GPU 现在分配到虚拟机。
第 2 章 分配虚拟 GPU 复制链接链接已复制到粘贴板!
要设置 NVIDIA vGPU 设备,您需要:
- 为您的 GPU 设备获取并安装正确的 NVIDIA vGPU 驱动程序
- 创建介质设备
- 为虚拟机分配每个介质设备
- 在每个虚拟机上安装客户机驱动程序。
以下流程解释了此过程。
2.1. 在主机上设置 NVIDIA vGPU 设备 复制链接链接已复制到粘贴板!
在客户端操作系统中安装 NVIDIA vGPU 驱动程序前,您需要理解许可要求并获取正确的许可证凭证。
先决条件
- 您的 GPU 设备支持虚拟 GPU(vGPU)功能。
- 您的系统被列为是已经过验证的有效服务器硬件平台。
有关支持的 GPU 和验证平台的更多信息,请参阅 www.nvidia.com 上的 NVIDIA vGPU CERTIFIED SERVERS。
流程
- 为主机下载并安装 NVIDIA 驱动程序。有关获取驱动程序的详情,请查看 NVIDIA 网站上的驱动程序页面。
-
如果 NVIDIA 软件安装程序没有创建
/etc/modprobe.d/nvidia-installer-disable-nouveau.conf
文件,请手动创建。 在文本编辑器中打开
/etc/modprobe.d/nvidia-installer-disable-nouveau.conf
文件,并在文件末尾添加以下行:blacklist nouveau options nouveau modeset=0
blacklist nouveau options nouveau modeset=0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为当前内核重新生成初始 ramdisk,然后重新启动:
dracut --force reboot
# dracut --force # reboot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,如果您需要使用带有介质设备的之前支持的内核版本,请为所有安装的内核版本重新生成初始 ramdisk:
dracut --regenerate-all --force reboot
# dracut --regenerate-all --force # reboot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查内核是否已载入
nvidia_vgpu_vfio
模块:lsmod | grep nvidia_vgpu_vfio
# lsmod | grep nvidia_vgpu_vfio
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
nvidia-vgpu-mgr.service
服务是否正在运行:systemctl status nvidia-vgpu-mgr.service
# systemctl status nvidia-vgpu-mgr.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过在终端或者在脚本中输入以下行来获取可用 mdev 类型列表:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意有关特定 GPU 设备的
type-id
值,请参阅 Virtual GPU 软件文档中的虚拟 GPU 类型。请注意,只有 Q-series NVIDIA vGPU(如 GRID P4-2Q)支持 Linux 虚拟机上的介质设备 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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 在管理门户中,点 Edit Virtual Machine 对话框。 → 。选择一个虚拟机并点击 。此时会出现
- 点自定义属性。如果没有出现自定义属性,请首先单击 Show Advanced Options。
- 在 Custom Properties 对话框中,点 → 。如果没有出现 Please select a key,点 按钮。
在出现的文本字段中,输入您之前识别的 GPU 类型或类型。例如: nvidia-12。您可以使用一个以逗号分隔的列表为一个虚拟机添加多个 vGPU。例如:nvidia22,nvidia22.
注意多个 vGPU 必须是相同的 mdev 类型。例如您不能使用 nvidia22,nvidia15。
现在,已完成在主机上安装和配置 GPU,您可以继续在每个虚拟机上安装和配置 vGPU。
2.2. 在虚拟机上安装 vGPU 驱动程序 复制链接链接已复制到粘贴板!
流程
- 运行虚拟机并使用串行控制台(如 SPICE 或 VNC)连接到该控制台。
- 将驱动程序下载到虚拟机。有关获取驱动程序的详情,请查看 NVIDIA 网站上的驱动程序页面。
安装 vGPU 驱动程序,按照 NVIDIA Virtual GPU 软件文档中的安装 NVIDIA vGPU Software Graphics Driver 中的说明。
重要仅限 Linux: 在 Linux 客户机操作系统上安装驱动程序时,系统将提示您更新 xorg.conf。如果您不在安装过程中更新 xorg.conf,则需要手动更新它。更多信息请参阅 第 1.5 节 “更新和启用 xorg(Linux 虚拟机)”。
在驱动程序完成安装后,重启机器。对于 Windows 虚拟机, 从管理门户或虚拟机门户中完全关闭客户机,而不是从客户机操作系统中。
重要仅 Windows: 从 Windows 虚拟机操作系统中关闭虚拟机有时会将虚拟机变为休眠模式,这不会完全清除内存,并可能会导致后续的问题。使用管理门户或虚拟机门户关闭虚拟机会强制完全清理内存。
- 运行虚拟机并使用其中一个支持的远程桌面协议(如 Mechdyne TGX)连接到该虚拟机,并通过打开 NVIDIA Control Panel 进行验证。在 Windows 上,您还可以打开 Windows Device Manager。vGPU 应显示在 Display 适配器 下。如需更多信息,请参阅 NVIDIA Virtual GPU 软件文档中的 NVIDIA vGPU 软件图形驱动程序。
- 为每个 vGPU 设置 NVIDIA vGPU 客户机软件许可,并在 NVIDIA 控制面板中添加许可证凭证。如需更多信息,请参阅 NVIDIA Virtual GPU 软件文档中的 NVIDIA vGPU 软件许可证的使用方法。
2.3. 删除 NVIDIA vGPU 设备 复制链接链接已复制到粘贴板!
要更改分配的 vGPU 介质设备的配置,必须将现有设备从分配的客户端中删除。
流程
- 在管理门户中,点 → 。
- 右键单击虚拟机,再点关闭。
- 虚拟机关闭后,选择虚拟机并点编辑。这会打开 Edit Virtual Machine 窗口。
- 在自定义属性选项卡上,点 mdev 类型 旁边的减号 按钮,然后单击确定。
2.4. 监控 NVIDIA vGPU 复制链接链接已复制到粘贴板!
对于 NVIDIA vGPUS,若要获取物理 GPU 和 vGPU 的信息,您可以通过在主机上输入 nvidia-smi
命令来使用 NVIDIA System Management Interface。如需更多信息,请参阅 NVIDIA Virtual GPU 软件文档中的 NVIDIA 系统管理接口 nvidia-smi。
例如:
2.5. 用于 NVIDIA vGPU 的远程桌面流服务 复制链接链接已复制到粘贴板!
以下远程桌面流服务已被成功测试,以便在 RHEL 8 中与 NVIDIA vGPU 功能一起使用:
- HP-RGS
- Mechdyne TGX - 目前无法在 Windows Server 2016 客户机中使用 Mechdyne TGX。
- NICE DCV - 当使用此流服务时,红帽建议使用固定分辨率设置,因为在某些情况下使用动态解析会导致一个黑色。
不支持 SPICE。