Определение простыми словами
PCI Passthrough (проброс PCI-устройств) позволяет виртуальной машине получить эксклюзивный прямой доступ к физическому оборудованию — видеокарте, сетевой карте или NVMe-диску — так, как если бы это была bare-metal машина. Гипервизор в этом случае выступает только посредником при инициализации, а не при каждой операции ввода-вывода.
Технология опирается на IOMMU (Intel VT-d или AMD-Vi), который изолирует DMA-транзакции устройства в пределах адресного пространства конкретной ВМ, и на драйвер VFIO в ядре Linux, отвязывающий устройство от хостового драйвера и передающий его в пространство пользователя. Без IOMMU проброс небезопасен: устройство получило бы доступ ко всей физической памяти хоста.
Сравнение
| Метод | Производительность | Изоляция | Гибкость |
|---|---|---|---|
| PCI Passthrough | ~100% нативной | Высокая (IOMMU) | Низкая (1 ВМ) |
| SR-IOV | 95–99% нативной | Высокая (VF) | Средняя (N ВМ) |
| VirtIO | 70–90% нативной | Программная | Высокая (любые ВМ) |
Кейсы использования
- GPU-вычисления (ML/AI): передача NVIDIA A100 или RTX-серии в ВМ для обучения моделей без потерь пропускной способности PCIe.
- Игровые и рендер-серверы: Windows-гость на KVM с проброшенной GPU для стриминга или рендеринга без потери FPS.
- Высокочастотный трейдинг (HFT): проброс 25/100GbE NIC напрямую в ВМ с DPDK для обхода сетевого стека ядра Linux.
- NVMe-диски с низкой латентностью: PCIe 4.0 NVMe пробрасывается в ВМ базы данных, исключая эмуляционный оверхед virtio-blk.
- Аппаратные ускорители: FPGA, крипто-акселераторы (QAT), SmartNIC с offload-логикой.
Негативный пример: проброс единственного физического GPU на хосте с Proxmox VE одновременно нескольким ВМ невозможен — устройство занято эксклюзивно. Для многопользовательского доступа к GPU нужен SR-IOV (если карта поддерживает) или виртуализация MIG (NVIDIA A-серия).
Технические детали
Минимальные требования: CPU с поддержкой VT-d/AMD-Vi, включённый IOMMU в BIOS/UEFI и ядро Linux ≥ 4.1 с модулями vfio vfio_iommu_type1 vfio_pci vfio_virqfd. Проверка и настройка на хосте KVM/QEMU:
# Проверить активность IOMMU
dmesg | grep -e DMAR -e IOMMU
# Добавить параметры ядра (intel_iommu=on или amd_iommu=on)
grep GRUB_CMDLINE /etc/default/grub
# Загрузить модули VFIO
modprobe vfio-pci
# Узнать PCI ID устройства
lspci -nn | grep -i nvidia
# Привязать устройство к vfio-pci (пример для 10de:2204)
echo '10de 2204' > /sys/bus/pci/drivers/vfio-pci/new_id
# Запустить ВМ с проброшенным устройством через qemu
qemu-system-x86_64 -device vfio-pci,host=01:00.0,multifunction=on
В Proxmox VE проброс настраивается через GUI: Hardware → Add → PCI Device, либо вручную в конфиге /etc/pve/qemu-server/<VMID>.conf строкой hostpci0: 01:00,pcie=1,x-vga=1. Для стабильной работы рекомендуется закрепить IOMMU-группу целиком — все устройства одной группы должны быть проброшены вместе или изолированы через ACS override patch.
🔥 Где это применяется
Частые вопросы
Можно ли использовать PCI Passthrough на обычном VPS?
Нет. Стандартный VPS работает внутри гипервизора хостера, и у него нет прямого доступа к физическому PCIe-слоту. PCI Passthrough требует выделенного сервера или специального bare-metal облака, где вам предоставляют физический хост целиком или конкретное устройство через SR-IOV.
Обязательно ли включать IOMMU для PCI Passthrough?
Да. Без IOMMU (Intel VT-d или AMD-Vi) устройство получает доступ ко всей физической памяти хоста через DMA, что создаёт критическую уязвимость. IOMMU изолирует адресное пространство устройства в рамках ВМ. Включается в настройках BIOS/UEFI и параметром ядра intel_iommu=on или amd_iommu=on.
В чём разница между PCI Passthrough и SR-IOV?
PCI Passthrough передаёт физическое устройство одной ВМ эксклюзивно — максимальная производительность, но нет возможности разделить между несколькими гостями. SR-IOV создаёт несколько виртуальных функций (VF) одного физического устройства, позволяя подключить его к N ВМ одновременно с минимальными потерями производительности. SR-IOV требует аппаратной поддержки со стороны самого устройства.
Какие GPU поддерживают PCI Passthrough без ограничений?
Большинство серверных GPU (NVIDIA A-серия, AMD Instinct) работают без ограничений. Потребительские карты NVIDIA до 2022 года имели код 43 (Error 43) в Windows-гостях — это программное ограничение, обходимое через патч hide_hypervisor в QEMU. С видеокартами RTX 3000/4000 ситуация улучшилась, но рекомендуется проверять совместимость конкретной модели.