Иногда появляется желание/необходимость прокинуть в виртуальную машину физическое (реальное) железо. Для этого существует такая технология как IOMMU. Приступим.

Технические требования

Для работы данной технологии нужна поддержка со стороны:

  • процессора;
  • материнской платы;
  • гипервизора.

Процессоры

Говорить будем только про x86 процессоры (ARM оставим “за бортом”, может быть когда-нибудь потом проверю и попробую).

Для процессоров Intel нам нужны следующие технологии:

Для процессоров AMD нужна поддержка:

Материнская плата

Тут названия настроек, которые нужно включить и информация о поддержке сильно зависит от производителя материнской платы. Но все это обычно находится в разделе Advanced, и связано с виртуализацией.

Гипервизор

Собственно Proxmox 8. В нем есть возможность использовать IOMMU, но по умолчанию она выключена - нужно самому ее ключить. Этим мы и займемся.

Проверка активности

Для того что бы проверить работает ли сейчас режим IOMMU нужно в консоли сервера (ssh или vnc через веб) выполнить следующий код:

1
dmesg | grep -e DMAR -e IOMMU

В выводе мы ищем упоминание включения режима DMAR: IOMMU enabled. Если такое сообщение есть - то IOMMU включен и можно начинать пользоваться. Если режим не включен, то нужно поменять несколько файлов. Так же стоит проверить, что бы был включен режим ремапинга прерываний:

1
dmesg | grep 'remapping'

В результате должен быть вывод похожий на:

1
2
[    0.134401] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.136043] DMAR-IR: Enabled IRQ remapping in x2apic mode # <====================

Kernel command line

В зависимости от варианта установки нужно будет воспользоваться одним из вариантов и добавить в нужный файл параметры:

1
intel_iommu=on iommu=pt

systemd-boot

Файл правится добавлением параметров после quiet:

1
/etc/kernel/cmdline

После этого нужно выполнить:

1
proxmox-boot-tool refresh

grub

Файл правится добавлением параметров после quiet:

1
/etc/default/grub

После правок выполнить:

1
update-grub

Модули ядра

так же стоит добавить подгрузку модулей ядра в файле:

1
2
3
4
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

После чего выполнить команду для обновления initramfs:

1
update-initramfs -u -k all

Проверка

После перезагрузки системы результат команды dmesg | grep -e DMAR -e IOMMU должен быть похож на:

1
[    0.058451] DMAR: IOMMU enabled

Разделение по группам

Для возможности проброса конкретных устройств, важно что бы они были разделены по группам. Проверить список групп можно либо в консоли по “pcie адресам” устройств:

1
find /sys/kernel/iommu_groups/ -type l

Либо в более красивом виде для текущей ноды Proxmox (можно указать руками имя ноды из кластера):

1
pvesh get /nodes/$(hostname)/hardware/pci --pci-class-blacklist ""

Заключени

Теперь можно пробовать “выдавать” виртуалкам настоящие PCIe устройства в пользование. Это могут быть как банальные видеокарты, так и сетевые порты или полноценные NVMe накопители. Именно этим планирую заняться в будущем.