ソースの表示以前のリビジョンバックリンク全て展開する/折り畳む文書の先頭へ Share via Share via... Twitter LinkedIn Facebook Pinterest Telegram WhatsApp Yammer Reddit Teams最近の変更Send via e-Mail印刷パーマリンク × 目次 Proxmox VE 6.3でPCIパススルーあれこれ 試した環境 PCIパススルーの有効化 IOMMUの有効化 VFIOモジュールの読み込み Interrupt Remappingの確認 IOMMUの状態を確認 IOMMUデバイスグループの確認 VFIOの設定 参考サイト 文書の過去の版を表示しています。 Proxmox VE 6.3でPCIパススルーあれこれ 試した環境 Proxmox VE 6.3-3 ZFSルート環境 Supermicro X10DRi Xeon E5-2673v3×2 PCIパススルーの有効化 IOMMUの有効化 カーネルコマンドラインでIOMMUを有効化する。PCIパススルーの有効化とは、本質的にはこれだけ。 /etc/kernel/cmdlineにintel_iommu=on iommu=ptを追加し、pve-efiboot-tool refreshを実行する。 # cat /etc/kernel/cmdline root=ZFS=rpool/ROOT/pve-1 boot=zfs intel_iommu=on iommu=pt # pve-efiboot-tool refresh unning hook script 'pve-auto-removal'.. Running hook script 'zz-pve-efiboot'.. Re-executing '/etc/kernel/postinst.d/zz-pve-efiboot' in new private mount namespace.. Copying and configuring kernels on /dev/disk/by-uuid/D067-47DC Copying kernel and creating boot-entry for 5.4.78-2-pve なお、AMDプラットフォームの場合はamd_iommu=onとする。 また、ZFSルートシステム以外では/etc/default/grubのGRUB_CMDLINE_LINUX_DEFAULTに上記のパラメータを追加し、update-grubを実行する。 VFIOモジュールの読み込み (2021-01-04 追記) VFIOはLinux 3.6からカーネルに内蔵されたため、本作業は必要ないようだ。少なくともうちの環境ではmodulesを書き換えずともVFIOが使えている。参考情報として残しておく。 /etc/modulesにPCIパススルーに必要なモジュールを記述する。 vfio vfio_iommu_type1 vfio_pci vfio_virqfd カーネルモジュール関連の変更を行った際は、忘れずにinitramfsの再構築を行う。 # update-initramfs -u -k all Interrupt Remappingの確認 システムがIRQマッピングに対応してるか確認する。 起動メッセージ内にremapping enabled的なログがあればOK。 # dmesg | grep 'remapping' [ 1.736785] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping. [ 1.737508] DMAR-IR: Enabled IRQ remapping in x2apic mode ない場合はallow_unsafe_interruptsを設定すればいいらしい。 # echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/vfio.conf IOMMUの状態を確認 一度システムを再起動しIOMMUを有効化と状態の確認を行う。 起動メッセージ内にIOMMU enabledとあればOK。 # dmesg | grep -e DMAR -e IOMMU -e AMD-Vi [ 0.014749] ACPI: DMAR 0x0000000079D90148 000128 (v01 ALASKA A M I 00000001 INTL 20091013) [ 0.950958] DMAR: IOMMU enabled [ 1.734721] DMAR: Host address width 46 [ 1.734724] DMAR: DRHD base: 0x000000fbffc000 flags: 0x0 [ 1.734732] DMAR: dmar0: reg_base_addr fbffc000 ver 1:0 cap d2078c106f0466 ecap f020de [ 1.734736] DMAR: DRHD base: 0x000000c7ffc000 flags: 0x1 [ 1.734742] DMAR: dmar1: reg_base_addr c7ffc000 ver 1:0 cap d2078c106f0466 ecap f020de [ 1.734746] DMAR: RMRR base: 0x0000007bc18000 end: 0x0000007bc27fff [ 1.734749] DMAR: ATSR flags: 0x0 [ 1.734751] DMAR: RHSA base: 0x000000c7ffc000 proximity domain: 0x0 [ 1.734754] DMAR: RHSA base: 0x000000fbffc000 proximity domain: 0x1 [ 1.734758] DMAR-IR: IOAPIC id 3 under DRHD base 0xfbffc000 IOMMU 0 [ 1.734761] DMAR-IR: IOAPIC id 1 under DRHD base 0xc7ffc000 IOMMU 1 [ 1.734764] DMAR-IR: IOAPIC id 2 under DRHD base 0xc7ffc000 IOMMU 1 [ 1.734766] DMAR-IR: HPET id 0 under DRHD base 0xc7ffc000 [ 1.734769] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping. [ 1.735497] DMAR-IR: Enabled IRQ remapping in x2apic mode [ 3.273462] DMAR: dmar0: Using Queued invalidation [ 3.273479] DMAR: dmar1: Using Queued invalidation [ 3.295150] DMAR: Intel(R) Virtualization Technology for Directed I/O [ 3.421919] ehci-pci 0000:00:1a.0: DMAR: 32bit DMA uses non-identity mapping [ 3.539671] ehci-pci 0000:00:1d.0: DMAR: 32bit DMA uses non-identity mapping IOMMUデバイスグループの確認 PCIパススルーしたいデバイスのIOMMUグループを確認する。 パススルーはIOMMUグループ単位で行われるため、対象デバイスと同一グループの不必要なデバイスも一緒にパススルーされてしまう。 シェルから確認する場合は以下のような感じで。 # find /sys/kernel/iommu_groups/ -type l | sort ... /sys/kernel/iommu_groups/40/devices/0000:00:1d.0 /sys/kernel/iommu_groups/41/devices/0000:00:1f.0 /sys/kernel/iommu_groups/41/devices/0000:00:1f.2 /sys/kernel/iommu_groups/41/devices/0000:00:1f.3 /sys/kernel/iommu_groups/42/devices/0000:01:00.0 ... IOMMUグループの変更はデバイスを取りつけるPCIeスロットを変えるのが基本だが、どうにもならない時はACSオーバーライドを使う。 カーネルの起動パラメータにpcie_acs_override=paramを追加して再起動。 id:vvvv:dddd downstream multifunction 上手くいけば下図のようにIOMMUグループが分離される。でも、必ずしも分離できるとは限らないので、その時は諦めるしかない。 VFIOの設定 パススルーしたいデバイスのベンダIDとデバイスIDをVFIOの設定に追加する。 要検証:一度でも通常のドライバが適用されるとマズいデバイス(GPUとか)以外では特に設定しなくても大丈夫かも?そもそもカーネル内蔵のvfioドライバなので、confファイルによる指定は効いてないかも? ベンダIDとデバイスIDの調査。行末の[8086:8d62]ってやつが目当ての値。 # lspci -nn | grep SATA 00:11.4 SATA controller [0106]: Intel Corporation C610/X99 series chipset sSATA Controller [AHCI mode] [8086:8d62] (rev 05) 00:1f.2 SATA controller [0106]: Intel Corporation C610/X99 series chipset 6-Port SATA Controller [AHCI mode] [8086:8d02] (rev 05) vfio.confに追記。initramfsの更新もお忘れなく。 # echo 'options vfio-pci ids=8086:86d2' >> /etc/modprobe.d/vfio.conf カーネルの起動パラメータとして指定する場合はcmdlineにvfio-pci.idsで指定する。 root=ZFS=rpool/ROOT/pve-1 boot=zfs intel_iommu=on iommu=pt vfio-pci.ids=8086:8562 参考サイト Proxmox VE Administration Guide 10.9. PCI(e) Passthrough 3.11. Host Bootloader OVMF による PCI パススルー - ArchWiki KVM-wiki TOP - PukiWiki virtualization/proxmox_ve_6_3_pci_passthrough_tips.1610581233.txt.gz 最終更新: 2021-01-14 08:40by Decomo