====== Proxmox VE 8.0でIntel N100のiGPUをSR-IOVしてみる ======
Intel CPUの内蔵GPUは第12世代、すなわちXe Graphicsから何とSR-IOVに対応しているらしい。従来のIntel iGPUの仮想化はGVT-gの調停デバイスを介したもので、お膳立てがちょっと面倒だった(それでもvGPUが使えるだけで神なわけだけど)。SR-IOVならVF生やしてVMにパススルーするだけなのでとっても楽になる。
手元に丁度Intel N100のマシンがあるので実際に試してみた。
N100のiGPUはUHD Graphicsじゃないかって?
確かにその通り。[[https://www.intel.co.jp/content/www/jp/ja/products/sku/231803/intel-processor-n100-6m-cache-up-to-3-40-ghz/specifications.html|製品仕様]]もOSからの認識もUHD Graphicsである。ところが、''lspci -v''で見てみると燦然と輝く''Capabilities: [320] Single Root I/O Virtualization (SR-IOV)''の文字が飛び込んでくる。
これはもう試してみるっきゃないでしょー。
===== 試した環境 =====
* CHUWI LarkBox X 2023
* ホスト
* Proxmox VE 8.0.3
* Linux kernel 6.2.16-3-pve (x86_64)
* Root on ZFSな環境
* strongtz/i915-sriov-dkms
* db4e8ccd9bd31fad79361e27afc032487426fe6a か 31d24b38b2ac2c05e4491ea7ab1578af4a5f7566
* ゲスト
* Windows 11 22H2 ビルド22621.2283
* Intel Graphics Driver 31.0.101.4146 (gfx_win_101.4146.exe)
2023-09-18現在、ドライバは未成熟なのでホストのLinuxカーネルバージョン、ホスト側ドライバ、ゲスト側ドライバの組み合わせが結構シビアな点には注意されたい。
===== 手順 =====
==== SR-IOV対応のカーネルモジュールの作成 ====
標準のi915カーネルモジュールは今のところSR-IOV未対応である。有志によって開発されているSR-IOV対応版をビルドして使う必要がある。
必要なパッケージを入れる。
# apt install pve-headers-$(uname -r) build-* dkms unzip sysfsutils
ソースコードを取得して展開。
# wget https://github.com/strongtz/i915-sriov-dkms/archive/refs/heads/master.zip
# unzip master.zip
''dkms.conf''の''PACKAGE_NAME''と''PACKAGE_VERSION''を以下のように書き換える。
Linux分からんマンなので、バージョン番号のあるべき姿が分からんのだけど、とりあえずカーネルバージョンに合わせておいた。
# cat i915-sriov-dkms-master/dkms.conf
PACKAGE_NAME="i915-sriov-dkms"
PACKAGE_VERSION="6.2"
ソースコードを所定の場所に移動してビルド。
# mv i915-sriov-dkms-master /usr/src/i915-sriov-dkms-6.2
# dkms install --force -m i915-sriov-dkms -v 6.2
==== PCIパススルーの準備 ====
カーネルコマンドラインに設定を追加する。
ext4(とbrtfsも?)な人は''/etc/defaults/grub''の''GRUB_CMDLINE_LINUX_DEFAULT''をいじってください。
# cat /etc/kernel/cmdline
root=ZFS=rpool/ROOT/pve-1 boot=zfs intel_iommu=on i915.enable_guc=3 i915.max_vfs=2
N100の場合、VFは最大4つ作れるっぽいが、それだけリソースを浪費するのでほどほどに。
カーネルコマンドラインを反映して再起動。GRUBな人は''update-grub''してください。
# pve-efiboot-tool refresh
# update-initramfs -u -k all
# reboot
再起動後、iGPUがPFモードで動作し、VFが作られてれば大成功。
# dmesg | grep i915
[ 3.803063] i915 0000:00:02.0: Running in SR-IOV PF mode
[ 3.849960] i915 0000:00:02.0: 2 VFs could be associated with this PF
VFが生えていることも確認できる。
# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics] ←PF
00:02.1 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics] ←VF
00:02.2 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics] ←VF
sysfs経由で動的にVFの数を変えることもできる。
# echo 0 > '/sys/bus/pci/devices/0000:00:02.0/sriov_numvfs'
# dmesg | grep -E 'i915.+VFs'
[81209.898868] i915 0000:00:02.0: Disabled 2 VFs
# echo 4 > '/sys/bus/pci/devices/0000:00:02.0/sriov_numvfs'
# dmesg | grep -E 'i915.+VFs'
[81328.231346] i915 0000:00:02.0: Enabled 4 VFs
==== VMの設定 ====
後はもう何も難しいことはなく、VMの設定でiGPUのVFをVMに追加し、ゲストのWindows側でふつーにドライバを入れるだけ。
{{ :virtualization:pve80_n100_igpu_sr-iov_attach_to_vm.png |}}
RDPの解像度の関係で見切れちゃってるけど、FFベンチもばっちり動くよ!絶対性能が足りてないので重いけど。
{{ :virtualization:pve80_n100_igpu_sr-iov_running_ff14bench.jpg |}}
===== 備考 =====
* 冒頭で書いたとおり、カーネルとドライバの組み合わせが結構シビアで、当初はエラーコード43で正しく動かなかった。
* 試した組み合わせでも一部の3Dアプリケーションは正しく動かない(DQ10ベンチとか)
* またQSVもダメっぽい
* VFがアクティブになると1VFにつき2GB弱のメモリが持っていかれる模様。メモリ12GBのLarkBoxだと大分カツカツ
===== 参考サイト =====
* [[https://open-iov.org/index.php/GPU_Support|GPU Support - Open-IOV]]
* [[https://github.com/strongtz/i915-sriov-dkms|strongtz/i915-sriov-dkms: dkms module of Linux i915 driver with SR-IOV support]]
* [[https://www.michaelstinkerings.org/gpu-virtualization-with-intel-12th-gen-igpu-uhd-730/|vGPU (SR-IOV) with Intel 12th Gen iGPU]]
* [[https://forum.level1techs.com/t/i915-driver-with-sr-iov-on-13th-gen-i7-13700/197825|I915 driver with SR-IOV on 13th Gen i7-13700 - Software & Operating Systems / Linux - Level1Techs Forums]]