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じゃないかって?
確かにその通り。製品仕様も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側でふつーにドライバを入れるだけ。
RDPの解像度の関係で見切れちゃってるけど、FFベンチもばっちり動くよ!絶対性能が足りてないので重いけど。
備考
- 冒頭で書いたとおり、カーネルとドライバの組み合わせが結構シビアで、当初はエラーコード43で正しく動かなかった。
- 試した組み合わせでも一部の3Dアプリケーションは正しく動かない(DQ10ベンチとか)
- またQSVもダメっぽい
- VFがアクティブになると1VFにつき2GB弱のメモリが持っていかれる模様。メモリ12GBのLarkBoxだと大分カツカツ