Определение простыми словами
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%.