iommu: DMAR hardware fault — Решение ошибок Intel VT-d и DMA в Linux
Архитектура ошибки и симптомы сбоя
Сообщение «iommu: DMAR hardware fault: DMA access violation» генерируется подсистемой ядра IOMMU (Intel VT-d). Ошибка означает, что физическое PCIe-устройство (сетевой адаптер, контроллер NVMe, GPU или HBA) попыталось выполнить операцию прямого доступа к памяти (Direct Memory Access — DMA) по физическому адресу, который не был смаппирован в таблицах трансляции страниц DMA (DMAR — DMA Remapping Table) ядра. Контроллер IOMMU заблокировал несанкционированный доступ к памяти хоста во избежание сбоя или атаки DMA.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| DMAR | DMA Remapping | Аппаратная изоляция адресных пространств DMA для устройств шины PCIe. |
| fault addr 0x... | Host Physical Address | Адрес оперативной памяти, к которому устройство попыталось получить неразрешенный доступ. |
| type 1 (non-zero) | Page Request Fault | Попытка чтения/записи невалидной страницы или нарушение прав защиты страниц памяти. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Локализация сбойного устройства по PCI BDF
Найдите в строке ошибки адрес устройства (например, [dmar-fault] source 0000:04:00.0):
# Определение виновника сбоя по PCI адресу:
lspci -vns 0000:04:00.0
# Проверка структуры групп IOMMU (IOMMU Groups):
find /sys/kernel/iommu_groups/ -type l | grep 04:00.0Сценарий 2: Переключение IOMMU в режим сквозной трансляции (Pass-Through)
Если сбой происходит с исправным драйвером устройства из-за накладных расходов трансляции IOMMU:
# Добавьте в /etc/default/grub режим passthrough:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"
# Обновите конфигурацию загрузчика:
sudo update-grub # Ubuntu/Debian
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/AlmaLinux
sudo rebootСценарий 3: Настройка ACS (Access Control Services) для проброса (PCIe Passthrough)
Если несколько устройств находятся в одной IOMMU-группе и конфликтуют при пробросе в ВМ (VFIO):
# Включение обхода группировки ACS (только для тестовых стендов!):
GRUB_CMDLINE_LINUX="intel_iommu=on pcie_acs_override=downstream,multifunction"
# Проверка привязки устройства к vfio-pci:
lspci -nnk -d <VENDOR_ID>:<DEVICE_ID>ITSTM настроит корректную изоляцию IOMMU-групп, оптимизирует прерывания VFIO и развернет стабильный GPU Passthrough для AI/VDI задач.
Частые вопросы (FAQ)
Что дает параметр iommu=pt?
Режим Pass-Through (pt) отключает трансляцию IOMMU для устройств хоста по умолчанию, что устраняет DMAR-ошибки и снижает задержки I/O. При этом для виртуальных машин (VFIO) функционал IOMMU продолжает полноценно работать.
Опасна ли ошибка DMA access violation?
Блокировка DMAR предотвращает порчу данных в ОЗУ хоста. Однако само устройство, чья операция DMA была заблокирована, скорее всего зависнет или завершит операцию ввода-вывода с аппаратной ошибкой.
Как полностью отключить Intel IOMMU, если сервер не использует виртуализацию?
Укажите в параметрах загрузки ядра GRUB параметр intel_iommu=off. Это полностью выключит блок DMAR контроллера.
Почему DMAR fault часто возникает на сетевых картах Realtek / Mellanox?
При включенном scatter-gather DMA драйвер может передать физический адрес буфера за пределами 32-битного диапазона (выше 4GB). Если контроллер устройства имеет баг в работе с 64-битными адресами DMA, возникает DMAR fault.