Proxmox上で稼働するVMにN100をパススルーする

TL;DR

  • BIOSからVT-d関連の設定を有効にする
  • /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt" する
  • 管理画面からRaw Deviceの UHD Graphics をVMに割り当て
  • VMを再起動して lspci で認識されていることを確認

はじめに

最近録画鯖を再構築したのですが、ffmpegでエンコードさせているとCPUが限界を迎えてしまうので、QSVEncCに変更します。
対象のシステムはproxmox上のVMに構築されているk8s上で稼働しているため、まずはVMまでパススルーすることを目指します。
Kernelバージョンが低い場合(6.1以下?)にドライバが利用出来ないことがあるため、古い場合は先にそちらを更新する必要があります。

環境

  • Proxmox 8.1.3
    • 4 x Intel(R) N100 (1 Socket)
  • Ubuntu 22.04.3 LTS
    • 6.8.0-124-generic

BIOSの設定変更

BIOSの設定画面からVT-dを有効にします。
今回の中華ミニPCには設定可能な項目の中には見つからなかったのですが、サポートされているCPUだったのでひとまず先に進みました。

Proxmoxの設定変更

後述するデバイスの割り当てを実施しようとした際に No IOMMU detected, please activate it.See Documentation for further information. と出てくるためgrubの設定を追加します。

/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT に追記します

1- GRUB_CMDLINE_LINUX_DEFAULT="quiet"
2+ GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

grubの設定を更新します。

1update-grub

一度再起動しておきます

VMの設定変更

対象のVMをシャットダウンして、

Virtual Machine -> 対象のVM -> Hardware へ移動してAddから追加します。
Raw Deviceの中にある UHD Graphics を選択します。

VMを再起動しておきます。

もし、起動しない場合は以下でログを見ると原因があるかもしれません。
自分の場合は今回の変更でoom-killされるようになっていたのでVMの設定を修正しました。

1journalctl -n 50 --no-pager | grep -i qemu

VMで認識していることを確認

i915を利用していることを確認します。

 1sky@base:~$ lspci -v -s 00:10.0
 200:10.0 VGA compatible controller: Intel Corporation Device 46d1 (prog-if 00 [VGA controller])
 3        Subsystem: Device 1e50:8023
 4        Physical Slot: 16
 5        Flags: bus master, fast devsel, latency 0, IRQ 39
 6        Memory at fd000000 (64-bit, non-prefetchable) [size=16M]
 7        Memory at e0000000 (64-bit, prefetchable) [size=256M]
 8        I/O ports at f040 [size=64]
 9        Expansion ROM at 000c0000 [disabled] [size=128K]
10        Capabilities: <access denied>
11        Kernel driver in use: i915
12        Kernel modules: i915, xe

vainfoとintel-gpu-toolsをインストールします。
インストール後再起動しておきます。

1sudo apt-get install vainfo intel-gpu-tools

再起動後にそれぞれコマンドが動作することを確認します。

 1vainfo | head -n 10
 2error: can't connect to X server!
 3libva info: VA-API version 1.14.0
 4libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
 5libva info: Found init function __vaDriverInit_1_14
 6libva info: va_openDriver() returns 0
 7vainfo: VA-API version: 1.14 (libva 2.12.0)
 8vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 22.3.1 ()
 9vainfo: Supported profile and entrypoints
10      VAProfileNone                   : VAEntrypointVideoProc
11      VAProfileNone                   : VAEntrypointStats
12      VAProfileMPEG2Simple            : VAEntrypointVLD
13      VAProfileMPEG2Simple            : VAEntrypointEncSlice
14      VAProfileMPEG2Main              : VAEntrypointVLD
15      VAProfileMPEG2Main              : VAEntrypointEncSlice
16      VAProfileH264Main               : VAEntrypointVLD
1sudo intel_gpu_top
2intel-gpu-top: 8086:46d1 @ /dev/dri/card1 -    0/   0 MHz;   0% RC6;        0 irqs/s
3         ENGINES     BUSY                                                        MI_SEMA MI_WAIT
4       Render/3D    0.00% |                                                    |      0%      0%
5         Blitter    0.00% |                                                    |      0%      0%
6           Video    0.00% |                                                    |      0%      0%
7    VideoEnhance    0.00% |                                                    |      0%      0%

その他

おそらく直接関係はないと思われるが、試したことのメモ書き

i915のドライバが利用されない

Kernelが古いとドライバが利用できないため更新します。

1sudo apt install --install-recommends linux-generic-hwe-22.04 -y

以下も一応実施したのですが、おそらくKernel更新して解決したと思われるのでメモ程度に

etc/modprobe.d/i915.conf に以下を追記

1options i915 enable_guc=3
2options i915 enable_fbc=1

initramfsを更新して再起動

1sudo update-initramfs -u
2sudo reboot

ProxmoxでiGPUを掴まないようにする

/etc/modprobe.d/pve-blacklist.conf に以下を追記

1blacklist i915
2blacklist intel_agp
3options kvm ignore_msrs=1
4options vfio_pci disable_vga=1

更新して再起動

1update-initramfs -u -k all
2reboot

参考サイト