Proxmox8 を試してみる　その１４　vGPU (VT-d) Passthrough with Intel Alder Lake

# 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は、中華メーカしか出ていないみたいですが割と色々なメーカから出しているので選択肢はかなり多いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/38a31d92-67e8-4546-fbaa-4d03c7142f43.png)

Beelink N100 MINI-S12 Pro ですが拡張性もあるし性能もIntel Core i5 6500相当というので遊ぶにはいいと思います（もちろん普段使いできる性能です）。ですので安いの見つけたらぽちるのがいいと思います。

良い点
　・HDMIポート/USB3.1/ギガビットLANポート ふつうーにある
　・TDP 6W（高負荷時 20W）で省電力
　・静穏ファンで非常に静か
　・N100 のパフォーマンスが良すぎる！
　・NVMe/メモリを換装できる　※メモリ32GBまでいけました
悪い点
　・メモリー、NVMe が・・怪しい（私は、即交換しました）
　・Windows11 Pro VL ライセンスが不安

## 買いってことでｗ
ようするに見かけたら買いましょう！！

N100ミニPCを購入するときに気をつける点
　・メモリが直付けでないこと！（メモリ換装したいですよね）
　・NVMe と明記されているのに SSDかも　（NVMeがいいですよね）
　・ファンがしょぼい　（そういう製品もあるようです）
　・Windows11 Pro ついているけど、あれかもしれない　（詳しくはググってください）

https://pc.watch.impress.co.jp/docs/column/hothot/1493167.html

# とりあえず普通に GPUパススルーが出来できない（ここから本題）
Intelの場合(vt-d必須) `GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off"` を記述することで割と簡単にできる・・みたいな記事があり他のサイトをみても Windows 側のディスプレイアダプタとして認識するもドライバが `コード43` を返しどうしようもありませんでした。

https://qiita.com/fsdg-kohei-ioroi/items/d90cd0e8d119b70ac9ce

コード43 を回避するためにintelドライバを入れても解決せず・・・むむむ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/444037da-7c06-867b-e9a6-b7547221bf91.png)

# vGPU (VT-d) Passthrough で設定してみる
NVIDIA の技術で ホストサーバーに搭載したGPU仮想的に分割して使用することを "vGPU" と言うらしいです。N100 でも vGPU (VT-d) Passthrough ができるというので設定してみます。

:::note info
SR-IOV (シングル ルート I/O 仮想化) に関連する、Intel VT-d (Intel Virtualization Technology for Directed I/O) と呼ばれる新しいテクノロジがあります。これにより、互換性のあるデバイスは、GPU などのデバイスを複数の VF (仮想機能) に仮想化できます。
:::

https://www.derekseaman.com/2023/06/proxmox-ve-8-windows-11-vgpu-vt-d-passthrough-with-intel-alder-lake.html

## i915-sriov-dkms を設定する
i915-sriov-dkms するために、Gitから最新の Dynamic Kernel Module System (DKMS) リポジトリからソースを取得しコンパイル～導入という手順を踏みます。Proxmox UI でホストシェルを起動してもよいしSSHで接続してもよいのでまず黒い画面で操作します。

```bash
# 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` には、カーネルバージョンを指定します（コンパイルにはあまり影響がないです）。

```bash
# cat dkms.conf 
PACKAGE_NAME="i915-sriov-dkms"
PACKAGE_VERSION="6.2"
```

コンパイルに必要な情報を更新するコマンドを実行し・・・

```bash
# 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
```

コンパイルします。

```bash
# 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.
```

なんだかエラーが発生しているのでログファイルを見てみます。

```text
# 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 にもありました。

https://github.com/strongtz/i915-sriov-dkms/issues/117

エラー部分を修正しましょう。念のため `intel_dp.c` ファイルの場所を調べておきます。

```bash
# 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....` のファイルだけ修正してもコンパイルエラーが発生していたので、２つのファイルを下記のように修正します。

```diff_c
-#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です。

```bash
# 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 ステータスを確認してみましょう。

```bash
# 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？ 使用されるようですので注意が必要です。

```text
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=2"
```

grub を更新し、sysfsutils をインストールします。※ZFS のときはコマンド違います！！

```bash
# update-grub
# update-initramfs -u
# apt install sysfsutils -y
```

とりあえず VGA カードと PCIe バスの状態を見てみます。通常は `00:02.0` らしいです。

```bash
# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
```

PCIe バス番号を設定します。これ設定しないとだめでした。

```bash
# echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 2" > /etc/sysfs.conf
```

この段階でいったん Proxmox を再起動します。
再起動後に下記のコマンドで VF が有効（Enabled 2 VFs）になっているか確認します。

```bash
# 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となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/1384313e-2fe3-64ef-3ae9-f5c61055713a.png)

あとは、PCIデバイスを追加します。プライマリGPUにチェックをいれておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/bc78fd66-4a33-d3f5-a48b-52d5892d83ff.png)

複数のVMでGPUを使うことできるか、、確認します。
こういうとき評価版windows使うと便利ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/82126dda-6bbc-63a2-c2a0-0987111250b1.png)

# カーネルのバージョンを固定する
システムアップデートしたときカーネルのバージョンが変更されると動かなくなるので、今のカーネルバージョンで固定化しておきます。

```bash
# 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
```

https://qiita.com/disksystem/items/ec8d81548f3b106f74e7

# 最後に
N100は遊べますね。というか１台のProxmoxだと壊したとき（色々いじって）面倒なのでサブで遊べるProxmoxがあるといいですね。あと当然ながらIntel Core i5 6500相当といっても省電力設計なのか少しでも負荷をかけるとすぐにCPU使用率が顕著に上がるので気にする人いるかな？。そうは言ってもパワーあるし低電力でファンも静か（PL1/PL2 もう少しいじってもいいかも）なので気に入りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/abbe9943-1aaf-6e11-4a24-3e5318f12d8d.png)

# 参考にさせて頂いたサイト様

https://nofu.jp/wiki/virtualization/proxmox_ve_8_0_how_to_use_n100_vgpu

https://www.derekseaman.com/2023/06/proxmox-ve-8-windows-11-vgpu-vt-d-passthrough-with-intel-alder-lake.html