Proxmox9でIntel Core Ultra 7 (Arrow Lake) のiGPUをSR-IOVで仮想化して共有


最初に

Proxmox VE上で動かしているVMでGPUを使いたい場合があるけど、それぞれにGPUを用意してpassthroughするのも費用対効果が悪いし、ちゃんとした仮想化が使えるGPUは高いしなあと思ってたら、IntelのSR-IOVを使うと物理ファンクション(PF)を仮想ファンクション(VF)に分割することが可能らしい。 つまり、GPU(PF)を複数のvGPU(VF)に分割して、分割したvGPUをそれぞれのVMに割り当てることができるらしい。 しかも、CPUに内蔵のiGPUでもいけるらしい。これでお家サーバでもお手軽vGPU環境だね。 ちなみに手元で試したハードウェア環境は Lenovo ThinkStation P3 Tiny Gen 2 (Intel Core Ultra 7 265) です。

Proxmox VE準備 (PVE9.1にstrongtz/i915-sriov-dkms適用)

ハードウェアの設定で、Intel VT-dやSR-IOV機能が有効になっているのを確認。
Proxmox公式のダウンロードサイトを参照して、Proxmox VEをダウンロード。2026年2月時点で9.1が最新。適当なメディアを用意して、システムにインストール。起動したら画面上に管理コンソールへのURLが表示されているはず。
https://<Proxmox VEのIPアドレス>:8069
こんな感じ。ここにアクセスして設定を行っていく。 家庭用で使うならRepositoriesの設定をno-subscriptionにしてもいいかも。具体的には[ノード名]->[Repositories]で、Componentsがenterpriseとpve-enterpriseになっているエントリをdisableにして、その後[Add]を押して、[No-Subscription]と[Ceph Squid No-Subscription]をそれぞれ追加。
Proxmox VEを最新状態に更新するため、[ノード名]->[Updates]に行って、[Refresh]した後、[_> Upgrade]して最新にしておく。

いよいよstrongtz/i915-sriov-dkmsを導入。これがIntel iGPUの仮想化に必要となるモジュールです。なんと丁寧なことにProxmox VE 9.1向けの導入手順が書いてあるので、これに従うのみ。

# apt install build-essential dkms
# apt install proxmox-default-kernel proxmox-default-headers
# wget -O /tmp/i915-sriov-dkms_2026.03.05_amd64.deb "https://github.com/strongtz/i915-sriov-dkms/releases/download/2026.03.05/i915-sriov-dkms_2026.03.05_amd64.deb"
# dpkg -i /tmp/i915-sriov-dkms_2026.03.05_amd64.deb
そして、/etc/default/grubのGRUB_CMDLINE_LINUX_DEFAULTを以下のように更新。
# /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on i915.enable_guc=3 i915.max_vfs=7 module_blacklist=xe"
そして、grubを更新。その後GPUを何個のVFに分割するかを設定。下の7って数字が分割数。あまり大きくするとメモリへの影響もあるようなので、手元では4を設定して動作させてます。
# update-grub
# update-initramfs -u
# apt install sysfsutils
# echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf
Secure Bootを有効にしている場合には、追加で以下の手順が必要です。
# apt install mokutil
# mokutil --import /var/lib/shim-signed/mok/MOK.der
この時、適当なパスワードを決める必要があります。再起動時に、これが安全なシステムだと読み込ませるときに使うだけの一時的なパスワードです。これを入力した後、システムを再起動します。 そして、再起動時に青い画面でMOK Managementみたいな画面になったら、
  1. Enroll MOK
  2. Continue
  3. Yes
  4. mokutilコマンド実行時に決めたパスワード
と入力します。これを実施しないと先ほど作成したモジュールが読み込まれません。

# reboot
これで再起動してきて、lspciしたときに00:02.1などが見えてたら仮想化成功です。
# lspci
00:02.0 VGA compatible controller: Intel Corporation Arrow Lake-S [Intel Graphics] (rev 06)
00:02.1 VGA compatible controller: Intel Corporation Arrow Lake-S [Intel Graphics] (rev 06)
00:02.2 VGA compatible controller: Intel Corporation Arrow Lake-S [Intel Graphics] (rev 06)
00:02.3 VGA compatible controller: Intel Corporation Arrow Lake-S [Intel Graphics] (rev 06)
00:02.4 VGA compatible controller: Intel Corporation Arrow Lake-S [Intel Graphics] (rev 06)
この後、さらにおまけで作成したVFたちがホスト側で勝手に使われたりしないように、追加の手順をやっておきます。これはstrongtz/i915-sriov-dkmsのページのBlock VFs on the Host (Optional)の部分です。
# echo "vfio-pci" | sudo tee /etc/modules-load.d/vfio.conf
# cat /sys/devices/pci0000:00/0000:00:02.0/device
catコマンドで出てきた値が、iGPUのデバイスIDです。僕は0x7d76でした。この値を以下のようにATTR{device}==の後に埋め込んでこのデバイスIDがホストで見えた時にはvfio-pciを利用するように指定しておきます。
sudo tee /etc/udev/rules.d/99-i915-vf-vfio.rules <<EOF
# Bind all i915 VFs (00:02.1 to 00:02.7) to vfio-pci
ACTION=="add", SUBSYSTEM=="pci", KERNEL=="0000:00:02.[1-7]", ATTR{vendor}=="0x8086", ATTR{device}=="0x7d76", DRIVER!="vfio-pci", RUN+="/bin/sh -c 'echo \$kernel > /sys/bus/pci/devices/\$kernel/driver/unbind; echo vfio-pci > /sys/bus/pci/devices/\$kernel/driver_override; modprobe vfio-pci; echo \$kernel > /sys/bus/pci/drivers/vfio-pci/bind'"
EOF
この後、initramfsイメージを更新して、再起動して準備完了。
# update-initramfs -u
# reboot
再起動後にlspciで詳しく見てみると、ホストが利用する00:02.0にのみi915ドライバが適用され、それ以外の00:02.1などのVFではvfio-pciドライバが使われてホストが勝手に利用しない状態になっています。これで完成。
# lspci -nnk -s 00:02
00:02.0 VGA compatible controller [0300]: Intel Corporation Arrow Lake-S [Intel Graphics] [8086:7d67] (rev 06)
        DeviceName: Onboard - Video
        Subsystem: Lenovo Device [17aa:337a]
        Kernel driver in use: i915
        Kernel modules: i915, xe
00:02.1 VGA compatible controller [0300]: Intel Corporation Arrow Lake-S [Intel Graphics] [8086:7d67] (rev 06)
        Subsystem: Lenovo Device [17aa:337a]
        Kernel driver in use: vfio-pci
        Kernel modules: i915, xe
00:02.2 VGA compatible controller [0300]: Intel Corporation Arrow Lake-S [Intel Graphics] [8086:7d67] (rev 06)
        Subsystem: Lenovo Device [17aa:337a]
        Kernel driver in use: vfio-pci
        Kernel modules: i915, xe
00:02.3 VGA compatible controller [0300]: Intel Corporation Arrow Lake-S [Intel Graphics] [8086:7d67] (rev 06)
        Subsystem: Lenovo Device [17aa:337a]
        Kernel driver in use: vfio-pci
        Kernel modules: i915, xe
00:02.4 VGA compatible controller [0300]: Intel Corporation Arrow Lake-S [Intel Graphics] [8086:7d67] (rev 06)
        Subsystem: Lenovo Device [17aa:337a]
        Kernel driver in use: vfio-pci
        Kernel modules: i915, xe

Windows11ゲスト導入

strongtz/i915-sriov-dkmsの公式ドキュメントではBIOSファイルなどから必要なromを抜き出す手法が書いてありますが、手元の機材ではこの手法に対応していませんでした。なので、代わりにLongQT-sea/intel-igpu-passthruのromを利用させてもらうことにしました。
Proxmox VEで、iGPUに対応したromをダウンロードして、/usr/share/kvm/ にigd.romとして保存してます。
# wget -O /usr/share/kvm/igd.rom https://github.com/LongQT-sea/intel-igpu-passthru/releases/download/v0.1/ARL_MTL_GOPv22_igd.rom
Windows11ゲストの設定では、 に設定することが推奨されています。 最初はひとまずこの状態でWindows11をインストールして、起動する状態にしてからvGPUを導入していくのが王道です。Proxmox的標準Display(Display設定をDefaultに保ったままの設定)と共存しながら導入もできるので先に下のvGPUを追加しておいても対して違いはありません。ここはお好きなように。
なお、VirtIO的なディスクとネットワークを利用するには、Windows向けにFedoraから提供されているドライバを読み込ませる必要があります。以下のURLから virtio-win-0.1.285.iso などをダウンロードして、Windows11のインストール用ISOと同様にProxmox VEの[ノード名]-[local]のストレージのタブから、ISO Imagesにアップロードしておきます。
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/
Windows11インストールには、ストレージとネットワークの認識が必要になります。 Windows11の導入が終わったら、一旦Windows11ゲストをシャットダウンして、Proxmox VEで設定を変更していきます。

  1. 該当ゲストの[Hardware]のタブに移動
  2. [Add]で[PCI Device]を追加
  3. [Raw Device]からiGPUのVF(0000:00:02.x)を選んで追加。
    • 00:02.0がPVEホスト用物理デバイス
    • 00:02.1以降がVFなので、ここから他のVMと重ならないように選択
  4. Proxmox VEのshellを開く
  5. /etc/pve/qemu-server/{vmid}.confを編集
    • hostpci0:の行にpcie=1,romfile=igd.romを追加
Windows11でディスプレイアダプターが二つ見えるのを気にしないのであれば、VMのDisplay設定はdefaultのままでも問題ありません。手元のconfファイルで該当部分は以下のようになっています。
bios: ovmf
cpu: host
hostpci0: 0000:00:02.1,pcie=1,romfile=igd.rom
machine: pc-q35-10.1
ostype: win11
Windows11が起動して、Windows Updateが完了すると、自動的に Intel Corporation Driver Update (32.0.101.8132)が導入されて、GPUが利用できるようになります。
IntelのサイトからArc GPU向けのドライバをダウンロードすることもできますが、バージョンによっては起動不可になる場合もあります。例えば32.0.101.8425は大丈夫でしたが、32.0.101.8509では起動できませんでした。起動できなくなった時は一時的にVMの設定でプロセッサモデルをX86-64などに変更して起動すればドライバの読み込みを阻止できるので、デバイスマネージャーからドライバを更新して、8132ドライバに戻すことができます。
なお、Windows11でのセキュリティ設定で、コア分離のメモリ整合性はオフにしておく必要があります。これをしないとCode 43でエラーにドライバが読み込まれない状態でした。この設定は、[Windowsセキュリティ]-[デバイス セキュリティ」-[コア分離]-[メモリ整合性]にあります。

これまでのWindows11での注意点をまとめると、

です。

ubuntuゲスト導入

こちらはMachineタイプやCPUの制限などは特にないようです。ただし、 strongtz/i915-sriov-dkmsにある通り、ゲスト側でも同様のモジュールと、Intelのドライバを導入する必要があります。
# apt install build-* dkms linux-headers-$(uname -r)
# wget -O /tmp/i915-sriov-dkms_2026.03.05_amd64.deb "https://github.com/strongtz/i915-sriov-dkms/releases/download/2026.03.05/i915-sriov-dkms_2026.03.05_amd64.deb"
# dpkg -i /tmp/i915-sriov-dkms_2026.03.05_amd64.deb
# apt install intel-media-va-driver-non-free
そして、/etc/default/grubのGRUB_CMDLINE_LINUX_DEFAULTを以下のように更新。
# /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on i915.enable_guc=3 module_blacklist=xe"
そして、grubとinitramfsを更新して再起動。
# update-grub
# update-initramfs -u
# reboot
再起動後に /dev/dri/で見ると、01:00.0が渡されたGPUなので、/dev/dri/card1と/dev/dri/renderD128が渡したGPUに紐付くデバイスだというのがわかります。
/dev/dri# lspci | grep VGA
00:02.0 VGA compatible controller: Device 1234:1111 (rev 02)
00:10.0 VGA compatible controller: Intel Corporation Arrow Lake-S [Intel Graphics] (rev 06)

/dev/dri# ls -Rla
.:
total 0
drwxr-xr-x  3 root root        120 Feb 27 07:27 .
drwxr-xr-x 20 root root       4060 Feb 27 07:27 ..
drwxr-xr-x  2 root root        100 Feb 27 07:27 by-path
crw-rw----  1 root video  226,   0 Feb 27 07:27 card0
crw-rw----  1 root video  226,   1 Feb 27 07:27 card1
crw-rw----  1 root render 226, 128 Feb 27 07:27 renderD128

./by-path:
total 0
drwxr-xr-x 2 root root 100 Feb 27 07:27 .
drwxr-xr-x 3 root root 120 Feb 27 07:27 ..
lrwxrwxrwx 1 root root   8 Feb 27 07:27 pci-0000:00:02.0-card -> ../card0
lrwxrwxrwx 1 root root   8 Feb 27 07:27 pci-0000:00:10.0-card -> ../card1
lrwxrwxrwx 1 root root  13 Feb 27 07:27 pci-0000:00:10.0-render -> ../renderD128

Proxmox VEのカーネル更新

strongtz/i915-sriov-dkmsのモジュールはkernel毎に適用する必要があります。ただ、ここに記載されたdebを用いた導入を行っていると、kernel更新時に自動的にモジュールを再生成してくれるので、特に個別の作業は発生しません。kernelのバージョンによる不具合を気にするなら、念の為稼働していたバージョンを覚えておいて、巻き戻せるようにしておきましょう。

strongtz/i915-sriov-dkmsの更新

基本的に新しいdebファイルをダウンロードしてインストールすれば、自動的に古いものを削除して更新してくれます。
例えば、Proxmox VE側では念の為vGPUを渡しているVMを停止した後、
# wget -O /tmp/i915-sriov-dkms_2026.03.05_amd64.deb "https://github.com/strongtz/i915-sriov-dkms/releases/download/2026.03.05/i915-sriov-dkms_2026.03.05_amd64.deb"
# dpkg -i /tmp/i915-sriov-dkms_2026.03.05_amd64.deb
すれば完了。Ubuntuゲスト側でも同様に更新することを忘れずに。その後、以下のコマンドで新しいDKMSが導入されていることを確認
# dkms status
i915-sriov-dkms/2026.03.05, 6.17.13-1-pve, x86_64: installed (Original modules exist)
Secure Bootを有効にしてても既に導入時にMOKを導入しているなら、追加の手順は特に必要ありません。
この後、再起動すれば新しいDKMSが適用されます。


Matsuzaki 'maz' Yoshinobu
maz@iij.ad.jp