Я решил поделиться своими заметками/руководством по развертыванию для передачи (passthrough) устройств, подключенных через посредника (например, Intel iGPU). Я использую 6700K, так что, теоретически, это должно работать для процессоров 6-го по 11-го поколения. Для процессоров 12-го по 14-го поколения, которые используют графику Intel Iris Xe вместо (U)HD <<номер>>, есть инструкции в интернете о том, как включить SR-IOV для Intel Iris Xe. На самом деле, это даже лучше, потому что вы можете поделиться этим iGPU между большим количеством ВМ, чем с моим посредническим устройством. В любом случае, это лучше, чем иметь возможность передавать HD 530 Graphics только одной ВМ одновременно (в то время как с посредническим устройством я могу запускать две ВМ, используя его), если кому-то это нужно или есть для этого сценарий использования. У меня также есть пара 3090, поэтому я провёл исследования и тестировал их на своей системе, чтобы они работали вместе (чтобы вы могли передавать 3090 для игр и/или локально размещаемых AI-рабочих нагрузок) и одновременно использовать HD 530 Graphics. Когда я пытался устранить свои недавние проблемы (которые в итоге не были связаны с моей настройкой), можно найти кое-какие материалы о посреднических устройствах и кое-какие материалы о передаче dGPU Nvidia, но никогда не в одном месте. Поэтому я делюсь своими заметками/руководством с сообществом, чтобы это было «однооконное решение» для тех, кому это может быть полезно. Без лишних слов:
Установите базовую операционную систему, следуя подсказкам.
Отключите корпоративные репозитории (если у вас нет платной подписки/лицензии) и добавьте репозиторий no-subscription через GUI Proxmox.
Обновите систему:
`# apt update && apt upgrade -y`
`# apt install -y nfs-kernel-server lm-sensors pixz build-essential pve-headers-$(uname -r) wget curl gpg make`
`# pveam update`
Создайте вашу локальную группу pve и пользователей, а также системного пользователя (который аутентифицируется с использованием системной аутентификации, а не PVE PAM аутентификации).
Обновите grub:
Отредактируйте конфигурацию grub:
`# vi /etc/default/grub`
Измените эту строку:
`GRUB_CMDLINE_LINUX_DEFAULT="quiet"`
На
`GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_gvt=1 systemd.unified_cgroup_hierarchy=0 disable_vga=1 vfio-pci.ids=10de:2204,10de:1aef video=vesafbff,efifbff initcall_blacklist=sysfb_init nofb pcie_acs_override=downstream"`
Обратите внимание: Если вы включите nomodeset в параметры загрузки ядра, графический процессор Intel HD 530 Graphics не будет работать как посредническое устройство. Поэтому не включайте это в параметры загрузки ядра.
`# update-grub; reboot`
Проверьте, что IOMMU успешно включен.
`# dmesg | grep -e DMAR -e IOMMU`
[ 0.000000] Предупреждение: переопределения PCIe ACS включены; это может разрешить одноранговый DMA, не защищенный IOMMU.
[ 0.007731] ACPI: DMAR 0x000000008EA3BFB8 000078 (v01 INTEL KBL 00000001 INTL 00000001)
[ 0.007773] ACPI: Зарезервировано место в памяти таблицы DMAR [mem 0x8ea3bfb8-0x8ea3c02f]
[ 0.090674] DMAR: IOMMU включен
[ 0.220361] DMAR: Ширина адреса хоста 39
[ 0.220362] DMAR: Базовый адрес DRHD: 0x000000fed90000 флаги: 0x1
[ 0.220365] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap d2008c40660462 ecap f050da
[ 0.220367] DMAR: Базовый адрес RMRR: 0x0000008d962000 конец: 0x0000008d981fff
[ 0.220369] DMAR-IR: ID контроллера IOAPIC 2 под DRHD base 0xfed90000 IOMMU 0
[ 0.220370] DMAR-IR: ID HPET 0 под DRHD base 0xfed90000
[ 0.220370] DMAR-IR: Включено переключение недействительности по запросу для поддержки x2apic и Intr-remapping.
[ 0.221718] DMAR-IR: Включено переключение IRQ в режиме x2apic
[ 0.440174] DMAR: [Ошибка прошивки]: запись RMRR для устройства 03:00.0 повреждена — применяется обходной путь
[ 0.440176] DMAR: Не найдено ATSR
[ 0.440176] DMAR: Не найдено SATC
[ 0.440178] DMAR: dmar0: Используется переключение по запросу
[ 0.440333] DMAR: Intel® Виртуализация Technology для Directed I/O
Вы можете использовать этот скрипт, который я нашёл, чтобы проверить группы IOMMU:
`# vi check.sh`
`#!/bin/bash`
`shopt -s nullglob`
`for g in /sys/kernel/iommu_groups/*; do`
`echo "IOMMU Group ${g##*/}:"`
`for d in $g/devices/*; do`
`echo -e "\t$(lspci -nns ${d##*/})" `
`done;`
`done;`
`save,quit`
`# chmod +x check.sh`
`# ./check.sh`
Отредактируйте следующие файлы для подготовки к передаче GPU Nvidia:
(Вы можете найти PCI ID своей Nvidia через `lspci -nn | grep -i nvidia`)
`# vi /etc/modprobe.d/vfio.conf`
`options vfio-pci ids=10de:2531,10de:228e disable_vga=1`
`# vi /etc/modprobe.d/kvm.conf`
`options kvm ignore_msrs=1`
`# vi /etc/modprobe.d/iommu_unsafe_interrupts.conf`
`options vfio_iommu_type1 allow_unsafe_interrupts=1`
`# vi /etc/modprobe.d/pve-blacklist.conf`
`blacklist nvidia`
`blacklist nouveau`
`blacklist radeon`
`save,quit`
`# vi /etc/modprobe.d/blacklist.conf`
`blacklist nvidiafb`
`blacklist nvidia`
`blacklist nouveau`
`blacklist radeon`
`save,quit`
`# vi /etc/modules`
# Модули, необходимые для передачи PCI
`vfio`
`vfio_iommu_type1`
`vfio_pci`
`vfio_virqfd`
# Модули, необходимые для GVT Intel
`kvmgt`
`exngt`
`vfio-mdev`
`save,quit`
`# update-initramfs -u -k all; update-grub; reboot`
Проверьте, что всё работает правильно. Если нет, просмотрите и/или повторите шаги соответствующего раздела, чтобы убедиться, что они были выполнены правильно.
Установите базовую операционную систему, следуя подсказкам.
Отключите корпоративные репозитории (если у вас нет платной подписки/лицензии) и добавьте репозиторий no-subscription через GUI Proxmox.
Обновите систему:
`# apt update && apt upgrade -y`
`# apt install -y nfs-kernel-server lm-sensors pixz build-essential pve-headers-$(uname -r) wget curl gpg make`
`# pveam update`
Создайте вашу локальную группу pve и пользователей, а также системного пользователя (который аутентифицируется с использованием системной аутентификации, а не PVE PAM аутентификации).
Обновите grub:
Отредактируйте конфигурацию grub:
`# vi /etc/default/grub`
Измените эту строку:
`GRUB_CMDLINE_LINUX_DEFAULT="quiet"`
На
`GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_gvt=1 systemd.unified_cgroup_hierarchy=0 disable_vga=1 vfio-pci.ids=10de:2204,10de:1aef video=vesafbff,efifbff initcall_blacklist=sysfb_init nofb pcie_acs_override=downstream"`
Обратите внимание: Если вы включите nomodeset в параметры загрузки ядра, графический процессор Intel HD 530 Graphics не будет работать как посредническое устройство. Поэтому не включайте это в параметры загрузки ядра.
`# update-grub; reboot`
Проверьте, что IOMMU успешно включен.
`# dmesg | grep -e DMAR -e IOMMU`
[ 0.000000] Предупреждение: переопределения PCIe ACS включены; это может разрешить одноранговый DMA, не защищенный IOMMU.
[ 0.007731] ACPI: DMAR 0x000000008EA3BFB8 000078 (v01 INTEL KBL 00000001 INTL 00000001)
[ 0.007773] ACPI: Зарезервировано место в памяти таблицы DMAR [mem 0x8ea3bfb8-0x8ea3c02f]
[ 0.090674] DMAR: IOMMU включен
[ 0.220361] DMAR: Ширина адреса хоста 39
[ 0.220362] DMAR: Базовый адрес DRHD: 0x000000fed90000 флаги: 0x1
[ 0.220365] DMAR: dmar0: reg_base_addr fed90000 ver 1:0 cap d2008c40660462 ecap f050da
[ 0.220367] DMAR: Базовый адрес RMRR: 0x0000008d962000 конец: 0x0000008d981fff
[ 0.220369] DMAR-IR: ID контроллера IOAPIC 2 под DRHD base 0xfed90000 IOMMU 0
[ 0.220370] DMAR-IR: ID HPET 0 под DRHD base 0xfed90000
[ 0.220370] DMAR-IR: Включено переключение недействительности по запросу для поддержки x2apic и Intr-remapping.
[ 0.221718] DMAR-IR: Включено переключение IRQ в режиме x2apic
[ 0.440174] DMAR: [Ошибка прошивки]: запись RMRR для устройства 03:00.0 повреждена — применяется обходной путь
[ 0.440176] DMAR: Не найдено ATSR
[ 0.440176] DMAR: Не найдено SATC
[ 0.440178] DMAR: dmar0: Используется переключение по запросу
[ 0.440333] DMAR: Intel® Виртуализация Technology для Directed I/O
Вы можете использовать этот скрипт, который я нашёл, чтобы проверить группы IOMMU:
`# vi check.sh`
`#!/bin/bash`
`shopt -s nullglob`
`for g in /sys/kernel/iommu_groups/*; do`
`echo "IOMMU Group ${g##*/}:"`
`for d in $g/devices/*; do`
`echo -e "\t$(lspci -nns ${d##*/})" `
`done;`
`done;`
`save,quit`
`# chmod +x check.sh`
`# ./check.sh`
Отредактируйте следующие файлы для подготовки к передаче GPU Nvidia:
(Вы можете найти PCI ID своей Nvidia через `lspci -nn | grep -i nvidia`)
`# vi /etc/modprobe.d/vfio.conf`
`options vfio-pci ids=10de:2531,10de:228e disable_vga=1`
`# vi /etc/modprobe.d/kvm.conf`
`options kvm ignore_msrs=1`
`# vi /etc/modprobe.d/iommu_unsafe_interrupts.conf`
`options vfio_iommu_type1 allow_unsafe_interrupts=1`
`# vi /etc/modprobe.d/pve-blacklist.conf`
`blacklist nvidia`
`blacklist nouveau`
`blacklist radeon`
`save,quit`
`# vi /etc/modprobe.d/blacklist.conf`
`blacklist nvidiafb`
`blacklist nvidia`
`blacklist nouveau`
`blacklist radeon`
`save,quit`
`# vi /etc/modules`
# Модули, необходимые для передачи PCI
`vfio`
`vfio_iommu_type1`
`vfio_pci`
`vfio_virqfd`
# Модули, необходимые для GVT Intel
`kvmgt`
`exngt`
`vfio-mdev`
`save,quit`
`# update-initramfs -u -k all; update-grub; reboot`
Проверьте, что всё работает правильно. Если нет, просмотрите и/или повторите шаги соответствующего раздела, чтобы убедиться, что они были выполнены правильно.
