KVM虚拟化如何管理虚拟机中的GPU设备?

目录

一、将GPU分配给虚拟机

1.1 先决条件

 2.2 具体步骤

 二、管理NVIDIA vGPU设备

2.1  设置NVIDIA vGPU设备

2.1.1 先决条件

 2.1.2 具体步骤

 2.2 删除NVIDIA vGPU

2.3 获取有关系统的NVIDIA vGPU信息 

2.4 NVIDIA vGPU 的远程桌面流服务 

2.5 其它资源


要增强 RHEL 8 主机上虚拟机 (VM) 的图形性能,可以将主机 GPU 分配给 VM。

  • 您可以将 GPU 与主机分离,并将 GPU 的完全控制权直接传递给 VM。
  • 您可以从物理 GPU 创建多个设备,并将这些设备作为虚拟 GPU (vGPU) 分配给多个虚拟机。目前,只有选定的 NVIDIA GPU 支持此功能,并且只能将一个中介设备分配给单个虚拟机。

重要

GPU 分配目前仅在 Intel 64 和 AMD64 系统上受支持。

一、将GPU分配给虚拟机

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

1.1 先决条件

  • 您必须在主机内核上启用 IOMMU 支持。

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

    1、使用 intel_iommu=on和iommu=pt 参数重新生成 GRUB 配置:

# grubby --args="intel_iommu=on iommu_pt" --update-kernel DEFAULT

       2、重新引导主机。

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

    请注意,在 AMD 主机上,IOMMU 默认处于启用状态,您可以添加iommu=pt以将其切换到直通模式:

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

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

    该选项仅为在直通模式下使用的设备启用 IOMMU,并提供更好的主机性能。但是,并非所有硬件都支持pt选项。即使未启用此选项,您仍然可以分配设备。

        2、重新引导主机。

 2.2 具体步骤

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

a、确定 GPU 连接到的 PCI 总线地址。

# lspci -Dnn | grep VGA
0000:02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106GL [Quadro K4000] [10de:11fa] (rev a1)

b、阻止主机的图形驱动程序使用 GPU。为此,请将 GPU PCI ID 与 pci-stub 驱动程序一起使用。

例如,以下命令可防止驱动程序绑定到在 10de:11fa 总线上连接的 GPU:

# grubby --args="pci-stub.ids=10de:11fa" --update-kernel DEFAULT

 c、重新引导主机。

2、可选

如果由于支持限制,某些 GPU 函数(如音频)无法传递到 VM,则可以修改 IOMMU 组中终结点的驱动程序绑定,以仅传递必要的 GPU 函数。

a、将 GPU 设置转换为 XML,并记下要阻止连接到主机驱动程序的终结点的 PCI 地址。

为此,请将 GPU 的 PCI 总线地址转换为与 libvirt 兼容的格式,方法是在地址中添加pci_前缀,并将分隔符转换为下划线。

例如,以下命令显示在总线地址上连接的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>

b、防止终结点连接到主机驱动程序。

本例中,为虚拟机分配图形处理器时,请避免使用图形处理器对应的端点
音频函数,<address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>, from
连接到主机音频驱动程序,而不是将端点连接到VFIO-PCI。

# driverctl set-override 0000:02:00.1 vfio-pci

3、给虚拟机绑定GPU

a、使用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>

b、将文件保存在主机系统上。

c、将文件与 VM 的 XML 配置合并。

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

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

注意

GPU 作为辅助图形设备连接到 VM。不支持将 GPU 指定为主要图形设备,并且 Red Hat 不建议在 VM 的 XML 配置中删除主要模拟图形设备。

验证

  • 该设备出现在VM的XML配置中的<devices>部分下。更多的信息,请参见虚拟机XML配置样例。

已知问题

  • 可以连接到 VM 的 GPU 数量受分配的 PCI 设备的最大数量限制,在 RHEL 8 中,该数量当前为 64 个。但是,将多个 GPU 连接到 VM 可能会导致客户机上的内存映射 I/O (MMIO) 出现问题,这可能会导致 GPU 对 VM 不可用。

    要解决这些问题,请设置更大的 64 位 MMIO 空间,并配置 vCPU 物理地址位,使扩展的 64 位 MMIO 空间可寻址。

  • 将 NVIDIA GPU 设备连接到使用 RHEL 8 客户机操作系统的 VM 当前会禁用该 VM 上的 Wayland 会话,并改为加载 Xorg 会话。这是因为 NVIDIA 驱动程序和 Wayland 之间存在不兼容性。

 二、管理NVIDIA vGPU设备

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

重要

将物理 GPU 分配给 VM,无论是否使用中介设备,都会使主机无法使用 GPU。

2.1  设置NVIDIA vGPU设备

要设置 NVIDIA vGPU 功能,您需要为 GPU 设备下载 NVIDIA vGPU 驱动程序,创建中介设备,并将其分配给预期的虚拟机。有关详细说明,请参阅下文。

2.1.1 先决条件

  • 您的 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

 2.1.2 具体步骤

1、下载 NVIDIA vGPU 驱动程序并将其安装在您的系统上。有关说明,请参阅 NVIDIA 文档

2、如果 NVIDIA 软件安装程序没有创建 /etc/modprobe.d/nvidia-installer-disablenouveau.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、准备一个 XML 文件,该文件包含基于检测到的 GPU 硬件的中介设备配置。例如,以下配置了一个 nvidia-63 vGPU 类型的中介设备,该设备运行在 0000:01:00.0 PCI 总线上,使用在上一步生成的 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、将中介设备连接到要共享 vGPU 资源的 VM。为此,请将以下行以及以前生成的 UUID 添加到 VM 的 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 一次只能分配给一个 VM。此外,如果 VM 没有 QEMU 视频设备,例如 virtio-vga,则还要在<hostdev>行上添加ramfb='on'参数

13、要使 vGPU 介导设备的全部功能在分配的 VM 上可用,请在 VM 上设置 NVIDIA vGPU 客户机软件许可。有关详细信息和说明,请参阅 NVIDIA 虚拟 GPU 软件许可证服务器用户指南

验证

1、查询您创建的 vGPU 的功能,并确保它列为活动和持久性。

# 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、启动虚拟机,并验证客户操作系统是否将中介设备检测为 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 客户机操作系统的 VM 当前会禁用该 VM 上的 Wayland 会话,并改为加载 Xorg 会话。这是因为 NVIDIA 驱动程序和 Wayland 之间存在不兼容性。

其他资源

 2.2 删除NVIDIA vGPU

要更改分配的 vGPU 介导设备的配置,您需要从分配的 VM 中删除现有设备。有关说明,请参阅下文:

先决条件

  • 要从中删除设备的 VM 已关闭。

步骤

1、获取要删除的中介设备的 ID。

# virsh nodedev-list --cap mdev
mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0

 2、停止 vGPU 中介设备的正在运行的实例。

# 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、从 VM 的 XML 配置中删除设备。为此,请使用virsh edit实用程序编辑 VM 的 XML 配置,并删除 mdex 的配置段。该段将类似于以下内容:

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

请注意,停止和分离中介设备不会删除它,而是保持其定义。因此,您可以重新启动设备并将其连接到其他 VM。

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'

验证

  • 如果您只是停止并分离了设备,请确保将调解的设备列为非活动设备。

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

其他资源

  • 命令man virsh

2.3 获取有关系统的NVIDIA vGPU信息 

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

  • 可以创建多少个给定类型的中介设备
  • 您的系统上已配置了哪些中介设备。

程序

  • 要查看主机上可支持 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

2.4 NVIDIA vGPU 的远程桌面流服务 

已启用 vGPU 或 NVIDIA GPU 直通:

HP ZCentral Remote Boost/Teradici
NICE DCV
Mechdyne TGX
有关支持详细信息,请参阅相关供应商支持矩阵。 

2.5 其它资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术瘾君子1573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值