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

В данном примере используется драйвер NVIDIA-Linux-x86_64-470.103.02-vgpu-kvm.run, который содержит механизм SR-IOV manage для разблокировки virtfn. Приведенная версия драйвера работает только на ядре linux-5.10-generic. Для более новых версий драйвера возможна работа с версией ядра linux-5.15-generic.

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

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

  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:

    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
  10. Активировать 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 Tesla

В текущем примере используется видеокарта Tesla Т4, которая не поддерживает SR-IOV активацию virtfn.

Для настройки сервера виртуализации необходимо выполнить шаги 1-9, после чего проверить доступные готовые профили:

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

На основе одного выбранного готового профиля можно создать несколько устройств mdev т.к. количество available_instances больше 1.

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

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

  1. Выполнить настройки фильтра 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

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

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

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

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

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

    В данном примере был выбран номер ca:03.3.

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

    sudo -i
    cd /sys/class/mdev_bus/0000:ca:03.3/mdev_supported_types

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

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

    2. Для NVIDIA Tesla:

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

  4. Проверить название профиля командой:

    grep -l "<vGPU_type>" nvidia-*/name
    где <vGPU_type> — выбранный профиль.

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

    cat nvidia-593/available_instances

    Значения для NVIDIA Ampere:

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

    Значения для NVIDIA Tesla:

    • 1 и более — доступен;
    • 0 — используется.
  6. Сгенерировать случайный UUID для создания файла подключения:

    UUID будет соответствовать 593 профилю виртуальной функции ca:03.3. Действия, описанные ниже, аналогичны для NVIDIA Ampere и NVIDIA Tesla.

    uuidgen
    echo "a65589d6-99a5-44fe-8519-1d1abea61a55" > nvidia-592/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>

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