13.2. 管理 NVIDIA vGPU 设备
vGPU 功能使得可以将物理 NVIDIA GPU 设备划分为多个虚拟设备,称为 中介设备
。然后可将这些 mediated devices 分配给多个虚拟机(VM)作为虚拟 GPU。因此,这些虚拟机可以共享单个物理 GPU 的性能。
将物理 GPU 分配给使用或不使用中介设备的虚拟机,使主机无法使用 GPU。
13.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
流程
- 下载 NVIDIA vGPU 驱动程序并在您的系统中安装它们。具体步骤请查看 NVIDIA 文档。
如果 NVIDIA 软件安装程序没有创建 /etc/modprobe.d/nvidia-installer-disable-nouveau.conf 文件,请在 /etc/modprobe.d/ 中创建一个任何名称的
conf
文件,并在文件中添加以下行:blacklist nouveau options nouveau modeset=0
为当前内核重新生成初始 ramdisk,然后重新启动。
# dracut --force # reboot
检查内核是否已加载了
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 文档。
生成设备 UUID。
# uuidgen 30820a6f-b1a5-4503-91ca-0c10ba58692a
根据检测到的 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>
根据您准备的 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
可选:验证中介设备是否被列为 inactive。
# virsh nodedev-list --cap mdev --inactive mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
启动您创建的 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
可选: 确保介质设备被列为 active。
# virsh nodedev-list --cap mdev mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
将 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
将 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'
参数。- 要使 vGPU 中介设备的全部功能在分配的虚拟机上可用,请在虚拟机上设置 NVIDIA vGPU 虚拟机软件许可。有关详情和说明,请参阅 NVIDIA Virtual GPU Software License Server User Guide。
验证
查询您创建的 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
启动虚拟机并验证客户端操作系统是否检测到 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 之间的不兼容。
其它资源
- NVIDIA vGPU 软件文档
-
man virsh
命令
13.2.2. 删除 NVIDIA vGPU 设备
要更改分配的 vGPU 介质设备 的配置,您需要从分配的虚拟机中删除现有设备。具体步骤请查看以下操作:
先决条件
- 要从中删除该设备的虚拟机关闭。
流程
获取您要删除的介质设备的 ID。
# virsh nodedev-list --cap mdev mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
停止 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'
可选: 确保中介设备已被停用。
# 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
从虚拟机 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。因此,您可以重启并把设备附加到不同的虚拟机。
可选: 要删除已停止的介质设备,请删除其定义。
# 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
命令
13.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
命令
13.2.4. 用于 NVIDIA vGPU 的远程桌面流服务
在启用了 NVIDIA vGPU 或 NVIDIA GPU 直通 的 RHEL 8 hypervisor 上支持以下远程桌面流服务:
- HP ZCentral Remote Boost/Teradici
- NICE DCV
- Mechdyne TGX
有关支持详情请查看适当的供应商支持列表。