Если вы пробовали пробросить видеокарту, HBA-контроллер или сетевую карту в виртуальную машину, вы почти наверняка упирались в термины IOMMU, VT-d (Intel) и AMD-Vi (AMD), а дальше — в VFIO, параметры ядра вроде iommu=pt и длинные логи dmesg. Ниже разложу passthrough по шагам: что включить, как быстро проверить, что всё реально работает, и почему иногда «вроде включено», но устройства не попадают в нужные IOMMU-группы.
Материал ориентирован на практику: команды, признаки в логах, типовые грабли. Подходит для «голого железа» и хостов с KVM/QEMU. На многих виртуальных средах проброс PCIe-устройств недоступен по определению (у гостя нет прямого доступа к железу), поэтому настраивать passthrough обычно приходится на физическом хосте.
Что такое IOMMU и зачем она нужна для PCI passthrough
IOMMU (Input–Output Memory Management Unit) — это «MMU для устройств ввода-вывода». Она помогает:
- изолировать DMA-доступ устройств к памяти (безопасность и стабильность);
- делать ремаппинг адресов для устройств;
- безопасно пробрасывать PCI/PCIe устройства в ВМ (passthrough).
У Intel аппаратная поддержка называется VT-d, у AMD — AMD-Vi. В Linux для проброса обычно используют стек VFIO: драйвер vfio-pci «забирает» устройство у хоста и отдаёт его QEMU/KVM.
Ключевое условие безопасного passthrough: устройство должно быть изолировано в подходящей IOMMU-группе. Если в группе «соседи», придётся пробрасывать их вместе или менять топологию.
Что проверить до настройки
Перед тем как править grub и грузить vfio, быстро проверьте базу — это экономит часы диагностики.
1) В BIOS/UEFI включены VT-d / AMD-Vi
Частая ситуация: виртуализация CPU включена (VT-x / AMD-V), а IOMMU — нет. Ищите в BIOS/UEFI:
- Intel: VT-d (иногда рядом с SR-IOV, PCIe ARI);
- AMD: SVM (это про CPU) и отдельно IOMMU или AMD-Vi.
После изменения настроек иногда важна холодная перезагрузка, особенно на некоторых платах и серверных платформах.
2) Список устройств и их адреса (BDF)
Составьте список устройств и их BDF-адресов (Bus:Device.Function). Команды:
lspci -nn
lspci -nnk
Смотрите на строки вида [1234:abcd] — это vendor:device ID. Они пригодятся, чтобы привязать устройство к vfio-pci.
3) Адекватная группировка устройств (IOMMU groups)
Даже с включенной IOMMU реальная возможность passthrough зависит от топологии PCIe и того, как чипсет/плата группирует устройства за ACS (Access Control Services). Иногда «полплаты» оказывается в одной группе — и это блокирует нормальный проброс.

Включаем IOMMU в Linux через grub
Самый простой путь на большинстве дистрибутивов — добавить параметры ядра в конфигурацию загрузчика grub.
Intel (VT-d): параметры ядра
Обычно достаточно intel_iommu=on. Если цель — passthrough и вы хотите меньше накладных расходов IOMMU на хосте, часто добавляют iommu=pt (identity mapping для «обычных» устройств хоста).
sudo nano /etc/default/grub
Пример (сохраняйте прочие параметры, если они были):
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
AMD (AMD-Vi): параметры ядра
Для AMD обычно используют amd_iommu=on и по ситуации iommu=pt:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
Обновляем grub и перезагружаемся
Debian/Ubuntu-подобные:
sudo update-grub
RHEL-подобные:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Перезагрузка:
sudo reboot
Проверяем, что IOMMU реально поднялась
«Параметр в grub прописан» не равно «IOMMU работает». Проверяем по логам и фактам.
1) Проверка через dmesg
dmesg -T | grep -Ei "DMAR|IOMMU|AMD-Vi|VT-d"
Что вы хотите увидеть:
- Intel: строки с
DMAR, включение IOMMU, отсутствие «IOMMU disabled»; - AMD: строки про
AMD-Viи инициализацию IOMMU.
Если встречается «IOMMU disabled» или «No DMAR table found», возвращаемся к BIOS/UEFI. Ещё один частый вариант — вы запускаете это внутри ВМ, где аппаратная IOMMU вам недоступна.
2) Проверка командной строки ядра
cat /proc/cmdline
Убедитесь, что ваши intel_iommu=on или amd_iommu=on и (если добавляли) iommu=pt действительно применились.
3) Мини-проверка KVM (если это хост виртуализации)
Если вы строите стенд под KVM/QEMU, полезно параллельно держать в порядке базовые настройки хоста (лимиты, I/O и т. п.). Часто проблемы «пасстру не едет» идут рядом с перегруженным I/O или странными лимитами. По теме лимитов systemd пригодится разбор: лимиты CPU и памяти в systemd для сервисов.
IOMMU-группы: как посмотреть и почему это критично
IOMMU-группа — набор устройств, которые ядро считает неразделимыми с точки зрения DMA-изоляции. Для безопасного passthrough устройство должно быть либо единственным в группе, либо все устройства группы должны уходить в одну и ту же ВМ, а хост не должен их использовать.
Вывод списка групп
for g in /sys/kernel/iommu_groups/*; do echo "IOMMU Group ${g##*/}"; ls -l "$g/devices"; echo; done
Чтобы вывод был читаемее, сопоставьте адреса с lspci:
for d in /sys/kernel/iommu_groups/*/devices/*; do echo "${d##*/} $(lspci -nns ${d##*/})"; done
Типовая проблема: «в одной группе всё подряд»
На части десктопных плат (и некоторых серверных конфигурациях) бывает, что GPU, аудио-функция GPU, PCIe-мост и ещё несколько устройств оказываются в одной группе. Тогда проброс только «видеокарты» невозможен без затрагивания соседей.
Что обычно помогает (по убыванию «безопасности»):
- перестановка карты в другой слот (изменится корневой порт/ветка);
- обновление BIOS/UEFI;
- включение ACS/ARI опций в BIOS (если доступно);
- ACS override в Linux — как крайняя мера (это компромисс по изоляции, в продакшене лучше избегать).

VFIO: забираем устройство у хоста и готовим к passthrough
Когда IOMMU работает и группы понятны, следующий шаг — привязать выбранное устройство к драйверу vfio-pci.
1) Узнаём vendor:device ID и текущий драйвер
lspci -nnk -s 01:00.0
Где 01:00.0 — адрес вашего устройства. В выводе смотрите:
Kernel driver in use— кто сейчас владеет устройством;Kernel modules— какие модули потенциально могут его подхватить.
2) Загружаем модули VFIO
sudo modprobe vfio
sudo modprobe vfio_pci
sudo modprobe vfio_iommu_type1
3) Привязка к vfio-pci через modprobe.d
Надёжный способ — указать IDs для vfio-pci. Создайте файл:
sudo nano /etc/modprobe.d/vfio.conf
Пример (подставьте свои значения):
options vfio-pci ids=10de:1b80,10de:10f0 disable_vga=1
Два ID — типичный случай для GPU: сам адаптер и его аудио-функция HDMI/DP. Параметр disable_vga=1 иногда помогает, когда устройство ведёт себя как VGA и мешает привязке.
4) Чтобы правило применилось рано: обновляем initramfs
На многих системах важно, чтобы vfio-pci перехватил устройство ещё в initramfs, иначе его успеет забрать «родной» драйвер.
Debian/Ubuntu-подобные:
sudo update-initramfs -u
RHEL-подобные:
sudo dracut -f
Затем перезагрузка:
sudo reboot
5) Проверяем, что устройство действительно на vfio-pci
lspci -nnk -s 01:00.0
Ожидаемый признак: Kernel driver in use: vfio-pci.
Параметр iommu=pt: когда нужен и что меняет
iommu=pt включает режим pass-through (identity mapping) для устройств, которые не используются в изоляции/виртуализации. Практический смысл:
- часто уменьшает накладные расходы IOMMU для обычного I/O на хосте;
- при этом IOMMU остаётся включенной и готовой изолировать устройства, которые вы отдаёте в VFIO/ВМ.
Важно: iommu=pt не «включает passthrough». Passthrough — это VFIO + корректные группы + корректная привязка устройств. iommu=pt — скорее оптимизация хоста, который живёт с включённой IOMMU постоянно.
Частые ошибки и диагностика
Ошибка 1: IOMMU не включается, хотя параметр в grub есть
Проверьте по порядку:
cat /proc/cmdline— параметр реально применился?dmesg -T | grep -Ei "DMAR|IOMMU|AMD-Vi"— есть ли инициализация?- BIOS/UEFI — включён ли VT-d/AMD-Vi именно для платформы, а не только VT-x/AMD-V?
Ещё нюанс: отдельные комбинации «Above 4G decoding», «Resizable BAR» и похожие опции иногда влияют на поведение PCIe/IOMMU. Если всё странно — временно приведите BIOS к более консервативным настройкам и проверьте снова.
Ошибка 2: устройство «отваливается» при старте ВМ или гость не видит его
Чаще всего причина одна из трёх:
- устройство не полностью отдано VFIO (в той же группе остаётся зависимое устройство, которое использует хост);
- драйвер хоста успевает подхватить устройство раньше VFIO (лечится ранней привязкой через initramfs и, при необходимости, blacklist «родного» модуля);
- проблемы с reset: устройство плохо ресетится без FLR и после первой ВМ «не возвращается» (особенно некоторые GPU).
Ошибка 3: «cannot set iommu for container» или проблемы с vfio_iommu_type1
Проверьте, что загружены vfio, vfio_pci, vfio_iommu_type1, и что IOMMU реально активна. В dmesg обычно есть подсказка: не хватает возможностей, запрещено политикой, или устройство не в изолируемой группе.
Мини-чеклист «всё ли готово»
- В BIOS/UEFI включены VT-d или AMD-Vi.
- В
/proc/cmdlineестьintel_iommu=onилиamd_iommu=on, при необходимостиiommu=pt. dmesgподтверждает инициализацию IOMMU (DMAR/AMD-Vi без фатальных ошибок).- Проверены IOMMU-группы, устройство можно безопасно изолировать.
lspci -nnkпоказываетKernel driver in use: vfio-pciдля пробрасываемого устройства.
Когда passthrough действительно оправдан
Passthrough — инструмент под конкретную задачу, а не обязательный тюнинг. На практике чаще всего встречаются:
- GPU passthrough для рабочих станций/рендеринга/ML в ВМ, когда нужен нативный драйвер и производительность.
- HBA/SAS/SATA контроллер в ВМ (например, под файловый сервер), чтобы гость управлял дисками напрямую.
- SR-IOV / VF passthrough для высокопроизводительной сети, когда нужна минимальная задержка и предсказуемость.
Если вы упираетесь в нестабильность из-за I/O, проверьте общую картину по дискам и планировщикам: диагностика дисковой подсистемы и настройка I/O в Linux. Иногда корень проблемы не в VFIO, а в том, что хост перегружен или упирается в подсистему хранения.
Итог
IOMMU (VT-d/AMD-Vi) — фундамент для безопасного PCI passthrough в Linux. Рабочий порядок действий: включили в BIOS → включили в grub (при необходимости с iommu=pt) → подтвердили по dmesg → проверили IOMMU-группы → перевели нужные устройства на vfio-pci с ранней привязкой через initramfs → повторно проверили lspci.
Если после этих шагов что-то не сходится, чаще всего виновата группировка (IOMMU groups) или то, что устройство не полностью передано VFIO (либо не умеет нормально reset). Начинайте диагностику с dmesg и состава группы — это самые информативные точки.


