Ретрансляция PCI
Устройства PCI серверов виртуализации можно перенаправлять на виртуальные машины. Ядро на сервере виртуализации должно поддерживать ввод/вывод MMU
. Для процессоров Intel
это реализация VT-d
, для AMD
— AMD-Vi
. Кроме того, должна обеспечиватьсяозможность внесения в черный список любого драйвера, который может получить доступ к PCI-устройству, которое необходимо подключить к виртуальным машинам.
Конфигурация ядра
Конфигурация ядра должна выполняться с учетом необходимости поддержки ввода/вывода MMU
и блокировки любых драйверов, которые могут осуществлять доступ к устройствам PCI, предполагаемым для использования в виртуальных машинах. Параметр для подключения ввода/вывода MMU
:
intel_iommu=on
Необходимо также разрешить ядру загружать драйвер vfio-pci
и блокировать драйверы для выбранных карт. Например, для графической платы NVIDIA
можно применять следующие параметры:
rd.driver.pre=vfio-pci rd.driver.blacklist=nouveau
Указанные выше параметры необходимо добавить в конфигурационный файл /etc/default/grub
:
Загрузка драйвера vfio в initrd
Модули для vfio
должны быть добавлены в initrd
. Для этого необходимо:
- в конфигурационный файл
/etc/modules
добавить перечень модулей:CODE - выполнить команду:
update-initramfs -u -k all
Блокировка драйверов
Блокировка, которая определяется в параметрах ядра, должна вноситься и в настройки системы. Пример файла /etc/modprobe.d/blacklist.conf
для графической платы NVIDIA
:
Наряду с этой конфигурацией драйвер vfio
должен быть загружен с передачей идентификатора карт PCI, которые предполагается подключить к ВМ. Для того что бы узнать идентификатор PCI устройства, необходимо ввести команду:
lspci -nn
Например, для графической платы NVIDIA Grid K2
с идентификатором 10de:11bf
в конфигурационный файл /etc/modprobe.d/blacklist.conf
необходимо добавить следующую строку:
Привязка устройства к vfio
Механизм ввода/вывода MMU
разделяет устройства PCI на группы для изолирования работы памяти между устройствами и ВМ. Для добавления устройств PCI в vfio
и назначения им группы можно использовать совместно используемые скрипты.
Пример
Скрипт привязывает карту к vfio
, прописывается в файле /usr/local/bin/vfio-bind
:
Необходимо сделать этот скрипт исполняемым.
Конфигурация прописывается в файле /etc/sysconfig/vfio-bind
. Устройства указываются с PCI-адресами. Адреса можно получить командой lspci
, добавив в начало домен, как правило, 0000
.
Приведенный в примере выше скрипт необходимо добавить в автостарт системы.
Для этого следует выполнить следующие действия:
- создать службу, например
vfio-bind
, сформировав unit-файл/etc/systemd/system/vfio-bind.service
, такого содержания:CODE - перезагрузить список служб командой:
sudo systemctl daemon-reload
- добавить службу
vfio-bind
в автозагрузку командой:sudo systemctl enable vfio-bind
Конфигурация qemu
После привязки PCI к vfio
необходимо предоставить qemu-доступ к vfio-устройствам для групп, назначенных устройствам PCI. Список устройств PCI и их vfio-группу можно получить с помощью команды:
find /sys/kernel/iommu_groups/ -type l
Пример
Для карт с группами 45
, 46
и 58
в файл /etc/libvirt/qemu.conf
добавить конфигурацию:
Настройка драйвера
Единственной необходимой настройкой является фильтр для теста системы мониторинга, который получает список устройств PCI. По умолчанию тест перечисляет все устройств PCI, имеющиеся на сервере виртуализации. Для изменения данного списка можно изменить настройки фильтра в файле /var/lib/one/remotes/im/kvm-probes.d/pci.rb
и установить список с таким же форматом lspci
:
Настройка использования устройств PCI
Основным действием по настройке является просмотр информации о сервере виртуализации в интерфейсе командной строки или в веб-интерфейсе ПК СВ, обнаружение доступных устройств PCI и добавление желаемого устройства в шаблон. Устройства PCI можно добавлять, указывая значения параметров vendor
(производитель), device
(устройство) и class
(класс). В ПК СВ виртуальная машина будет развернута только на сервере виртуализации с имеющимся устройством PCI. Если таких серверов виртуализации нет, в журнале планировщика появится сообщение об ошибке.
В интерфейсе командной строки перечень доступных устройств PCI на сервере виртуализации (секция PCI DEVICES
) можно просмотреть командой:
onehost show <идентификатор_сервера_виртуализации>
Пример
Список устройств PCI сервера виртуализации с идентификатором 0:
onehost show 0
пример вывода:
где:
VM
— идентификационный номер ВМ, использующей данное устройство. Не указывается, если это устройство не используется ни одной ВМ;ADDR
— адрес на шине PCI;TYPE
(тип) — значения описания устройства, в формате vendor:device:class. Данные значения используются при выборе устройства PCI для перенаправления;NAME
(имя) — имя устройства PCI.
Для обеспечения перенаправления одного из устройств PCI, в шаблон ВМ необходимо добавить блок параметров PCI
, с помощью которого производится выбор устройства для использования. Например, для устройства Haswell-ULT HD Audio Controller
:
Устройство может быть также указано без всех типовых значений. Например, для получения любых портов PCI Express Root Ports в шаблон ВМ можно добавить:
Для подключения более одного устройства PCI в шаблоне ВМ необходимо добавить дополнительные блоки параметров PCI.
В веб-интерфейсе ПК СВ для отображения доступных устройств PCI сервера виртуализации, необходимо:
- В меню слева выбрать пункт меню Инфраструктура — Узлы.
- На открывшейся странице Узлы открыть вкладку PCI:
Для добавления устройства PCI в шаблон ВМ в веб-интерфейсе ПК СВ необходимо выполнить следующие действия: