Proxmox8 で GPU Passthrough がやりたかったが・・・
Proxmox8 で GPUパススルーを使用したかったのですが、AMDだとどう頑張ってもできなく諦めていたのですが、話題の「Intel N100」を購入したので試してみました。
とりあえずどのN100製品でも vGPU (VT-d) Passthrough ができると思いますが私が使用したPCや環境は以下とおりです。
・商品:Beelink N100 MINI-S12 Pro
・CPU:Intel N100(Alder Lake-N)
・memory:DDR4 SDRAM 16GB(32GBでも使えましたYO)
・ホスト
・Proxmox VE 8.0.4 / kernel 6.2.16-19-pve ※2023/11/09時点
・ゲスト
・Windows 11 Enterprise Evaluation
※ちなみに、使用できる kernel バージョンがシビアだそうです。
Beelink N100 MINI-S12 Pro
少しだけ Beelink N100 MINI-S12 Pro を紹介してみます。
少し話題的には遅いかもですが、N100 マシンを購入してみました。Amazon みると2万台ですがフリマで1.3万で売っていたのでぽちっってみました。今のとこ(2023/11)N100搭載しているミニPCは、中華メーカしか出ていないみたいですが割と色々なメーカから出しているので選択肢はかなり多いです。
Beelink N100 MINI-S12 Pro ですが拡張性もあるし性能もIntel Core i5 6500相当というので遊ぶにはいいと思います(もちろん普段使いできる性能です)。ですので安いの見つけたらぽちるのがいいと思います。
良い点
・HDMIポート/USB3.1/ギガビットLANポート ふつうーにある
・TDP 6W(高負荷時 20W)で省電力
・静穏ファンで非常に静か
・N100 のパフォーマンスが良すぎる!
・NVMe/メモリを換装できる ※メモリ32GBまでいけました
悪い点
・メモリー、NVMe が・・怪しい(私は、即交換しました)
・Windows11 Pro VL ライセンスが不安
買いってことでw
ようするに見かけたら買いましょう!!
N100ミニPCを購入するときに気をつける点
・メモリが直付けでないこと!(メモリ換装したいですよね)
・NVMe と明記されているのに SSDかも (NVMeがいいですよね)
・ファンがしょぼい (そういう製品もあるようです)
・Windows11 Pro ついているけど、あれかもしれない (詳しくはググってください)
とりあえず普通に GPUパススルーが出来できない(ここから本題)
Intelの場合(vt-d必須) GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off"
を記述することで割と簡単にできる・・みたいな記事があり他のサイトをみても Windows 側のディスプレイアダプタとして認識するもドライバが コード43
を返しどうしようもありませんでした。
コード43 を回避するためにintelドライバを入れても解決せず・・・むむむ
vGPU (VT-d) Passthrough で設定してみる
NVIDIA の技術で ホストサーバーに搭載したGPU仮想的に分割して使用することを "vGPU" と言うらしいです。N100 でも vGPU (VT-d) Passthrough ができるというので設定してみます。
SR-IOV (シングル ルート I/O 仮想化) に関連する、Intel VT-d (Intel Virtualization Technology for Directed I/O) と呼ばれる新しいテクノロジがあります。これにより、互換性のあるデバイスは、GPU などのデバイスを複数の VF (仮想機能) に仮想化できます。
i915-sriov-dkms を設定する
i915-sriov-dkms するために、Gitから最新の Dynamic Kernel Module System (DKMS) リポジトリからソースを取得しコンパイル~導入という手順を踏みます。Proxmox UI でホストシェルを起動してもよいしSSHで接続してもよいのでまず黒い画面で操作します。
# apt-get install git
# mkdir repo
# cd repo
# git clone https://github.com/strongtz/i915-sriov-dkms.git
# cd i915-sriov-dkms/
dkms.conf
ファイルを編集します。PACKAGE_VERSION
には、カーネルバージョンを指定します(コンパイルにはあまり影響がないです)。
# cat dkms.conf
PACKAGE_NAME="i915-sriov-dkms"
PACKAGE_VERSION="6.2"
コンパイルに必要な情報を更新するコマンドを実行し・・・
# cd ..
# cp -rp i915-sriov-dkms/ /usr/src/i915-sriov-dkms-6.2
# apt update && apt install pve-headers-$(uname -r)
# apt install git dkms build-* unzip -y
コンパイルします。
# dkms install --force -m i915-sriov-dkms -v 6.2
Building module:
Cleaning build area...
make -j4 KERNELRELEASE=6.2.16-19-pve -j4 -C /lib/modules/6.2.16-19-pve/build M=/var/lib/dkms/i915-sriov-dkms/6.2/build KVER=6.2.16-19-pve..........................(bad exit status: 2)
Error! Bad return status for module build on kernel: 6.2.16-19-pve (x86_64)
Consult /var/lib/dkms/i915-sriov-dkms/6.2/build/make.log for more information.
なんだかエラーが発生しているのでログファイルを見てみます。
# cat /var/lib/dkms/i915-sriov-dkms/6.2/build/make.log
/var/lib/dkms/i915-sriov-dkms/6.2/build/drivers/gpu/drm/i915/display/intel_dp.c:3890:9: error: implicit declaration of function ‘drm_dp_mst_hpd_irq’; did you mean ‘intel_dp_mst_hpd_irq’? [-Werror=implicit-function-declaration]
3890 | drm_dp_mst_hpd_irq(&intel_dp->mst_mgr, esi, &handled);
| ^~~~~~~~~~~~~~~~~~
| intel_dp_mst_hpd_irq
intel_dp.c
のコンパイルでエラーが発生しています。調べると issues にもありました。
エラー部分を修正しましょう。念のため intel_dp.c
ファイルの場所を調べておきます。
# cd /usr/src/i915-sriov-dkms-6.2
# find . -name intel_dp.c
./i915-sriov-dkms/drivers/gpu/drm/i915/display/intel_dp.c
./drivers/gpu/drm/i915/display/intel_dp.c
i915-sriov-dkms/drivers....
のファイルだけ修正してもコンパイルエラーが発生していたので、2つのファイルを下記のように修正します。
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6,1,40) && LINUX_VERSION_CODE <= KERNEL_VERSION(6,1,99)) || LINUX_VERSION_CODE > KERNEL_VERSION(6,4,5)
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6,1,40) && LINUX_VERSION_CODE <= KERNEL_VERSION(6,1,99)) || LINUX_VERSION_CODE >= KERNEL_VERSION(6,2,0)
再度コンパイルします。下記のようになればOKです。
# dkms install --force -m i915-sriov-dkms -v 6.2
Sign command: /lib/modules/6.2.16-19-pve/build/scripts/sign-file
Signing key: /var/lib/dkms/mok.key
Public certificate (MOK): /var/lib/dkms/mok.pub
Building module:
Cleaning build area...
make -j4 KERNELRELEASE=6.2.16-19-pve -j4 -C /lib/modules/6.2.16-19-pve/build M=/var/lib/dkms/i915-sriov-dkms/6.2/build KVER=6.2.16-19-pve..............................
Signing module /var/lib/dkms/i915-sriov-dkms/6.2/build/i915.ko
Cleaning build area...
i915.ko:
Running module version sanity check.
- Original module
- Installation
- Installing to /lib/modules/6.2.16-19-pve/updates/dkms/
depmod...
DKMS ステータスを確認してみましょう。
# dkms status
i915-sriov-dkms/6.2, 6.2.16-19-pve, x86_64: installed
GRUBオプションの編集と設定
とりあえず i915-sriov-dkms
のモジュールが作成できたので、やっとパススルーの設定ができます。
/etc/default/grub を下記のように編集します。vfs
の数値は、GPU仮想で使用する個数を設定しますが、使用するたびに 2GB? 使用されるようですので注意が必要です。
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=2"
grub を更新し、sysfsutils をインストールします。※ZFS のときはコマンド違います!!
# update-grub
# update-initramfs -u
# apt install sysfsutils -y
とりあえず VGA カードと PCIe バスの状態を見てみます。通常は 00:02.0
らしいです。
# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
PCIe バス番号を設定します。これ設定しないとだめでした。
# echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 2" > /etc/sysfs.conf
この段階でいったん Proxmox を再起動します。
再起動後に下記のコマンドで VF が有効(Enabled 2 VFs)になっているか確認します。
# dmesg | grep i915
[ 4.329179] i915 0000:00:02.0: Running in SR-IOV PF mode
[ 4.971234] i915 0000:00:02.0: Enabled 2 VFs
Windows の VM に PCIデバイスを追加
ここまでくればPCIデバイスを追加するだけです。念のため複数のGPUが存在するのかを確認します。赤枠部分が VF化されたGPUとなります。
あとは、PCIデバイスを追加します。プライマリGPUにチェックをいれておきます。
複数のVMでGPUを使うことできるか、、確認します。
こういうとき評価版windows使うと便利ですね。
カーネルのバージョンを固定する
システムアップデートしたときカーネルのバージョンが変更されると動かなくなるので、今のカーネルバージョンで固定化しておきます。
# uname -r
6.2.16-19-pve
# proxmox-boot-tool kernel pin 6.2.16-19-pve
Setting '6.2.16-19-pve' as grub default entry and running update-grub.
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.2.16-19-pve
Found initrd image: /boot/initrd.img-6.2.16-19-pve
Found linux image: /boot/vmlinuz-6.2.16-3-pve
Found initrd image: /boot/initrd.img-6.2.16-3-pve
Found memtest86+ 64bit EFI image: /boot/memtest86+x64.efi
Adding boot menu entry for UEFI Firmware Settings ...
done
最後に
N100は遊べますね。というか1台のProxmoxだと壊したとき(色々いじって)面倒なのでサブで遊べるProxmoxがあるといいですね。あと当然ながらIntel Core i5 6500相当といっても省電力設計なのか少しでも負荷をかけるとすぐにCPU使用率が顕著に上がるので気にする人いるかな?。そうは言ってもパワーあるし低電力でファンも静か(PL1/PL2 もう少しいじってもいいかも)なので気に入りました。
参考にさせて頂いたサイト様