Подробный гайд по настройке VFIO (PCI Passthrough) в ALT Linux

Пошаговая настройка VFIO PCI Passthrough в ALT Linux: проброс GPU в виртуальную машину, конфигурация IOMMU, GRUB, libvirt и решение типовых проблем.

2026.05.11                  


Подробный гайд по настройке VFIO (PCI Passthrough) в ALT LinuxПодробный гайд по настройке VFIO (PCI Passthrough) в ALT Linux

Важно:

Проброс устройств через VFIO требует изменений в загрузчике, ядре и конфигурации виртуализации. Ошибки могут привести к нерабочей системе на этапе загрузки. Рекомендуется иметь запасной носитель с Live-образом ALT Linux для восстановления.


Требования и подготовка

Компонент Требование
CPU Intel VT-d или AMD-Vi (IOMMU)
Материнская плата Поддержка IOMMU в UEFI/BIOS
GPU Желательно отдельная от основной (дискретная для ВМ, встроенная/вторая для хоста)
Ядро 5.10+ (в ALT p10/p11 по умолчанию)
Пакеты libvirt, qemu, virt-manager, edk2-ovmf, polkit

1. Проверка поддержки IOMMU

dmesg | grep -e DMAR -e IOMMU

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

 `DMAR: IOMMU enabled` или `AMD-Vi: IOMMU performance counter supported`

Если пусто → проверьте настройки BIOS.


2. Настройки BIOS/UEFI

  • Включить: Intel VT-d / AMD IOMMU / SVM Mode
  • Отключить: Secure Boot (часто блокирует загрузку модулей VFIO)
  • Включить: Above 4G Decoding, Re-Size BAR Support (опционально, для современных GPU)
  • Сохранить и перезагрузиться.

Шаг 1: Включение IOMMU в загрузчике

1. Отредактируйте конфигурацию GRUB:
sudo nano /etc/default/grub
2. Найдите строку GRUB_CMDLINE_LINUX_DEFAULT и добавьте параметры:
Платформа Параметры
Intel intel_iommu=on iommu=pt
AMD amd_iommu=on iommu=pt
Пример итоговой строки:
GRUB_CMDLINE_LINUX_DEFAULT="splash quiet intel_iommu=on iommu=pt"

iommu=pt (passthrough) улучшает производительность, пропуская только устройства VFIO через IOMMU.

3. Обновите GRUB:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

Шаг 2: Привязка устройств к VFIO

1. Найдите PCI-ID устройств

lspci -nn | grep -iE "vga|3d|display"
lspci -nn | grep -i audio
Пример вывода:
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GeForce RTX 3070 [10de:2484] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation GA104 High Definition Audio Controller [10de:228b] (rev a1)

Запомните ID: 10de:2484 и 10de:228b.

2. Создайте конфигурацию modprobe
sudo nano /etc/modprobe.d/vfio.conf
Вставьте:
options vfio-pci ids=10de:2484,10de:228b
softdep nouveau pre: vfio-pci
softdep amdgpu pre: vfio-pci
softdep nvidia pre: vfio-pci
softdep snd_hda_intel pre: vfio-pci

softdep гарантирует, что VFIO загрузится до нативных драйверов.

3. Добавьте модули в initramfs

В ALT Linux используется mkinitrd.

Отредактируйте:
sudo nano /etc/mkinitrd.conf
Найдите строку MODULES и добавьте vfio vfio_iommu_type1 vfio_pci vfio_virqfd:
MODULES="vfio vfio_iommu_type1 vfio_pci vfio_virqfd"

Шаг 3: Пересборка initramfs и перезагрузка

sudo mkinitrd
sudo reboot

Проверка после загрузки:

dmesg | grep -i vfio
lspci -k -nn | grep -A2 -E "(VGA|3D|Audio)"

Устройство должно использовать драйвер vfio-pci, а не nouveau/nvidia/amdgpu.


Шаг 4: Установка стека виртуализации

sudo apt-get update
sudo apt-get install libvirt qemu-system-x86_64 virt-manager edk2-ovmf polkit

Включите сервисы и добавьте пользователя в группы:

sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt,qemu,kvm $USER

Выйдите и войдите заново, чтобы применились группы.

SELinux в ALT Linux: по умолчанию включён в режиме enforcing.

Для отладки можно временно перевести в permissive:

sudo setenforce 0

Для постоянной работы добавьте политики:

sudo setsebool -P virt_use_sysfs 1
sudo setsebool -P virt_use_execmem 1

Шаг 5: Создание ВМ с пробросом GPU

  1. Запустите virt-manager (от обычного пользователя).
2. Создайте новую ВМ:
  • Тип: Q35 (чипсет)
  • Прошивку: UEFI x86_64: /usr/share/edk2/ovmf/OVMF_CODE.fd (иногда путь /usr/share/qemu/ovmf-x86_64-code.bin)
  • CPU: host-passthrough, поставьте галочку Copy host CPU configuration
  • Видео: None (или VirtIO, если используете Looking Glass)
3. Добавление GPU:
  • Add HardwarePCI Host Device → выберите GPU и его аудио-контроллер.
    1. Запустите ВМ и установите ОС.

Правка XML (через virsh edit <vm>)

Добавьте/измените секции:

<features>
  <hyperv mode='custom'>
    <vendor_id state='on' value='1234567890ab'/>
  </hyperv>
  <kvm>
    <hidden state='on'/>
  </kvm>
</features>

Для аудио-контроллера добавьте:

<driver name='vfio'/>

Шаг 6: Типичные проблемы и решения

Проблема Решение
Error 43 (NVIDIA) Добавьте <vendor_id> и <hidden state='on'/> в XML. Используйте свежие драйверы.
Устройство не изолировано в IOMMU Проверьте find /sys/kernel/iommu_groups/ -type l. Если GPU в группе с другими устройствами, добавьте pcie_acs_override=downstream в GRUB (не рекомендуется для production).
Хост забирает GPU после загрузки Добавьте video=efifb:off nomodeset в GRUB_CMDLINE_LINUX_DEFAULT.
ВМ не запускается, падает с vfio: failed to set iommu Проверьте dmesg | grep -i iommu. Убедитесь, что intel_iommu=on/amd_iommu=on применены. Проверьте права на /dev/vfio/*.
Черный экран в ВМ Убедитесь, что используется OVMF, чипсет Q35, отключён vga в XML. Попробуйте virsh dumpxml <vm> | grep -i video.

Диагностика

# Проверка загрузки VFIO
dmesg | grep -i vfio

# Статус IOMMU
dmesg | grep -i iommu

# Группы IOMMU
find /sys/kernel/iommu_groups/ -type l

# Привязка драйверов
lspci -k -nn | grep -A3 -E "(VGA|3D|Audio)"

# Логи libvirt/QEMU
journalctl -u libvirtd -f
virsh start <vm> --console

Особенности ALT Linux

Аспект Детали
Пакетный менеджер apt-get (ALT-style), репозитории p10/p11/sisyphus
Initramfs mkinitrd (не dracut и не update-initramfs)
GRUB grub2-mkconfig -o /boot/grub2/grub.cfg
SELinux Включён по умолчанию. Требует setsebool или permissive для отладки
Ядра kernel-image-std-def или un-def. VFIO встроен в ядро, отдельные пакеты не нужны
Права на /dev/vfio Регулируются через udev и группы kvm/libvirt

Финальные рекомендации

  1. Тестируйте поэтапно: сначала проброс сетевого контроллера или USB, затем GPU.
  2. Резервное копирование: сохраните рабочие конфиги /etc/default/grub, /etc/modprobe.d/, XML ВМ.
  3. Обновления ядра: после обновления ядра всегда запускайте sudo mkinitrd.
  4. Looking Glass: для низкой задержки рассмотрите настройку shared memory + ivshmem.