Настройка прямого проброса видеокарты NVIDIA в виртуальную машину (zVirt 3.X)

Аннотация

В этом документе описывается, как использовать хост с графическим процессором (GPU) для запуска виртуальных машин в zVirt для выполнения графически требовательных задач и программного обеспечения, которое не может работать без GPU.

  1. nouveau - проект по созданию свободных драйверов для видеокарт компании Nvidia с поддержкой ускорения трёхмерной графики.

  2. GPU -отдельное устройство персонального компьютера или игровой приставки, выполняющее графический рендеринг.

  3. IOMMU - блок управления памятью для операций ввода-вывода. Так же как традиционный, процессорный блок управления памятью, который переводит виртуальные адреса, видимые процессором в физические, этот блок занимается трансляцией виртуальных адресов, видимых аппаратным устройством, в физические адреса.

1. Предисловие

Вы можете использовать хост с совместимым графическим процессором (GPU) для запуска виртуальных машин в zVirt, которые подходят для выполнения графически интенсивных задач и для запуска программного обеспечения, которое не может работать без GPU, например, CAD.

Вы можете назначить GPU виртуальной машине одним из следующих способов:

  • GPU passthrough: можно назначить GPU хоста одной виртуальной машине, чтобы виртуальная машина, а не хост, использовала GPU.

  • Virtual GPU (vGPU): Вы можете разделить физическое устройство GPU на одно или несколько виртуальных устройств, называемых опосредованными устройствами. Затем эти опосредованные устройства можно назначить одной или нескольким виртуальным машинам в качестве виртуальных GPU. Эти виртуальные машины совместно используют производительность одного физического GPU. Для некоторых GPU только одно опосредованное устройство может быть назначено одному гостю. Поддержка vGPU доступна только для некоторых NVIDIA GPU.

В данном руководстве описан режим прямого проброса видеокарты в виртуальную машину.

2. GPU device passthrough: Назначение графического процессора хоста одной виртуальной машине

zVirt поддерживает PCI VFIO, также называемое device passthrough, для некоторых GPU на базе NVIDIA PCIe в качестве не-VGA графических устройств.

Вы можете подключить один графический процессор хоста к одной виртуальной машине, передавая виртуальной машине графический процессор хоста в дополнение к одному из стандартных эмулируемых графических интерфейсов. Виртуальная машина использует эмулированное графическое устройство для предварительной загрузки и установки, а GPU берет управление на себя, когда загружаются его графические драйверы.

Чтобы назначить GPU виртуальной машине, выполните следующие действия:

  1. Включите I/O Memory Management Unit (IOMMU), заблокируйте nouveau на хост-машине.

  2. Отсоедините GPU от хоста.

  3. Присоедините GPU к виртуальной машине.

  4. Установите драйвер GPU на виртуальную машину.

Эти шаги подробно описаны ниже.

Необходимые условия:
  • Ваше устройство GPU поддерживает режим GPU passthrough.

  • Ваша система входит в список проверенных серверных аппаратных платформ.

  • Чипсет хоста поддерживает Intel VT-d или AMD-Vi.

Более подробную информацию о поддерживаемом оборудовании и ПО смотрите Поддерживаемые платформы в информации о выпуске ПО NVIDIA GPU.

2.1. Включение поддержки IOMMU на хосте, внесение nouveau в черный список.

