Настройка прямого проброса видеокарты NVIDIA в виртуальную машину (zVirt 3.X)
Аннотация
В этом документе описывается, как использовать хост с графическим процессором (GPU) для запуска виртуальных машин в zVirt для выполнения графически требовательных задач и программного обеспечения, которое не может работать без GPU.
-
nouveau
- проект по созданию свободных драйверов для видеокарт компании Nvidia с поддержкой ускорения трёхмерной графики. -
GPU -отдельное устройство персонального компьютера или игровой приставки, выполняющее графический рендеринг.
-
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 виртуальной машине, выполните следующие действия:
-
Включите
I/O Memory Management Unit (IOMMU)
, заблокируйтеnouveau
на хост-машине. -
Отсоедините GPU от хоста.
-
Присоедините GPU к виртуальной машине.
-
Установите драйвер GPU на виртуальную машину.
Эти шаги подробно описаны ниже.
-
Ваше устройство GPU поддерживает режим
GPU passthrough
. -
Ваша система входит в список проверенных серверных аппаратных платформ.
-
Чипсет хоста поддерживает
Intel VT-d
илиAMD-Vi
.
Более подробную информацию о поддерживаемом оборудовании и ПО смотрите Поддерживаемые платформы в информации о выпуске ПО NVIDIA GPU.
2.1. Включение поддержки IOMMU на хосте, внесение nouveau в черный список.
Поддержка I/O Memory Management Unit (IOMMU)
на хосте необходима для использования GPU на виртуальной машине. Последовательность действий:
-
Убедитесь, что видеокарта корректно отображается на хосте
zVirt
. Например, имя этого хоста host-gpu. Для этого последовательно перейдите . -
Перевести хост host-gpu в обслуживание. Для этого последовательно перейдите
. -
Подключитесь по 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
-
Выполните команду для внесения
nouveau
в список заблокированных драйверов.grubby --update-kernel=ALL --args="rd.driver.blacklist=nouveau"
-
Выполните команду, которая позволит добавлять физические устройства в гостевые ОС: режим 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 от хоста. Для этого выполните следующие действия:
-
На хосте определите имя слота устройства и идентификаторы устройства (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
. Запишите данные значения, они будут необходимы при выполнении следующего шага. -
-
Выполните команду для изоляции устройств и дальнейшего использования их в ВМ. Синтаксис команды `grubby --update-kernel=ALL --args="ID1,ID2" `. Например:
grubby --update-kernel=ALL --args="pci-stub.ids=10de:1bb3,10de:10fa"
-
Перезапустите хост. Для этого последовательно перейдите
. -
После перезапуска хоста, проверьте, что в файле
/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.
-
-
Выведите хост host-gpu из режима обслуживания. Для этого последовательно перейдите
.
2.3. Присоединение графического процессора к виртуальной машине
После отключения GPU от хоста необходимо добавить GPU в виртуальную машину. Последовательность действий будет следующая:
-
Для выбранной ВМ (например vm-gpu) установите параметр запуска на определённом хосте (host-gpu). Для этого последовательно выберите:
. -
Добавьте GPU в ВМ vm-gpu. Для этого последовательно выберите:
, выберите видеокарту и добавьте в подключаемые устройства.
2.4. Установка драйвера GPU на виртуальную машину
Рассмотрим процедуру установки драйвера для ОС Windows Server 2016 и CentOS 8 Stream.
2.4.1. Установка драйвера GPU на виртуальную машину c ОС Windows Server 2016
До подключения физической видеокарты к ВМ в Диспетчер устройств Windows
будет отображаться карта RedHat QXL Controller
,
-
Запустите виртуальную машину и подключитесь к ней с помощью консоли
VNC
илиSPICE
. -
Установите гостевые дополнения, если они не были установлены ранее.
-
Загрузите и установите драйвер на ВМ. Информацию о получении драйвера смотрите на странице Драйверы на сайте NVIDIA.
-
После завершения установки драйвера перезагрузите машину. Для виртуальных машин Windows полностью отключите питание гостевой машины с портала администрирования или портала виртуальных машин, а не из гостевой операционной системы. (Выключение виртуальной машины из гостевой операционной системы Windows иногда переводит виртуальную машину в спящий режим, который не полностью очищает память, что может привести к последующим проблемам. Использование портала администрирования или портала VM для выключения виртуальной машины заставляет ее полностью очистить память.)
-
В Диспетчер устройств 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)
Порядок подключения видеокарты к ВМ.
-
Установите гостевые дополнения на ВМ, если они не были установлены ранее. Произведите обновление системы, выполнив команду, например
dnf update -y
(для CentOS 8 Stream). Выключите ВМ. -
Добавьте GPU в ВМ vm-gpu. Для этого последовательно выберите:
, найдите карту в списке и добавьте в подключаемые устройства. -
Проверьте, что карта отображается в списке подключенных устройств. Например:
[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
-
Проверим, используется ли драйвер
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
-
Добавим драйвер
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
-
Сгенерируйте новую конфигурацию файла grub и перезагрузитесь, выполнив команды:
[root@dlp ~]# dracut --force [root@dlp ~]# reboot
-
После перезагрузки, проверьте, что драйвер
nouveau
не используется. Для этого выполните команду:[root@localhost ~]# lsmod | grep nouveau [root@localhost ~]#
-
Загрузите драйвер на ВМ. Информацию о получении драйвера смотрите на странице на сайте NVIDIA.
-
Добавите бит
x
для установки драйвера. Для этого выполните командуchmod +x имя_драйвера
. Например:[root@localhost ~]# chmod +x NVIDIA-Linux-x86_64-525.105.17.run
-
Установите пакеты, необходимые для работы:
-
Установка при наличии доступа в интернет:
[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 *.*
-
-
Узнайте полный путь до ядра системы. Для этого выполните команду:
[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
-
Установите драйвер 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..............
-
Перезагрузите ВМ. В графическом режиме проверьте отображение карты. Для проверки (в графическом режиме) выполните команду в терминале:
nvidia-settings&
Для проверки в режиме командной строки выполните 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 назначен виртуальной машине.
3. Дополнительная информация
Для получения дополнительной информации об использовании NVIDA vGPU в RHEL с KVM см:
-
Документацию по программному обеспечению NVIDIA Virtual GPU на https://docs.nvidia.com.