Проброс PCI-устройств в Proxmox VE: полное руководство

Команда lspci -nn показывает видеокарту и сетевой контроллер на хосте Proxmox, но виртуальная машина их не видит — типичный признак того, что проброс PCI-устройства не настроен или настроен частично. Чаще всего причина кроется в отключённом IOMMU в BIOS, отсутствии модулей VFIO или в том, что устройство осталось занятым драйвером хоста.

Проброс (PCI passthrough) позволяет отдать физическое устройство — видеокарту, сетевой адаптер, USB-контроллер или NVMe-диск — напрямую в виртуальную машину, минуя гипервизор. Гостевая система получает почти «голое» железо с минимальными потерями производительности. В этой статье разберём весь путь: от проверки поддержки IOMMU до устранения типичных ошибок при запуске ВМ.

Проверка поддержки IOMMU и подготовка BIOS

Прежде чем трогать конфигурацию Proxmox, убедитесь, что оборудование вообще поддерживает технологию. Для процессоров Intel нужна поддержка VT-d, для AMDAMD-Vi. Кроме того, требуется включённая виртуализация (VT-x или AMD-V) и, желательно, поддержка ACS-override-совместимой топологии PCIe.

Зайдите в BIOS/UEFI материнской платы и активируйте соответствующие опции. Названия пунктов меню различаются у разных производителей: ищите Intel VT-d, AMD IOMMU, IOMMU Controller или SR-IOV в разделах Advanced, Chipset или North Bridge. Точное расположение сверяйте с документацией на вашу плату — универсального пути не существует.

  • 🔧 Включите VT-d (Intel) или IOMMU (AMD) в BIOS
  • ⚡ Убедитесь, что виртуализация VT-x / AMD-V активна
  • 🖥️ Для проброса видеокарты отключите её использование хостом (или настройте второй GPU)
  • 💾 Сохраните настройки и полностью перезагрузите сервер

После загрузки проверьте, что ядро видит IOMMU. Выполните в консоли хоста:

dmesg | grep -e DMAR -e IOMMU

Если вывод пуст — либо IOMMU не включён в BIOS, либо не передан нужный параметр ядра. Об этом следующий раздел.

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

Даже при активном IOMMU в BIOS ядру Linux нужно явно указать, что технологию следует использовать. Откройте файл /etc/default/grub и найдите строку GRUB_CMDLINE_LINUX_DEFAULT. Для систем на Intel добавьте параметр intel_iommu=on, для AMD — amd_iommu=on.

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

Если сервер использует systemd-boot (обычно при установке на ZFS в режиме UEFI), редактируется другой файл — /etc/kernel/cmdline, а изменения применяются командой proxmox-boot-tool refresh. Для классического GRUB после правки выполните:

update-grub
⚠️ Внимание: ошибка в параметрах загрузки может сделать систему незагружаемой. Перед правкой сохраните копию исходного файла и убедитесь, что у вас есть доступ к консоли сервера (IPMI, физический монитор), а не только SSH.

Перезагрузите хост и снова проверьте вывод dmesg | grep -e DMAR -e IOMMU. Появление строк о инициализации DMAR или AMD-Vi означает, что IOMMU заработал.

📊 Какое устройство вы пробрасываете в ВМ?
Видеокарта (GPU)
Сетевая карта
USB-контроллер
NVMe-диск или HBA

Загрузка модулей VFIO и отвязка устройства от хоста

Чтобы гипервизор мог отдать устройство виртуальной машине, его должен контролировать специальный драйвер VFIO, а не обычный драйвер хоста. Добавьте модули в файл /etc/modules:

vfio

vfio_iommu_type1

vfio_pci

vfio_virqfd

Затем определите PCI-адрес и идентификаторы устройства. Команда lspci -nn покажет что-то вроде 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation ... [10de:1b80]. Здесь 01:00.0 — адрес на шине, а 10de:1b80 — vendor:device ID. Для видеокарт обычно нужно забирать и парное аудиоустройство (например, 01:00.1).

Чтобы хост не захватывал устройство при загрузке, создайте файл /etc/modprobe.d/vfio.conf с привязкой по ID:

options vfio-pci ids=10de:1b80,10de:10f0

Дополнительно может потребоваться занести в чёрный список штатные драйверы (nouveau, nvidia, radeon, amdgpu) через файлы в /etc/modprobe.d/ — это зависит от того, какой драйвер реально загружается на вашем хосте. Проверить текущий драйвер устройства можно командой lspci -k. После всех правок выполните update-initramfs -u -k all и перезагрузитесь.

Добавление PCI-устройства в виртуальную машину

Теперь сама настройка ВМ. Откройте веб-интерфейс Proxmox, выберите виртуальную машину и перейдите в раздел Hardware → Add → PCI Device. В выпадающем списке найдите нужное устройство по адресу и названию. Для видеокарты отметьте опции All Functions (захват всех функций устройства), Primary GPU и при необходимости PCI-Express.

Те же действия из консоли выполняются командой qm set:

qm set 100 --hostpci0 01:00,pcie=1,x-vga=1

Здесь 100 — идентификатор ВМ, а 01:00 — адрес устройства. Опция x-vga=1 применяется для основной видеокарты гостя. Обратите внимание: для Windows-гостей с проброшенным GPU обычно требуется тип машины q35 и BIOS OVMF (UEFI) вместо SeaBIOS.

☑️ Готовность ВМ к пробросу GPU

Выполнено: 0 / 5
⚠️ Внимание: при переключении ВМ на OVMF (UEFI) уже установленная в режиме Legacy система Windows может перестать загружаться. Меняйте тип BIOS до установки ОС или будьте готовы к переустановке.

Особенности проброса видеокарт NVIDIA и AMD

Проброс GPU — самая частая и самая капризная задача. Видеокарты NVIDIA потребительского сегмента (серии GeForce) содержат программную проверку на виртуализацию: драйвер может завершаться с ошибкой Code 43 в Windows-госте. Обходится это сокрытием признаков виртуальной машины — добавлением параметра hidden=1 к CPU в конфигурации ВМ:

qm set 100 --cpu host,hidden=1

Актуальность таких обходов зависит от версии драйвера и модели карты — сверяйтесь с актуальными руководствами для вашей конфигурации. У карт AMD своя особенность: часть моделей страдает от reset bug, когда устройство некорректно сбрасывается после выключения ВМ и требует перезагрузки всего хоста.

  • 🎮 Для NVIDIA: скрывайте KVM-признаки через hidden=1
  • 🔥 Для AMD: проверьте наличие reset bug на вашей модели до покупки
  • 📦 Всегда пробрасывайте GPU вместе с его HDMI/DP-аудиофункцией
  • 🖥️ Заранее продумайте, как выводить изображение: физический монитор, Sunshine/Moonlight, Parsec, RDP
Что делать, если хост теряет изображение после включения vfio

Это нормально, если вы отобрали у хоста единственную видеокарту. Управляйте сервером через веб-интерфейс с другого устройства или используйте встроенную графику процессора (iGPU) для хоста, а дискретную карту отдайте в ВМ.

Типичные ошибки и их диагностика

Даже при правильной настройке проброс может не работать. Ниже — таблица частых симптомов и направлений диагностики. Точное поведение зависит от версии Proxmox VE и оборудования, поэтому рассматривайте её как отправную точку.

СимптомВероятная причинаЧто проверить
ВМ не стартует, ошибка IOMMU groupУстройство в общей группе с другимиСостав группы, параметр pcie_acs_override
Code 43 в WindowsДрайвер NVIDIA обнаружил ВМПараметр hidden=1, свежесть драйвера
Устройство не появляется в списке Add → PCIIOMMU выключен или не загружены модулиdmesg, /etc/modules, параметры ядра
Чёрный экран после старта ВМКонфликт с виртуальным дисплеем или ROMТип Display в ВМ, необходимость romfile
Хост зависает при запуске ВМДрайвер хоста не отвязан от устройстваlspci -k — должен быть vfio-pci

Ключевая диагностическая команда — lspci -k: в строке Kernel driver in use для пробрасываемого устройства должно стоять vfio-pci. Если там любой другой драйвер — хост захватил устройство, и ВМ его не получит. Также полезен журнал ВМ: journalctl -u pve-guests и лог конкретной машины в /var/log/pve/tasks/.

Производительность и ограничения проброса

Правильно настроенный passthrough даёт гостю производительность, близкую к нативной, — накладные расходы гипервизора на ввод-вывод минимальны. Однако есть ограничения, о которых стоит знать заранее. Проброшенное устройство закрепляется за одной ВМ и недоступно остальным. Живая миграция ВМ с PCI-устройством, как правило, невозможна — это важно учитывать при планировании кластера.

Для максимальной отзывчивости гостя с GPU дополнительно настраивают hugepages и привязку ядер (CPU pinning), но это уже оптимизации второго уровня. Сначала добейтесь стабильной работы базовой конфигурации, потом занимайтесь тюнингом.

Часто задаваемые вопросы

Можно ли пробросить встроенную графику процессора (iGPU)?

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

Нужна ли переустановка Windows после переключения на OVMF?

Система, установленная в режиме Legacy BIOS, не загрузится под UEFI без конвертации загрузчика. Проще всего переключать тип BIOS до установки ОС. Существуют способы конвертации MBR в GPT без потери данных, но это рискованная операция, требующая резервной копии.

Что делать, если устройство в одной IOMMU-группе с другими?

Все устройства группы пробрасываются только вместе. Варианты: пробросить всю группу в одну ВМ, переставить карту в другой PCIe-слот (топология групп зависит от слота) или применить патч pcie_acs_override — последний вариант снижает изоляцию и считается небезопасным компромиссом.

Работает ли проброс сетевой карты так же, как GPU?

Да, механизм идентичен: включённый IOMMU, привязка к vfio-pci, добавление через Hardware → Add → PCI Device. Для сетевых карт это часто проще, так как нет проблем с видеодрайверами и выводом изображения. Альтернатива — виртуальный мост или SR-IOV, если карта его поддерживает.

Можно ли вернуть устройство хосту без перезагрузки?

Теоретически устройство можно отвязать от vfio-pci и привязать обратно к драйверу хоста через sysfs, но на практике многие устройства (особенно GPU с reset bug) после этого работают некорректно. Надёжнее планировать распределение устройств заранее и перезагружать хост при его изменении.