Подробный гайд: Передача идентификаторов устройств в параметры модуля 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- Загружены модули ядра:
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
Это позволит точно диагностировать причину. Удачи с настройкой проброса!