Настройка хоста OpenNebula с PCI Passtrough GPU на Ubuntu 22.04 LTS Server
Для того чтобы вкоючить поддержку PCI Passtrough есть специальная страничка от разработчиков OpenNebula, но там почему-то этот вопрос рассматривается несколько поверхностно. В данной статье будет реально рабочий вариант настройки KVM-хоста с комментариями и пояснениями.
1 Начальная настройка подчиненного хоста
1.1 Добавление репозитория OpenNebula
Т.к. начиная с Ubuntu 22.04 (а может и раньше) APT начал предупреждать что, добавление GPG-ключей в общее хранилище это не правильно и в скором времени данный метод хранения будет исключен, то ниже представленн более правильный, на мой взгляд, метод добавления репозитория OpenNebula:
|
|
1.2 Установка OpenNebula KVM node
Собственно, операция максимально проста и заключается в установке одного единственного пакета, который подтягивает все необходимое чтобы наша нода могла работать.
|
|
Чтобы не возникало вопросов с доступом к хранилищам, так же необходимо добавить правило для AppArmor:
|
|
1.3 Настройка сетевых параметров
Данный пример подразумевает, что используется самый простой способ - работа сети виртуальных машин через мост.
Сначала необходимо создать сам bridge-интерфейс, для этого файл /etc/netplan/00-installer-config.yaml
нужно привести примерно к следующему ниже виду, где настройки IP самого хоста нужно изменить в соответствии с вашей локальной сетью, а так же может отличаться имя сетевого адаптера:
|
|
После чего можно попробовать применить новые настройки с помощью netplan try
или, если вы точно уверены что все настройки верны, то можно сразу netplan apply
Далее необходимо удалить стандартную сеть KVM:
|
|
И создать новую для работы через bridge-интерфейс. Для этого необходимо создать файл host-bridge.xml
следующего содержания:
|
|
После чего определить новую сеть, запустить ее и сделать чтобы она также автоматически запускалась при загрузке хоста:
|
|
Чтобы управляющая нода могла взаимодействовать с новым хостом, нужно добавить её публичный коюч SSH на подчиненную ноду. Производитель рекомендует делать это так:
|
|
2 Настройка PCI Passtrough
Для того чтобы включить поддержки IOMMU необходимо добавить опции ядра в файле /etc/default/grub
:
Для Intel:
|
|
Для AMD:
|
|
Затем, включить загрузку соответствующих модулей в файле /etc/modules
:
|
|
И выпонить следующую комманду:
|
|
Теперь нужно сделать так чтобы для GPU, который мы будем пробрасывать не загружался системный драйвер. Наже приведен пример файла /etc/modprobe.d/blacklist.conf
, содержимое которого конечно избыточно, но за то на все случаи жизни:
|
|
После этого обновляем initramfs, выполнив:
|
|
После чего нужно перезагрузить систему и убедиться, что все получилось
Теперь, при выполнении комманды lspci -nnk
, мы должны увидеть, что к видеокарте не привязано никакого драйвера.
Чтобы убедиться, что IOMMU работает, можно выполнить комманду:
|
|
Так же признаком работы IOMMU будет наличие групп для устройств. Проверить это можно выполнив комманду find /sys/kernel/iommu_groups/ -type l
. После чего мы увидим нечто подобное:
|
|
Для устройств работающих через IOMMU нужно создать файл настроек, например /etc/modprobe.d/local.conf
, в котором будет примерно следующее содеримое (в данном случае это GeForce GTX 1050 Ti):
|
|
Если устройств несколько, то они перечисляются через запятую:
|
|
Далее мы создадим скрипт, который будет запускаться как сервис systemd, чтобы осуществить привязку драйвера vfio-pci к интересующим нас устройствам и смену владельца этих устройств на oneadmin:oneadmin
, т.к. именно от имени этого пользователя запускаются вируальные машины KVM и если этого не сделать, то мы получим ошибку “Permission denied” при запуске ВМ.
Сначала создадим файл настроек /etc/default/vfio-bind
содержащий перечень устройств разделенных пробелом, которые нужно привязать:
|
|
lspci -D
Теперь создадим сам скрипт /usr/local/bin/vfio-bind
:
|
|
И создадим сервис /etc/systemd/system/vfio-bind.service
:
|
|
После чего его нужно включить и запустить:
|
|
Чтобы убедиться, что скрипт работает, посмотрим резултат вывода комманды ls -l /dev/vfio/
. Результат должен быть примерно такой:
|
|
И вывод комманды lspci -nnk
(для GPU GeFroce GTX 1050Ti):
|
|
По умолчанию функция “PCI passtrough” отключена в OpenNebula. Чтобы ее включить нужно модифицировать файл /var/lib/one/remotes/etc/im/kvm-probes.d/pci.conf
(для KVM) на управляющей ноде OpenNebula. В нем содержатся комментарии, из которых понятно что именно нужно изменить, но я все таки приведу пример как это сделано у меня для всех GPU NVidia:
|
|
Чтобы проверить что всё работает в самой OpenNebula, нужно обновить конфигурацию шаблона ВМ, перейдя в раздел “Input/Output” и добавив нужное устройство. После создания ВМ из этого шаблона, в случае успеха, там дожно появиться наше устройство. В примере данной статьи это должна быть GPU NVidia GTX 1050 Ti. Остается только установить небходимые драйверы устройств внутри виртуальной машины и можно считать процесс настройки завершенным.