К основному содержимому

GPU Passthrough в Proxmox VE: настройка NVIDIA и AMD

Proxmox VE · 19.04.2026 · 6 мин чтения
Иллюстрация к статье «GPU Passthrough в Proxmox VE: настройка NVIDIA и AMD»

GPU Passthrough (PCI Passthrough) позволяет передать физическую видеокарту напрямую в виртуальную машину с нативной производительностью. Это необходимо для игровых VM, AI/ML рабочих нагрузок, рендеринга и работы с CUDA/ROCm — задач, где эмулированная или виртуальная видеокарта не даёт нужной скорости.

Требования для GPU Passthrough

  • CPU с поддержкой IOMMU: Intel VT-d или AMD-Vi.
  • Включённый IOMMU в BIOS/UEFI (VT-d / AMD IOMMU).
  • Отдельная видеокарта для passthrough (не та, что используется хостом для консоли).
  • Процессор и материнская плата с изолированными IOMMU-группами — не любая плата одинаково хорошо группирует устройства.

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

# Для Intel CPU -- /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

# Для AMD CPU
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"

# Применить изменения
update-grub
reboot

# Проверить, что IOMMU включён
dmesg | grep -i iommu | head -5

Шаг 2: загрузка vfio-модулей

# Добавить в /etc/modules
echo -e "vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd" >> /etc/modules

# Обновить initramfs
update-initramfs -u -k all

Шаг 3: найти PCI ID видеокарты

# Список всех GPU
lspci -nn | grep -E "VGA|3D|Display"

# Пример вывода:
# 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation RTX 4070 [10de:2786]
# 01:00.1 Audio device [0403]: NVIDIA Corporation [10de:22bc]

# Проверить IOMMU-группу (важно!)
for d in /sys/kernel/iommu_groups/*/devices/*; do
  n=${d#*/iommu_groups/*}; n=${n%%/*}
  printf 'IOMMU Group %s ' "$n"
  lspci -nns "${d##*/}"
done | sort -V | grep "01:00"

Разбор типичных ошибок

  • vfio-pci: probe of 0000:01:00.0 failed with error -16 — устройство уже захвачено другим драйвером (обычно nvidia или nouveau); чёрный список из шага 4 не сработал до перезагрузки — проверьте порядок загрузки initramfs.
  • IOMMU-группа видеокарты содержит другие устройства хоста (например, USB-контроллер материнской платы) — passthrough всей группы целиком заберёт с хоста и эти устройства; частично решается патчем ACS override, но это снижает изоляцию.
  • Code 43 в Windows Device Manager после передачи NVIDIA GeForce в VM — драйвер NVIDIA намеренно блокирует работу внутри виртуальной машины без нужных патчей CPU-флагов; нужен kvm=off,hv_vendor_id=proxmox.
  • VM не запускается: kvm: -device vfio-pci,host=01:00.0: vfio: error opening /dev/vfio/16: Device or resource busy — устройство ещё занято хостом или другой VM; убедитесь, что nouveau/nvidia выгружены и никакая другая VM не использует то же устройство.

Шаг 4: привязка GPU к vfio-pci

# Добавить в /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:2786,10de:22bc
# (используйте PCI ID вашего GPU и аудио-чипа)

# Запретить загрузку nvidia/nouveau драйвера на хосте
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf

update-initramfs -u -k all
reboot

# Проверить, что GPU захвачен vfio
lspci -nnk | grep -A3 "01:00"
# Должно показать: Kernel driver in use: vfio-pci

Шаг 5: добавление GPU в уже созданную VM

# Добавить PCI-устройство к VM через CLI
qm set 100 --machine q35 --bios ovmf --hostpci0 01:00,pcie=1,x-vga=1

# Для NVIDIA -- добавить патч (скрыть VM от драйвера)
qm set 100 --args "-cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=proxmox,kvm=off'"

ROM-файл для NVIDIA: некоторые NVIDIA-карты требуют явного указания VBIOS ROM-файла для корректной работы в VM. Дамп VBIOS можно получить с techpowerup.com или сделать самостоятельно до передачи карты в passthrough.

Сравнение вариантов разделения GPU

ВариантКоличество VM на одну картуТребует поддержки от GPUПроизводительность
Полный passthrough1НетНативная
vGPU (NVIDIA)НесколькоДа, лицензия vGPUДоля от нативной
SR-IOVНесколькоДа, поддержка картыБлизкая к нативной

Настройка в /etc/pve/qemu-server/100.conf

bios: ovmf
machine: q35
efidisk0: local-lvm:vm-100-disk-0,efitype=4m,size=4M
hostpci0: 0000:01:00.0,pcie=1,x-vga=1
hostpci1: 0000:01:00.1  # GPU Audio
vga: none  # Отключить виртуальный GPU

Когда GPU Passthrough не подходит

  • На хосте только одна видеокарта — без встроенной графики CPU для консоли хоста Proxmox рискует остаться без вывода видео после передачи единственного GPU в VM; сначала обеспечьте хосту альтернативный вывод (IPMI, iGPU).
  • Нужно разделить одну карту между несколькими VM без лицензии vGPU — полный passthrough отдаёт GPU только одной VM единовременно, для нескольких потребителей нужны SR-IOV или платный vGPU.
  • Видеокарта потребительского сегмента NVIDIA используется для расчётов в дата-центре под коммерческой нагрузкой — лицензионное соглашение NVIDIA ограничивает такое использование GeForce-карт, формально требуется линейка для дата-центров.

Ограничения passthrough: VM с GPU passthrough не поддерживает живую миграцию; один GPU нельзя передать нескольким VM одновременно без vGPU/SR-IOV для разделения; NVIDIA GeForce-серия блокирует passthrough в VM без патча kvm=off,hv_vendor_id=proxmox.

Как проверить, что passthrough работает

# Внутри VM: видеокарта определяется системой
lspci -nnk | grep -A3 VGA

# Внутри VM (Linux): драйвер NVIDIA/AMD загружен, а не заглушка
nvidia-smi
# или для AMD:
rocm-smi

# На хосте: устройство больше не принадлежит хосту
lspci -nnk -s 01:00.0 | grep "Kernel driver in use"
# Ожидаем: vfio-pci, а не nvidia/amdgpu

Если nvidia-smi (или rocm-smi) внутри VM показывает модель карты и её загрузку, а на хосте устройство числится за vfio-pci — GPU передан в виртуальную машину корректно и работает с нативной производительностью.

Частые вопросы

Подходит ли GPU Passthrough для LXC-контейнеров, или описанный способ работает только для полноценных виртуальных машин?

Описанный в статье способ через vfio-pci рассчитан именно на полноценные виртуальные машины с отдельным ядром и драйверами внутри гостя. Для LXC-контейнеров, которые делят ядро с хостом, видеокарта передаётся иначе — через проброс файлов устройств внутрь контейнера, а не через захват vfio-pci, и настройка в этом случае заметно отличается от шагов для VM.

Можно ли отдать одну видеокарту сразу нескольким виртуальным машинам без лицензии vGPU?

Нет, полный passthrough закрепляет устройство ровно за одной виртуальной машиной в каждый момент времени — пока карта занята одной VM, ни одна другая обратиться к ней не может. Чтобы разделить одну физическую карту между несколькими потребителями одновременно, нужна либо платная лицензия vGPU от производителя, либо аппаратная поддержка SR-IOV на самой карте.

Почему видеокарта потребительского сегмента NVIDIA GeForce отказывается нормально работать внутри виртуальной машины?

Драйвер GeForce намеренно определяет, что система запущена внутри виртуальной машины, и блокирует полноценную работу — в диспетчере устройств Windows это выглядит как ошибка карты. Обходится это добавлением в конфигурацию виртуальной машины специального патча, который прячет сам факт виртуализации от гостевой системы, после чего драйвер запускается так же, как на физическом компьютере.

Что делать, если на сервере всего одна видеокарта и нет отдельного видеовыхода для консоли хоста?

Передавать в виртуальную машину единственную видеокарту сервера рискованно: после запуска VM хост Proxmox может остаться без собственного видеовывода, и управлять им придётся только через сеть. Перед настройкой passthrough стоит заранее обеспечить альтернативный вывод для хоста — встроенную графику процессора или удалённый доступ через IPMI, чтобы не потерять консоль.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке