Подробный гайд по настройке 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
- Запустите
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 Hardware→PCI Host Device→ выберите GPU и его аудио-контроллер.- Запустите ВМ и установите ОС.
Правка 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 |
Финальные рекомендации
- Тестируйте поэтапно: сначала проброс сетевого контроллера или USB, затем GPU.
- Резервное копирование: сохраните рабочие конфиги
/etc/default/grub,/etc/modprobe.d/, XML ВМ. - Обновления ядра: после обновления ядра всегда запускайте
sudo mkinitrd. - Looking Glass: для низкой задержки рассмотрите настройку shared memory +
ivshmem.