Поддержка I/O Memory Management Unit (IOMMU) на хосте необходима для использования GPU на виртуальной машине. Последовательность действий:

  1. Убедитесь, что видеокарта корректно отображается на хосте zVirt. Например, имя этого хоста host-gpu. Для этого последовательно перейдите Ресурсы  Хосты  host-gpu  Устройства Хоста.

    hostcard1
  2. Перевести хост host-gpu в обслуживание. Для этого последовательно перейдите Ресурсы  Хосты  host-gpu  Управление  Обслуживание.

  3. Подключитесь по SSH к данному хосту. Выполните вывод содержимого файла /proc/cmdline. Пример вывода файла:

    [root@server ~]cat /proc/cmdline
    OOT_IMAGE=(hd0,msdos1)//zvirt-node-ng-3.0-0.20220410.0+1/vmlinuz-4.18.0-373.el8.x86_64 crashkernel=auto resume=/dev/mapper/znn-swap rd.lvm.lv=znn/zvirt-node-ng-3.0-0.20220410.0+1 rd.lvm.lv=znn/swap rhgb quiet root=/dev/znn/zvirt-node-ng-3.0-0.20220410.0+1 boot=UUID=d802e2a5-b7d8-4c6a-b24a-625bfd971da7 rootflags=discard img.bootid=zvirt-node-ng-3.0-0.20220410.0+1
  4. Выполните команду для внесения nouveau в список заблокированных драйверов.

    grubby --update-kernel=ALL --args="rd.driver.blacklist=nouveau"
  5. Выполните команду, которая позволит добавлять физические устройства в гостевые ОС: режим Passthrough устройств хоста и SR-IOV. Для процессоров на базе Intel и AMD команды будут отличаться.

    Intel
    grubby --update-kernel=ALL --args="intel_iommu=on"
    AMD
    grubby --update-kernel=ALL --args="amd_iommu=on"

2.2. Отсоединение GPU от хоста.

Вы не можете добавить GPU в виртуальную машину, если GPU привязан к драйверу ядра хоста, поэтому перед добавлением в виртуальную машину необходимо отвязать устройство GPU от хоста. Для этого выполните следующие действия:

  1. На хосте определите имя слота устройства и идентификаторы устройства (ID карты NVIDIA), выполнив команду lspci. Для работы команды может потребоваться пакет pciutils. Пример выполнения команды:

    [root@server ~]# lspci -Dnn | grep -i nvidia
    0000:d8:00.0 3D controller [0302]: NVIDIA Corporation GP104GL [Tesla P4] [10de:1bb3] (rev a1)
    0000:d8:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10fa] (rev a1)

    Вывод показывает, что установлено устройство NVIDIA Corporation GP104GL [Tesla P4]. Оно имеет графический контроллер и аудиоконтроллер со следующими свойствами:

    • Имя слота устройства графического контроллера 0000:d8:00.0, vendor-id:device-id для графического контроллера 10de:1bb3.

    • Имя слота аудио контроллера 0000:d8:00.1, а vendor-id:device-id для аудио контроллера 10de:10fa.

    Идентификаторами устройств будут является значения 10de:1bb3 и 10de:10fa. Запишите данные значения, они будут необходимы при выполнении следующего шага.

  2. Выполните команду для изоляции устройств и дальнейшего использования их в ВМ. Синтаксис команды `grubby --update-kernel=ALL --args="ID1,ID2" `. Например:

    grubby --update-kernel=ALL --args="pci-stub.ids=10de:1bb3,10de:10fa"
  3. Перезапустите хост. Для этого последовательно перейдите Ресурсы  Хосты  host-gpu  Управление  Перезапустить.

  4. После перезапуска хоста, проверьте, что в файле /proc/cmdline появились добавленные ранее данные. Например:

    [root@server ~]cat /proc/cmdline
    BOOT_IMAGE=(hd0,msdos1)//zvirt-node-ng-3.0-0.20220410.0+1/vmlinuz-4.18.0-373.el8.x86_64 crashkernel=auto resume=/dev/mapper/znn-swap rd.lvm.lv=znn/zvirt-node-ng-3.0-0.20220410.0+1 rd.lvm.lv=znn/swap rhgb quiet root=/dev/znn/zvirt-node-ng-3.0-0.20220410.0+1 boot=UUID=d802e2a5-b7d8-4c6a-b24a-625bfd971da7 rootflags=discard img.bootid=zvirt-node-ng-3.0-0.20220410.0+1 rd.driver.blacklist=nouveau intel_iommu=on pci-stub.ids=10de:1bb3

    Должны присутствовать следующие параметры:

    • intel_iommu=on или amd_iommu=on - IOMMU включен;

    • pci-stub.ids=10de:1bb3,10de:10fa - хост-устройство добавлено в список pci-stub.ids;

    • rd.driver.blacklist=nouveau - Nouveau занесен в черный список;

    Как видно из примера, он отличается от файла, который был рассмотрен на шаге 3.

  5. Выведите хост host-gpu из режима обслуживания. Для этого последовательно перейдите Ресурсы  Хосты  host-gpu  Управление  Включить.

