Перед выполнением действий, описанных ниже, необходимо подключиться к терминалу сервера управления с помощью 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

Для корректной работы функций, требующих vGPU на базе программно-аппаратных решений ускорения графических вычислений в средах виртуализации (далее видеокарты с поддержкой vGPU) NVIDIA необходимо, чтобы на серверы виртуализации ПК СВ "Брест" были установлены драйверы NVIDIA согласно модели видеокарты с поддержкой vGPU.

Данные драйверы не входят в состав сертифицированных на соответствие требованиям по безопасности информации ПК СВ и ОС СН.

После установки драйверов и настройки серверов виртуализации изменяются следующие файлы ПК СВ контрольные суммы которых указаны в файле gostsums.txt состава установочного диска и его обновления:

  • /usr/bin/sprof
  • /usr/bin/rpcgen
  • /usr/bin/gencat
  • /usr/lib/x86_64-linux-gnu/libmcheck.a

Изменения контрольных сумм не являются нарушением сертифицированных характеристик ПК СВ.
Для проведения контроля целостности данные файлы могут быть исключены из проверки или установлены на контроль с обновленными контрольными суммами.

/usr/bin/sprof — отображает сводку профилирования для общего объекта (общей библиотеки), указанного в качестве первого аргумента командной строки. Сводка профилирования создается с использованием ранее сгенерированных данных профилирования во втором (необязательном) аргументе командной строки.

/usr/bin/rpcgenинструмент, который генерирует код C для реализации протокола RPC. Входные данные для rpcgen — это язык, похожий на C, известный как RPC Language (язык удаленного вызова процедур). 

/usr/bin/gencat — файл каталога сообщений (обычно *.cat), который  команда gencat создает из исходных файлов текстов сообщений (обычно *.msg). Команда gencat объединяет исходные файлы текстов сообщений, указанные параметром SourceFile, в форматированный каталог сообщений, указанный параметром CatalogFile.

/usr/lib/x86_64-linux-gnu/libmcheck.a — библиотека функции mcheck, которая устанавливает набор отладочных хуков для семейства функций выделения памяти malloc. Эти хуки вызывают определенные проверки согласованности состояния общей массы запросов в памяти. Проверки могут обнаруживать ошибки приложения, такие как освобождение блока памяти более одного раза или повреждение структур данных учета, которые непосредственно предшествуют блоку выделенной памяти.

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

Установка драйвера NVIDIA версии 470.103.02 для ядра linux-5.10-genericLink to Установка драйвера 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-genericLink to Установка драйвера 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

    Если команда uuidgen не сработала, необходимо установить пакет uuid-runtime:

    sudo apt install uuid-runtime
    CODE

    После установки пакета повторить шаг 5.

    После того, как отработает команда 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. перейти во вкладку Метки и ввести в поле Данные код пробрасываемого готового профиля:
      <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. в списке слева выбрать Диспетчер устройств: