Альт Линукс сервер 11 с PVE 8.4. PCI(e) Passthrough

Материал из Мои проекты


⚠️ Важно: Инструкция предназначена для серверов с процессорами AMD. Для Intel замените amd_iommu=on на intel_iommu=on.

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

  • Установленный ALT Linux Server 11 с Proxmox VE 8.4
  • Процессор с поддержкой AMD-V / IOMMU (или Intel VT-d)
  • Видеокарта(ы) NVIDIA (на примере RTX 3090)
  • Доступ к консоли сервера (физический или через IPMI)

🔧 Пошаговая настройка

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

Описание: Параметры ядра активируют технологию изоляции устройств IOMMU, необходимую для безопасного проброса физических устройств в виртуальные машины.

Откройте файл /etc/default/grub и отредактируйте строку:

GRUB_CMDLINE_LINUX_DEFAULT='panic=30 splash amd_iommu=on iommu=pt'
Параметр Описание
amd_iommu=on Принудительно включает IOMMU для AMD (для Intel: intel_iommu=on)
iommu=pt Режим Pass-Through: снижает накладные расходы для устройств хоста
panic=30 Автоматическая перезагрузка через 30 сек. при критической ошибке ядра

Примените изменения:

# update-grub
# reboot now

Проверка групп IOMMU

Описание: Устройства, предназначенные для проброса, должны находиться в отдельной группе IOMMU или в группе только с зависимыми устройствами (например, видеокарта + её аудио-контроллер).

Улучшенный скрипт для диагностики (показывает все устройства, а не только NVIDIA):

# for g in /sys/kernel/iommu_groups/*; do
    echo "=== IOMMU Group ${g##*/} ==="
    for d in "$g"/devices/*; do
        lspci -nns "${d##*/}"
    done
    echo
done

Пример вывода для RTX 3090:

IOMMU Group 18:
        04:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [GeForce RTX 3090] [10de:2204] (rev a1)
        04:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef] (rev a1)

IOMMU Group 24:
        0e:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [GeForce RTX 3090] [10de:2204] (rev a1)
        0e:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef] (rev a1)

Устройство готово к пробросу, если:

  • Видеокарта и её аудио-контроллер находятся в одной группе или в отдельных изолированных группах
  • В группе нет критичных для хоста устройств (USB-контроллеры, сетевые адаптеры и т.п.)

⚠️ Если устройства в одной группе с другими: попробуйте переставить карту в другой PCI-E слот или включить ACS-override (не рекомендуется для продакшена).

Дополнительные параметры ядра (опционально)

🔸 Разрешение небезопасных прерываний

Требуется только если в dmesg есть ошибки, связанные с interrupt remapping.

# echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" >> /etc/modprobe.d/iommu_unsafe_interrupts.conf

🔸 Игнорирование MSR-регистров для Windows-ВМ

Необходимо, если виртуальная машина с Windows падает при запуске приложений типа GeForce Experience, Passmark, SiSoftware Sandra.

# echo "options kvm ignore_msrs=1" >> /etc/modprobe.d/kvm.conf

Загрузка модулей VFIO

Описание: Модули VFIO обеспечивают интерфейс для безопасного проброса устройств в виртуальные машины.

Добавьте в файл /etc/modules (или создайте /etc/modules-load.d/vfio.conf):

vfio
vfio_iommu_type1
vfio_pci
Модуль Назначение
vfio Базовый фреймворк виртуализации устройств
vfio_iommu_type1 Поддержка IOMMU типа 1
vfio_pci Драйвер для проброса PCI/PCIe-устройств

Обновление initramfs

Описание: Пересборка образа начальной загрузки необходима, чтобы модули VFIO подгружались на раннем этапе инициализации ядра.

Для большинства систем:

# update-initramfs -u -k all

Для ALT Linux Server:

# make-initrd --kernel=`uname -r`

Блокировка драйверов видеокарты на хосте

Описание: Запрещает ядру хоста загружать драйверы NVIDIA/Nouveau, чтобы устройство было свободно для проброса в ВМ.

# echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
# echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
# echo "blacklist nvidiafb" >> /etc/modprobe.d/blacklist.conf
# echo "blacklist nvidia_drm" >> /etc/modprobe.d/blacklist.conf
# echo "blacklist nvidia_modeset" >> /etc/modprobe.d/blacklist.conf

⚠️ Важно: Не используйте nvidia* с wildcard в blacklist — это может не сработать. Указывайте модули явно.

Привязка устройств к драйверу vfio-pci

Описание: Указывает ядру использовать драйвер vfio-pci для указанных устройств вместо стандартных драйверов.

Получите ID устройств:

# lspci -nn | grep "NVIDIA"
04:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [GeForce RTX 3090] [10de:2204] (rev a1)
04:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef] (rev a1)
0e:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [GeForce RTX 3090] [10de:2204] (rev a1)
0e:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef] (rev a1)

Создайте файл /etc/modprobe.d/vfio.conf:

# cat /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:2204,10de:1aef disable_vga=1
Параметр Описание
ids=10de:2204,10de:1aef ID видеокарты и аудио-контроллера (указывайте оба устройства)
disable_vga=1 Отключает эмуляцию VGA для пробрасываемого устройства (предотвращает конфликты с консолью хоста)

Финальная перезагрузка и проверка

# make-initrd --kernel=`uname -r`  # для ALT Linux
# reboot

✅ Проверка загрузки модулей:

# lsmod | grep vfio

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

vfio_pci               16384  2
vfio_pci_core          94208  1 vfio_pci
vfio_iommu_type1       45056  1
vfio                   65536  9 vfio_pci_core,vfio_iommu_type1,vfio_pci

✅ Проверка логов ядра:

# dmesg | grep -e DMAR -e IOMMU -e AMD-Vi

Ожидаемые строки:

AMD-Vi: Interrupt remapping enabled
AMD-Vi: IOMMU performance counters supported

ℹ️ Сообщение AMD-Vi: Unknown option - 'on' не является ошибкой — параметр amd_iommu=on корректен.

✅ Проверка привязки устройств:

# lspci -k -s 04:00.0  # замените на ваш BDF

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

Kernel driver in use: vfio-pci