2.3. Присоединение графического процессора к виртуальной машине

После отключения GPU от хоста необходимо добавить GPU в виртуальную машину. Последовательность действий будет следующая:

  1. Для выбранной ВМ (например vm-gpu) установите параметр запуска на определённом хосте (host-gpu). Для этого последовательно выберите: vm-gpu  Изменить  Хост  Запустить на указанном хосте  host-gpu.

    hostgpu1
  2. Добавьте GPU в ВМ vm-gpu. Для этого последовательно выберите: vm-gpu  Устройства хоста  Добавить устройство  host-gpu  совместимость PCI, выберите видеокарту и добавьте в подключаемые устройства.

    hostgpu2
    hostgpu3

2.4. Установка драйвера GPU на виртуальную машину

Рассмотрим процедуру установки драйвера для ОС Windows Server 2016 и CentOS 8 Stream.

2.4.1. Установка драйвера GPU на виртуальную машину c ОС Windows Server 2016

До подключения физической видеокарты к ВМ в Диспетчер устройств Windows будет отображаться карта RedHat QXL Controller,

  1. Запустите виртуальную машину и подключитесь к ней с помощью консоли VNC или SPICE.

  2. Установите гостевые дополнения, если они не были установлены ранее.

  3. Загрузите и установите драйвер на ВМ. Информацию о получении драйвера смотрите на странице Драйверы на сайте NVIDIA.

  4. После завершения установки драйвера перезагрузите машину. Для виртуальных машин Windows полностью отключите питание гостевой машины с портала администрирования или портала виртуальных машин, а не из гостевой операционной системы. (Выключение виртуальной машины из гостевой операционной системы Windows иногда переводит виртуальную машину в спящий режим, который не полностью очищает память, что может привести к последующим проблемам. Использование портала администрирования или портала VM для выключения виртуальной машины заставляет ее полностью очистить память.)

  5. В Диспетчер устройств Windows отключите стандартный графический адаптер, оставив только карту от NVIDIA.

2.4.2. Установка драйвера GPU на виртуальную машину c ОС CentOS Stream 8

До подключения физической видеокарты к ВМ, стандартное устройство будет отображаться так:

[root@localhost ~]# lspci | egrep -i *card
00:01.0 VGA compatible controller: Red Hat, Inc. QXL paravirtual graphic card (rev 05)

Порядок подключения видеокарты к ВМ.

  1. Установите гостевые дополнения на ВМ, если они не были установлены ранее. Произведите обновление системы, выполнив команду, например dnf update -y (для CentOS 8 Stream). Выключите ВМ.

  2. Добавьте GPU в ВМ vm-gpu. Для этого последовательно выберите: Ресурсы  Виртуальные машины  имя_ВМ  Устройства хоста  Добавить устройство, найдите карту в списке и добавьте в подключаемые устройства.

    hostgpu2
    hostgpu3
  3. Проверьте, что карта отображается в списке подключенных устройств. Например:

    [root@localhost ~]# lshw | grep -i NVIDIA -A 8 -B 3
               *-display
                    description: 3D controller
                    product: GP104GL [Tesla P4]
                    vendor: NVIDIA Corporation
                    physical id: 0
                    bus info: pci@0000:07:00.0
                    version: a1
                    width: 64 bits
                    clock: 33MHz
                    capabilities: pm msi pciexpress bus_master cap_list
                    configuration: driver=nouveau latency=0
                    resources: irq:73 memory:f8000000-f8ffffff memory:d0000000-dfffffff memory:e0000000-e1ffffff
  4. Проверим, используется ли драйвер nouveau на виртуальной машине. Для этого выполним команду lsmod | grep nouveau.

    [root@localhost ~]# lsmod | grep nouveau
    nouveau              2355200  0
    mxm_wmi                16384  1 nouveau
    wmi                    32768  2 mxm_wmi,nouveau
    video                  53248  1 nouveau
    i2c_algo_bit           16384  1 nouveau
    drm_display_helper    151552  1 nouveau
    drm_ttm_helper         16384  2 qxl,nouveau
    ttm                    81920  3 qxl,drm_ttm_helper,nouveau
    drm_kms_helper        167936  5 qxl,drm_display_helper,nouveau
    drm                   577536  7 drm_kms_helper,qxl,drm_display_helper,drm_ttm_helper,ttm,nouveau
  5. Добавим драйвер nouveau в blacklist. Для этого создадим файл `blacklist-nouveau.conf ` и добавим в него следующую информацию:

    [root@localhost ~]# nano /etc/modprobe.d/blacklist-nouveau.conf
    # add to the end (create new if it does not exist)
    blacklist nouveau
    options nouveau modeset=0
  6. Сгенерируйте новую конфигурацию файла grub и перезагрузитесь, выполнив команды:

    [root@dlp ~]# dracut --force
    [root@dlp ~]# reboot
  7. После перезагрузки, проверьте, что драйвер nouveau не используется. Для этого выполните команду:

    [root@localhost ~]# lsmod | grep nouveau
    [root@localhost ~]#
  8. Загрузите драйвер на ВМ. Информацию о получении драйвера смотрите на странице на сайте NVIDIA.

  9. Добавите бит x для установки драйвера. Для этого выполните команду chmod +x имя_драйвера. Например:

    [root@localhost ~]# chmod +x NVIDIA-Linux-x86_64-525.105.17.run
  10. Установите пакеты, необходимые для работы:

    • Установка при наличии доступа в интернет:

      [root@localhost ~]# dnf -y install kernel-devel kernel-headers elfutils-libelf-devel zlib-devel gcc make
    • При отсутствии доступа в интернет необходимо скачать пакеты для CentOS 8 Stream и произвести их установку:

      [root@localhost pack1_centos] # rpm -ivh  --nodeps *.*
  11. Узнайте полный путь до ядра системы. Для этого выполните команду:

    [root@localhost ~]# ll /usr/src/kernels/
    total 4
    drwxr-xr-x. 23 root root 4096 Apr 18 04:14 4.18.0-485.el8.x86_64

    В текущем примере полный путь до ядра системы будет /usr/src/kernels/4.18.0-485.el8.x86_64

  12. Установите драйвер NVIDIA, указав полный путь к ядру. Например:

    [root@localhost ~]# ./NVIDIA-Linux-x86_64-525.105.17.run --kernel-source-path /usr/src/kernels/4.18.0-485.el8.x86_64
    Verifying archive integrity... OK
    Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 525.105.17..............
  13. Перезагрузите ВМ. В графическом режиме проверьте отображение карты. Для проверки (в графическом режиме) выполните команду в терминале:

    nvidia-settings&
card linux1

Для проверки в режиме командной строки выполните nvidia-smi. Пример результата выполнения:

[root@localhost ~]# nvidia-smi
Wed Apr 19 08:50:27 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.105.17   Driver Version: 525.105.17   CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla P4            Off  | 00000000:07:00.0 Off |                  Off |
| N/A   33C    P8     7W /  75W |      4MiB /  8192MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1590      G   /usr/libexec/Xorg                   4MiB |
+-----------------------------------------------------------------------------+

Теперь GPU назначен виртуальной машине.

2.5. Удаление GPU из виртуальной машины

Для удаления видеокарты из ВМ порядок будет следующий:

  1. Включите стандартный графический адаптер в Диспетчере устройств.

  2. Удалите драйвера NVIDIA.

  3. Выключите ВМ.

  4. Последовательно перейдите Ресурсы  Виртуальные машины  имя_ВМ  Устройства хоста  Удалить устройство.

removecard1

3. Дополнительная информация

Для получения дополнительной информации об использовании NVIDA vGPU в RHEL с KVM см: