Перед выполнением действий, описанных ниже, необходимо подключиться к терминалу сервера управления с помощью SSH под учетной записью локального администратора. 

Данный пример настройки применим только для драйвера NVIDIA-Linux-x86_64-470.103.02-vgpu-kvm.run (только на ядре linux-5.10-generic) и драйвера NVIDIA-Linux-x86_64-535.161.05-vgpu-kvm.run (только на ядре linux-5.15-generic).

Настройка сервера виртуализации

Установка драйвера NVIDIA версии 470.103.02 для ядра linux-5.10-generic

Для настройки сервера виртуализации необходимо:

  1. Включить блок управления памятью для операций ввода-вывода IOMMU, для этого привести /etc/default/grub к виду:

    --------------------------------------------------------------------------------------------------------
    GRUB_CMDLINE_LINUX_DEFAULT="parsec.max_ilev=127 parsec.ccnr_relax=1 intel_iommu=on quiet net.ifnames=0"
    --------------------------------------------------------------------------------------------------------
    CODE

    и выполнить команду:

    sudo update-grub

  2. Выполнить перезагрузку сервера виртуализации и перейти в BIOS.

  3. В BIOS выполнить настройки по активации и поддержке SR-IOV и IOMMU:
    1. перейти во вкладку AdvancedPCI Subsystem support;
    2. для параметра SR-IOV Support выбрать Enabled:

    3. перейти во вкладку Socket ConfigurationII0 Configuration;
    4. для параметра Intel@ VT for Directed I/0 выбрать Enable:

    5. применить изменения, нажав комбинацию клавиш <F10+Enter>.
  4. Установить набор компиляторов:

    sudo apt install gcc make

  5. Установить ядро linux-image-5.10-generic:

    Этот шаг актуален только для драйвера NVIDIA-Linux-x86_64-470.103.02-vgpu-kvm.run. Для драйвера NVIDIA-Linux-x86_64-535.161.05-vgpu-kvm.run этот шаг нужно пропустить.

    sudo apt install linux-image-5.10-generic linux-headers-5.10-generic

  6. Отключить модуль nouveau, добавив в файл /etc/modprobe.d/blacklist.conf строку:

    blacklist nouveau
    CODE

    Необходимо выполнить перезагрузку сервера виртуализации.

  7. Установить драйвер NVIDIA:

    sudo sh ./NVIDIA-Linux-x86_64-470.103.02-vgpu-kvm.run

    Необходимо выполнить перезагрузку сервера виртуализации.

  8. Подключиться к терминалу сервера управления с помощью SSH под учетной записью локального администратора и проверить что в ОС активирован блок управления памятью для операций ввода-вывода IOMMU:

    sudo dmesg | grep -e DMAR -e IOMMU
    пример корректного вывода:

    [	1.802231] DMAR: IOMMU enabled
    CODE
  9. Проверить, что в ОС отображается видеокарта, используется драйвер NVIDIA, установлены модули VFIO и NVIDIA:

    sudo lspci -nnk -d 10de:
    Пример вывода:

    locadmin@node2:~$ sudo lspci -nnk -d 10de:
    0000:17:00.0 3D controller [0302]: NVIDIA Corporation TU10GL [Tesla T4] [10de:1eb8] (rev a1)
    		Subsystem: NVIDIA Corporation TU10GL [Tesla T4] [10de:12a2]
    		Kernel driver in use: nvidia
    		Kernel modules: nvidiafb, nouveau, nvidia_vgpu_vfio, nvidia
    CODE

Установка драйвера NVIDIA версии 535.161.05 для ядра linux-5.15-generic

Для настройки сервера виртуализации необходимо:

  1. Включить блок управления памятью для операций ввода-вывода IOMMU, для этого привести /etc/default/grub к виду:

    --------------------------------------------------------------------------------------------------------
    GRUB_CMDLINE_LINUX_DEFAULT="parsec.max_ilev=127 parsec.ccnr_relax=1 intel_iommu=on quiet net.ifnames=0"
    --------------------------------------------------------------------------------------------------------
    CODE

    и выполнить команду:

    sudo update-grub

  2. Выполнить перезагрузку сервера виртуализации и перейти в BIOS.

  3. В BIOS выполнить настройки по активации и поддержке SR-IOV и IOMMU:
    1. перейти во вкладку AdvancedPCI Subsystem support;
    2. для параметра SR-IOV Support выбрать Enabled:

    3. перейти во вкладку Socket ConfigurationII0 Configuration;
    4. для параметра Intel@ VT for Directed I/0 выбрать Enable:

    5. применить изменения, нажав комбинацию клавиш <F10+Enter>.
  4. Установить набор компиляторов:

    sudo apt install gcc make

  5. Отключить модуль nouveau, добавив в файл /etc/modprobe.d/blacklist.conf строку:

    blacklist nouveau
    CODE

    Необходимо выполнить перезагрузку сервера виртуализации.

  6. Установить драйвер NVIDIA:

    sudo sh ./NVIDIA-Linux-x86_64-535.161.05-vgpu-kvm.run

    Необходимо выполнить перезагрузку сервера виртуализации.

  7. Подключиться к терминалу сервера управления с помощью SSH под учетной записью локального администратора и проверить что в ОС активирован блок управления памятью для операций ввода-вывода IOMMU:

    sudo dmesg | grep -e DMAR -e IOMMU
    пример корректного вывода:

    [	1.802231] DMAR: IOMMU enabled
    CODE
  8. Проверить, что в ОС отображается видеокарта, используется драйвер NVIDIA, установлены модули VFIO и NVIDIA:

    sudo lspci -nnk -d 10de:
    Пример вывода:

    locadmin@node2:~$ sudo lspci -nnk -d 10de:
    0000:17:00.0 3D controller [0302]: NVIDIA Corporation TU10GL [Tesla T4] [10de:1eb8] (rev a1)
    		Subsystem: NVIDIA Corporation TU10GL [Tesla T4] [10de:12a2]
    		Kernel driver in use: nvidia
    		Kernel modules: nvidiafb, nouveau, nvidia_vgpu_vfio, nvidia
    CODE

 Настройка сервера виртуализации в конфигурации с видеокартой NVIDIA Ampere

Активировать virtfn:

sudo /usr/lib/nvidia/sriov-manage -e 0000:ca:00.0
где 0000:ca:00.0 — физический PCI-адрес видеокарты.

Необходимо активировать virtfn после каждой перезагрузки сервера виртуализации.

Чтобы просмотреть список функций ресурсов видеокарты нужно выполнить команду:

sudo ls -l /sys/bus/pci/devices/0000:ca:00.0/ | grep virtfn

Настройка сервера виртуализации в конфигурации с видеокартой NVIDIA Turing

В текущем примере используется видеокарта Turing Т4, которая не поддерживает SR-IOV активацию virtfn, потому что в данной видеокарте уже есть настроенные профили, в каждом из которых можно создать несколько устройств mdev т.к. количество available_instances больше 1.

После настройки сервера виртуализации необходимо проверить доступные готовые профили:

sudo ls /sys/bus/pci/devices/0000:17:00.0/mdev_supported_types

 Подготовка сервера виртуализации

Для подготовки сервера виртуализации необходимо:

  1. На сервере управления (если используется алгоритм RAFT, то на всех серверах управления) выполнить настройки фильтра PCI свойств узла виртуализации, для этого /var/lib/one/remotes/etc/im/kvm-probes.d/pci.conf привести к виду:

    # or
    # 
    #	:filter: '*:*'	# all devices
    #
    # or
    #
    #	:filter: '0:0'	# no devices
    #
    :filter: '*:*'
    CODE
  2. Применить команду можно одним из следующих способов:

    1. выполнить перезагрузку сервера виртуализации;
    2. в веб-интерфейсе ПК СВ в меню слева выбрать пункт меню Инфраструктура  Узлы и на открывшейся странице Узлы из списка серверов виртуализации выбрать необходимый и открыть его свойства, последовательно нажать кнопки ОтключенВыклВключить.

      Изменения могут быть не применены, если не будет нажата кнопка Выкл.

      После обновления страницы веб-интерфейса ПК СВ в свойствах узла виртуализации появится вкладка PCI и список устройств.

  3. Создать и применить правило udev, для этого:
    1. /etc/udev/rules.d/opennebula-vfio.rules привести к виду:

      SUBSYSTEM=="vfio", OWNER="oneadmin", GROUP="oneadmin", MODE="0600"
      CODE
    2. Выполнить команду:
      sudo udevadm control --reload-rules && udevadm trigger
    3. Перезагрузить сервер виртуализации:
      sudo reboot

Настройка шаблона ВМ

Перед выполнением действий, приведенных ниже, необходимо подготовить образы дисков с установленной гостевой ОС Windows 10. На основе этих образов будут развернуты ВМ с пробросом готовых профилей виртуальных функций. Для ПК СВ в текущей версии доступен единственный способ реализации — добавление virtfn через RAW Data. Этот способ позволяет контролировать используемое количество профилей виртуальных функций, делать mdev подключения постоянно хранимыми в ОС, а так же пробрасывать или менять профили virtfn в уже существующие ВМ.

Для настройки шаблона ВМ необходимо:

  1. Выбрать предпочитаемый номер ВМ из списка, выполнив:

    sudo ls -l /sys/bus/pci/devices/0000:ca:00.0/ | grep virtfn

    В данном примере была выбрана виртуальная функция virtfn23, с адресом ca:03.3.

  2. Перейти в каталог с правами привилегированного пользователя:

    sudo -i
    cd /sys/bus/pci/devices/0000:ca:00.0/virtfn23/mdev_supported_types

  3. В зависимости от установленной видеокарты, выбрать готовый профиль:

    Из серий архитектур видеокарт NVIDIA Ampere, Turing, Volta, Pascal, Maxwell, тестирование было проведено только на видеокартах NVIDIA A10 и NVIDIA T4. Работоспособность других видеокарт не гарантируется.


    1. Для NVIDIA Ampere:

      В данном примере выбран профиль A10-4Q.

    2. Для NVIDIA Turing:

      В данном примере выбран профиль Т4-4Q.

  4. Выбрать из списка готовый профиль и удостовериться, что он доступен для создания подключения mdev, командой:

    Значения для определения доступности:

    • 1 — доступен;
    • 0 — уже используется.

    Ранее выбран профиль A10-4Q, соответствующий готовому профилю nvidia-593.

    for i in *; do echo "$i" $(cat $i/name) available: $(cat $i/avail*); done

    Пример вывода:

    nvidia-588 NVIDIA A10-1B available: 1
    nvidia-589 NVIDIA A10-2B available: 1
    nvidia-590 NVIDIA A10-1Q available: 1
    nvidia-591 NVIDIA A10-2Q available: 1
    nvidia-592 NVIDIA A10-3Q available: 1
    nvidia-593 NVIDIA A10-4Q available: 1
    nvidia-594 NVIDIA A10-6Q available: 1
    nvidia-595 NVIDIA A10-8Q available: 1
    nvidia-596 NVIDIA A10-12Q available: 1
    nvidia-597 NVIDIA A10-24Q available: 1
    nvidia-598 NVIDIA A10-1A available: 1
    nvidia-599 NVIDIA A10-2A available: 1
    nvidia-600 NVIDIA A10-3A available: 1
    nvidia-601 NVIDIA A10-4A available: 1
    nvidia-602 NVIDIA A10-6A available: 1
    nvidia-603 NVIDIA A10-8A available: 1
    nvidia-604 NVIDIA A10-12A available: 1
    nvidia-605 NVIDIA A10-24A available: 1
    nvidia-610 NVIDIA A10-4C available: 1
    nvidia-611 NVIDIA A10-6C available: 1
    nvidia-612 NVIDIA A10-8C available: 1
    nvidia-613 NVIDIA A10-12C available: 1
    nvidia-614 NVIDIA A10-24C available: 1
    CODE
  5. Сгенерировать случайный UUID для создания файла подключения:

    UUID будет соответствовать готовому профилю nvidia-593. Действия, описанные ниже, аналогичны для NVIDIA Ampere и NVIDIA Turing.

    uuidgen
    echo "a65589d6-99a5-44fe-8519-1d1abea61a55" > nvidia-593/create
    mdevctl define --auto -u a65589d6-99a5-44fe-8519-1d1abea61a55

    После того, как отработает команда echo, в каталоге /dev/vfio/ будет создан mdev файл, владельцем которого станет oneadmin:oneadmin (согласно правилу udev, настроенному на шаге 3 настройки сервера виртуализации) с правами на чтение и запись. Созданный файл будет использоваться утилитой libvirt для подключения в процессе ВМ устройства выбранного профиля в гостевую ОС в качестве графического адаптера. В текущем примере mdev файл всегда будет создан с номером 297, т.к. номер 296 назначен видеокарте. Проверить список mdev можно командой (так же выполняется с правами локального администратора):

    ls -l /dev/vfio/
    Посмотреть список соответствий созданных mdev подключений:
    lsmdev
    Все подключения в выведенном списке будут отмечены defined. Эти подключения сохранены в ОС, после перезагрузки сервера виртуализации в списке активации виртуальный функций будут только эти подключения. По умолчанию создаются временный подключения, для того чтобы сделать подключение постоянным в режиме автостарт при активации virtfn после перезагрузки сервера виртуализации, необходимо выполнить команду:
    mdevctl define --auto -u $<uuid>
    где <uuid>сгенерированный ранее UUID.

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

    mdevctl undefine -u $<uuid>
    и выполнить команду его удаления:
    mdevctl stop -u $<uuid>

  6. Чтобы развернуть ВМ с созданными ранее параметрами необходимо:
    1. перейти в веб-интерфейс ПК СВ и создать шаблон ВМ;
    2. перейти во вкладку RAWdata и ввести в поле код пробрасываемого готового профиля:

      <devices>
        <hostdev mode='subsystem' type='mdev' model='vfio-pci'>
          <source>
            <address uuid='a65589d6-99a5-44fe-8519-1d1abea61a55'/>
          </source>
        </hostdev>
      </devices>
      CODE

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

      1. выключить ВМ;
      2. в веб-интерфейсе ПК СВ в меню слева выбрать ШаблоныВМ;
      3. из списка ВМ выбрать необходимую, открыть шаблон и нажать кнопку Обновить.
  7. Запустить ВМ и подключиться к ней через RDP-клиент. Так как драйвер NVIDIA уже установлен, можно проверить проброшенный готовый профиль виртуальной функции, для этого необходимо:
    1. ввести логин и пароль учетной записи в ОС гостевой ВМ;
    2. нажать кнопку Пуск, ввести comp, выбрать Управление компьютером;
    3. в списке слева выбрать Диспетчер устройств: