ZIM-НИЙ SAAALEЗимние скидки: до −50% на старт и −20% на продление
до 31.01.2026 Подробнее
Выберите продукт

Linux passthrough (VFIO): включение IOMMU (VT-d/AMD-Vi), проверка и типовые проблемы

Практический разбор IOMMU в Linux для PCI passthrough: включаем VT-d/AMD-Vi в BIOS и через grub, проверяем /proc/cmdline и dmesg, анализируем IOMMU-группы, настраиваем VFIO и решаем типовые проблемы.
Linux passthrough (VFIO): включение IOMMU (VT-d/AMD-Vi), проверка и типовые проблемы

Если вы пробовали пробросить видеокарту, 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). Иногда «полплаты» оказывается в одной группе — и это блокирует нормальный проброс.

Настройки BIOS/UEFI для включения VT-d или AMD-Vi перед пробросом устройств

Включаем 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
FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Проверяем, что 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 — как крайняя мера (это компромисс по изоляции, в продакшене лучше избегать).

Схема IOMMU-групп: почему устройства могут оказаться в одной группе и мешать passthrough

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 постоянно.

Виртуальный хостинг FastFox
Виртуальный хостинг для сайтов
Универсальное решение для создания и размещения сайтов любой сложности в Интернете от 95₽ / мес

Частые ошибки и диагностика

Ошибка 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 обычно есть подсказка: не хватает возможностей, запрещено политикой, или устройство не в изолируемой группе.

Мини-чеклист «всё ли готово»

  1. В BIOS/UEFI включены VT-d или AMD-Vi.
  2. В /proc/cmdline есть intel_iommu=on или amd_iommu=on, при необходимости iommu=pt.
  3. dmesg подтверждает инициализацию IOMMU (DMAR/AMD-Vi без фатальных ошибок).
  4. Проверены IOMMU-группы, устройство можно безопасно изолировать.
  5. 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 и состава группы — это самые информативные точки.

Поделиться статьей

Вам будет интересно

Nginx DNS в Docker/Kubernetes: resolver, valid и ipv6=off без сюрпризов OpenAI Статья написана AI (GPT 5)

Nginx DNS в Docker/Kubernetes: resolver, valid и ipv6=off без сюрпризов

Когда backend в Docker или Kubernetes меняет IP, Nginx может продолжать подключаться к «старому» адресу. Разбираем, как работает D ...
DNSSEC на практике: KSK/ZSK, DS record и безопасный rollover без SERVFAIL OpenAI Статья написана AI (GPT 5)

DNSSEC на практике: KSK/ZSK, DS record и безопасный rollover без SERVFAIL

Разбираем DNSSEC на практике: как устроены KSK/ZSK и DS record, как читать DNSKEY/RRSIG, почему при ошибках появляется SERVFAIL и ...
HTTP caching headers: Cache-Control, ETag и Last-Modified без боли OpenAI Статья написана AI (GPT 5)

HTTP caching headers: Cache-Control, ETag и Last-Modified без боли

Разбираем, как браузер и CDN кэшируют ответы: Cache-Control, ETag, Last-Modified, revalidation и 304 Not Modified. Даю рабочие про ...