В данной статье показано предоставление доступа к PCI-устройству на примере аудиоконтроллера. 

Драйвер VFIO (виртуальный ввод-вывод функций) представляет собой новую среду драйверов пользовательского уровня для ОС семейства Linux. Этот драйвер заменяет обычное назначение устройств KVM PCI passthrough. VFIO предоставляет прямой доступ устройства к пользовательскому пространству в защищенной среде безопасной памяти (IOMMU). IOMMU сопоставляет видимый устройству виртуальный адрес (виртуальный адрес ввода-вывода или IOVA) с адресом физической памяти.

Пример предоставления доступа к PCI-устройству

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

  1. Посмотреть адрес устройства:

sudo lspci -nn | egrep -w 'Audio'

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

00:1f.3 Audio device [0403]: Intel Corporation Cannon Point-LP High Definition Audio Controller [8086:9dc8] (rev 30)
CODE

где:

    • vendor = '8086' — код производителя устройства;

    • device = '9dc8' — код устройства;

    • class = '0403' — класс устройства.

  1. На сервере виртуализации (на котором планируется предоставление доступа к этому контроллеру процессам ВМ) занести данные об устройстве в vfio-pci id одним из двух способов:
    1. добавить данные устройства в /etc/default/grub:

      quiet splash intel_iommu=on vfio-pci.ids=8086:9dc8

    2. добавить данные устройства в конфигурационный файл VFIO /etc/modprobe.d/vfio.conf:

      options vfio-pci ids=8086:9dc8

  2. Активировать автозагрузку модулей VFIO в /etc/modules:

    vfio
    vfio_iommu_type1
    vfio_pci
    vfio_virqfd

  3. Обновить все модули initramfs:

    sudo update-initramfs -u -k all
    где:

    • "-u" — обновить существующий initramfs;
    • "-k all" — обновить все версии ядра.
  4. Обновить Grub:

    sudo update-grub

  5. Перезагрузить сервер виртуализации. Во время перезагрузки перейти в BIOS и включить VT-d (IOMMU) и SR-IOV:
    1. перейти во вкладку Advanced  PCI Subsystem support;
    2. для параметра SR-IOV Support выбрать Enabled:

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

      1. применить изменения, нажав комбинацию клавиш <F10+Enter>.
  6. После перезагрузки проверить статус IOMMU:

    sudo dmesg | grep -e DMAR -e IOMMU
    Вывод команды должен быть:

    IOMMU enabled
    CODE
  7.  Проверить чем перехвачено устройство:

    sudo lspci -nnk
    Вывод команды должен быть:

    Kernel driver in use: vfio-pci
    CODE

    Доступные PCI-устройства для узла можно посмотреть в веб-интерфейсе ПК СВ "Брест". Для этого необходимо:

    1. В левом меню веб-интерфейса выбрать ИнфраструктураУзлы.
    2. Из открывшегося списка доступных узлов выбрать интересующий:

      На открывшейся странице узла во вкладке PCI отобразится список PCI-устройств.
  8. В веб-интерфейсе ПК СВ в левом меню выбрать ШаблоныВМ.
  9. Из списка шаблонов ВМ выбрать тот, которому необходимо предоставить доступ к PCI-устройству и нажать на кнопку Изменить шаблон.
  10. На странице Изменить шаблон ВМ перейти во вкладку Ввод/Вывод.
  11. В области PCI-устройства нажать кнопку + и выбрать необходимое устройство из выпадающего списка Имя устройства:

  12. На странице Изменить шаблон ВМ нажать кнопку Обновить.