Новинка Виртуальный VDS сервер в Финляндии от 390р
Выберите продукт

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-сервер
Виртуальные серверы с быстрым запуском и гибкой конфигурацией от 390₽ / мес
Доступные локации
Россия Нидерланды Финляндия

Проверяем, что 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 и состава группы — это самые информативные точки.

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

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

Как безопасно выполнить bootstrap MariaDB Galera после полного останова

Как безопасно выполнить bootstrap MariaDB Galera после полного останова

После одновременной остановки всех узлов Galera обычного запуска MariaDB недостаточно. Сначала найдите сервер с последней транзакц ...
CoreDNS в Kubernetes: исправляем CrashLoopBackOff, SERVFAIL и DNS-петлю

CoreDNS в Kubernetes: исправляем CrashLoopBackOff, SERVFAIL и DNS-петлю

Разберём, почему CoreDNS перезапускается или отвечает SERVFAIL, как обнаружить замкнутую пересылку DNS-запросов, проверить доступн ...
Apache Kafka KRaft на VDS: отдельные controller и broker

Apache Kafka KRaft на VDS: отдельные controller и broker

Соберём новый Kafka-кластер без ZooKeeper на шести Linux VDS: три узла controller образуют отказоустойчивый metadata quorum, а три ...