VFIO — PCI passthrough для KVM: настройка и применение | Глоссарий FREEHOSTING

VFIO

Virtual Function I/O
VFIO — VFIO (Virtual Function I/O) — механизм ядра Linux, позволяющий передавать физические PCI-устройства напрямую в виртуальную машину, обходя гипервизор. Обеспечивает производительность, близкую к bare-metal, и аппаратную изоляцию через IOMMU.

Определение простыми словами

VFIO — это драйвер и фреймворк в ядре Linux (начиная с версии 3.6), который реализует PCI passthrough безопасным и стандартизированным способом. Вместо того чтобы эмулировать устройство программно, VFIO позволяет виртуальной машине работать с реальным железом — видеокартой, сетевой картой, NVMe-диском — напрямую, как если бы оно было подключено к физическому серверу.

Ключевое отличие от устаревших методов passthrough: VFIO использует IOMMU (Intel VT-d или AMD-Vi) для изоляции DMA-операций. Это означает, что устройство не может обратиться к памяти за пределами своей IOMMU-группы, что защищает хост и соседние ВМ от некорректного или вредоносного поведения устройства.

Сравнение

Метод Производительность Изоляция Требования
VFIO (PCI passthrough) ~99% от bare-metal Высокая (IOMMU) IOMMU, отдельная IOMMU-группа
VirtIO 85–95% от bare-metal Средняя (программная) Драйвер VirtIO в гостевой ОС
SR-IOV ~95–98% от bare-metal Высокая (аппаратная) Поддержка SR-IOV в устройстве

Кейсы использования

  • GPU passthrough для игровых ВМ: передача дискретной видеокарты (NVIDIA, AMD) в Windows-гостя на Linux-хосте с KVM/QEMU. Потери производительности — менее 1–3% по сравнению с нативной установкой.
  • Высокопроизводительные сетевые карты: передача 25/100 GbE NIC в ВМ для телекоммуникационных нагрузок (NFV, vRouter), где задержки эмуляции недопустимы.
  • NVMe passthrough: передача NVMe SSD напрямую в гостевую ОС для баз данных с требованием latency <100 мкс.
  • Аппаратные ускорители: FPGA, криптографические карты, специализированные DSP — устройства, для которых нет VirtIO-драйверов.
  • Тестирование драйверов: разработка и отладка драйверов устройств в изолированной ВМ без риска для хоста.

Негативный пример: Использовать VFIO для передачи единственной сетевой карты сервера в ВМ — хост потеряет сетевой доступ. Всегда оставляйте хосту отдельный сетевой интерфейс или используйте SR-IOV для разделения карты.

Технические детали

Для настройки VFIO на KVM-хосте с Ubuntu/Debian выполните следующие шаги:

# 1. Проверить поддержку IOMMU и найти PCI-идентификаторы устройства
lspci -nn | grep -i nvidia
# Пример вывода: 01:00.0 VGA [10de:2204] NVIDIA GA102

# 2. Включить IOMMU в GRUB (Intel VT-d)
grep GRUB_CMDLINE /etc/default/grub
# Добавить: intel_iommu=on iommu=pt

# 3. Обновить GRUB и перезагрузить
update-grub && reboot

# 4. Проверить IOMMU-группы
for d in /sys/kernel/iommu_groups/*/devices/*; do echo "Group $(basename $(dirname $d)): $(lspci -nns ${d##*/})"; done

# 5. Загрузить модули VFIO
modprobe vfio vfio-pci vfio_iommu_type1

# 6. Привязать устройство к драйверу vfio-pci (замените ID на свои)
echo '10de 2204' > /sys/bus/pci/drivers/vfio-pci/new_id

# 7. Проверить привязку
lspci -k -s 01:00.0 | grep 'Kernel driver'
# Ожидаемый вывод: Kernel driver in use: vfio-pci

# 8. Запустить QEMU с passthrough (пример)
qemu-system-x86_64 -enable-kvm -m 8192 -cpu host -device vfio-pci,host=01:00.0

Важно: устройство и все компоненты его IOMMU-группы должны быть привязаны к vfio-pci. Если в группе несколько устройств (например, GPU + HDMI Audio), передавать нужно все сразу.

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

Обязательно ли нужен IOMMU для использования VFIO?

Да, IOMMU (Intel VT-d или AMD-Vi) обязателен — он обеспечивает изоляцию DMA и без него VFIO не даст передать устройство гостю. Убедитесь, что функция включена в BIOS/UEFI и активирована параметром ядра intel_iommu=on или amd_iommu=on.

Можно ли использовать одну видеокарту одновременно для хоста и виртуальной машины через VFIO?

Нет. VFIO передаёт устройство эксклюзивно: пока ВМ работает, хост не имеет к нему доступа. Для одновременного использования нужен SR-IOV (если поддерживается картой) или два отдельных GPU.

Работает ли VFIO на облачных VPS?

На большинстве облачных VPS VFIO недоступен, так как требует прямого доступа к физическому PCI-устройству и поддержки IOMMU на уровне гипервизора. Для таких задач нужен выделенный сервер или специализированный bare-metal-хостинг.

Есть ли разница в производительности между VFIO и нативной установкой?

Потери минимальны: для GPU — 1–3% в большинстве бенчмарков, для NVMe — менее 1% по IOPS. Это радикально лучше программной эмуляции, где потери могут достигать 20–40%.