Подробный гайд: Передача идентификаторов устройств в параметры модуля vfio-pci

Настройка vfio-pci для проброса PCI-устройств в KVM/QEMU. Передача идентификаторов GPU и других устройств в виртуальные машины Linux.

2026.05.21                  


Подробный гайд: Передача идентификаторов устройств в параметры модуля vfio-pciПодробный гайд: Передача идентификаторов устройств в параметры модуля vfio-pci Передача идентификаторов PCI-устройств в модуль vfio-pci позволяет ядру Linux привязать их к драйверу VFIO вместо стандартных драйверов (например, nouveau, nvidia, snd_hda_intel, r8169 и т.д.). Это обязательный шаг для проброса оборудования в виртуальные машины через KVM/QEMU.


Предварительные требования

1. Включен IOMMU в BIOS/UEFI:
  • Intel: VT-d
  • AMD: IOMMU / AMD-Vi
2. Параметры ядра для включения IOMMU:
  • Intel: intel_iommu=on iommu=pt
  • AMD: amd_iommu=on iommu=pt
    1. Загружены модули ядра: vfio, vfio_iommu_type1, vfio_pci (или vfio-pci в новых ядрах).

Шаг 1: Поиск идентификаторов устройств

Выполните в терминале:

lspci -nn

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

01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:2786] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:228e] (rev a1)

Вам нужны пары Vendor:Device в квадратных скобках:

  • Видеокарта: 10de:2786
  • Аудиоконтроллер (обычно привязан к GPU): 10de:228e

Важно:

Для корректного проброса GPU обычно нужно передавать оба устройства (GPU + HD Audio), иначе виртуальная машина может не загрузиться или зависать.


Шаг 2: Передача идентификаторов в vfio-pci

Существует два основных способа. Рекомендуется Способ A.


Способ A: Через modprobe (рекомендуемый)

Создайте или отредактируйте файл конфигурации:

sudo nano /etc/modprobe.d/vfio.conf

Добавьте строку:

options vfio-pci ids=10de:2786,10de:228e disable_vga=1

Разбор параметров:

  • ids= — список идентификаторов через запятую (без пробелов)
  • disable_vga=1 — отключает эмуляцию VGA BIOS в vfio-pci. Обязательно для большинства дискретных GPU, иначе возможны конфликты с хостовой видеокартой.
  • disable_idle_d3=1 — иногда требуется для устройств, которые некорректно уходят в состояние D3 (проблема встречается на некоторых чипах Realtek/AMD).

Способ B: Через параметры ядра (GRUB)

Если вы предпочитаете передавать параметры на этапе загрузки ядра:

sudo nano /etc/default/grub

В строке GRUB_CMDLINE_LINUX_DEFAULT добавьте:

vfio-pci.ids=10de:2786,10de:228e

Пример полной строки:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt vfio-pci.ids=10de:2786,10de:228e"

Обновите конфигурацию GRUB:

  • Debian/Ubuntu: sudo update-grub
  • RHEL/Fedora/Alma/Rocky: sudo grub2-mkconfig -o /boot/grub2/grub.cfg (UEFI) или /boot/grub/grub.cfg (BIOS)
  • Arch: sudo grub-mkconfig -o /boot/grub/grub.cfg

Шаг 3: Принудительная загрузка vfio-pci до родных драйверов

Чтобы гарантировать, что vfio-pci подхватит устройства до nouveau/nvidia/snd_hda_intel, добавьте зависимости:

sudo nano /etc/modprobe.d/vfio.conf

Добавьте (если используете NVIDIA + аудио):

softdep nouveau pre: vfio-pci
softdep snd_hda_intel pre: vfio-pci
softdep xhci_pci pre: vfio-pci  # если пробрасываете USB-контроллер

softdep означает: «перед загрузкой указанного модуля, сначала загрузи vfio-pci». Это безопаснее, чем blacklist.


Шаг 4: Обновление initramfs (обязательно!)

Без этого шага изменения не применятся на раннем этапе загрузки:

Дистрибутив Команда
Debian/Ubuntu/Mint sudo update-initramfs -u -k all
RHEL/CentOS/Fedora/Alma sudo dracut --force
Arch Linux sudo mkinitcpio -P
OpenSUSE sudo dracut --force

Шаг 5: Перезагрузка и проверка

Перезагрузите систему:

sudo reboot

После входа проверьте привязку:

lspci -nnk | grep -A 3 -E "VGA|Audio|Network|USB" | grep -i "vfio"

Ожидаемый вывод:

Kernel driver in use: vfio-pci
Kernel modules: nouveau, vfio-pci

Дополнительно проверьте журнал ядра:

dmesg | grep -i vfio

Пример корректного вывода:

[    1.234567] vfio-pci 0000:01:00.0: adding to iommu group 12
[    1.234568] vfio-pci 0000:01:00.0: vfio_ecap_init: hiding ecap 0x1e

Дополнительные параметры vfio-pci

Параметр Значение Когда использовать
disable_vga=1 Отключает VGA-эмуляцию Для дискретных GPU (почти всегда нужно)
disable_idle_d3=1 Отключает переход в D3 Если устройство не просыпается после сна или вызывает kernel panic
nointxmask=1 Отключает маску INTx Для старых GPU/устройств с проблемами прерываний
ids= Список Vendor:Device Основной параметр привязки

Пример комплексной конфигурации:

options vfio-pci ids=10de:2786,10de:228e disable_vga=1 disable_idle_d3=1
softdep nouveau pre: vfio-pci
softdep snd_hda_intel pre: vfio-pci

Типичные проблемы и решения

Симптом Причина Решение
Устройство всё ещё использует nouveau/nvidia vfio-pci загрузился позже Добавьте softdep, убедитесь, что update-initramfs выполнен
vfio-pci: invalid id Ошибка в формате ID Формат строго XXXX:YYYY, без 0x, без пробелов, через запятую
Виртуальная машина зависает при старте GPU Конфликт VGA BIOS Добавьте disable_vga=1
IOMMU group contains other devices Проброс невозможен из-за общей группы IOMMU Проверьте группы: find /sys/kernel/iommu_groups/ -type l. Если в группе есть системные устройства, проброс вызовет панику. Требуется pcie_acs_override=downstream,multifunction (только если понимаете риски)
dmesg показывает vfio-pci: failed to setup MSI Проблемы с прерываниями Попробуйте nointxmask=1 или отключите x2apic в BIOS/GRUB

Итоговый чек-лист

  • [ ] IOMMU включён в BIOS и ядре
  • [ ] Идентификаторы найдены через lspci -nn
  • [ ] Файл /etc/modprobe.d/vfio.conf создан с ids= и softdep
  • [ ] initramfs обновлён
  • [ ] После перезагрузки lspci -k показывает vfio-pci для нужных устройств
  • [ ] dmesg | grep vfio без ошибок

Если после выполнения всех шагов устройства не привязываются, предоставьте вывод:

lspci -nnk
dmesg | grep -iE "vfio|iommu|failed"
cat /etc/modprobe.d/vfio.conf

Это позволит точно диагностировать причину. Удачи с настройкой проброса!