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)
の文字が飛び込んでくる。
これはもう試してみるっきゃないでしょー。
2023-09-18現在、ドライバは未成熟なのでホストのLinuxカーネルバージョン、ホスト側ドライバ、ゲスト側ドライバの組み合わせが結構シビアな点には注意されたい。
標準の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
カーネルコマンドラインに設定を追加する。
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の設定でiGPUのVFをVMに追加し、ゲストのWindows側でふつーにドライバを入れるだけ。
RDPの解像度の関係で見切れちゃってるけど、FFベンチもばっちり動くよ!絶対性能が足りてないので重いけど。