前回に続き、Proxmoxで作った仮想マシンに、GPUデバイスをパススルーする方式、通称GPUデバイスパススルーを試してみました。10年以上前はこのデバイスパススルーも苦戦しかない状況でしたが、現在では比較的うまく動作するようになってきているとのことです。
はじめに
今回使用する機材はAMDのStrixHaloシリーズのものです。内蔵GPU (iGPU) はディスクリートGPUに比べると難易度が高いと言われますが、こちらのものは比較的スムーズにできました。AMD系の最近のものはうまく行くようになってきているのかもしれません。
使用している環境は Proxmox VE 9.1 で、仮想マシンとしては Ubuntu 24.04, ArchLinux 2026.1.1 を用意してみました。
環境の準備
Proxmoxをインストールした直後あたりで、以下のページにあるスクリプトで環境を一括設定しました。手作業で1つずつやってみても良いかもしれません。重要な点だけ抜粋したものをここに記載しておきます。
起動パラメータの変更
“/etc/default/grub” を編集して、以下のようにコマンドラインオプションを付ける。
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt initcall_blacklist=sysfb_init"そして、以下のコマンドを実行して反映する。
update-grubGPUのドライバをホスト環境(proxmox)が使わないようにする
GPUのドライバをホスト(Proxmox)が使用しているとうまくいきません。ベースのOSから、まったく触らないようにするために以下の設定を記述しておきます。
“/etc/modeprobe.d/vfio.conf” ファイルを編集して、以下の記述を行います。ファイルは新規作成してもかまいません。ここで並んでいる “1002:1586” などはデバイスの情報(VID,PID)です。この情報は、 “lspci -nnk” コマンドを実行して確認することができます。
options vfio-pci ids=1002:1586,1002:1640,1022:15e3 disable_vga=1lspci -nnデバイスの情報は次のように出力されるので、ここから各自のGPUの値を確認しておきます。今回の環境では、 c5:00.0 がGPUで「1002:1586」の記述があります。GPUに付いているオーディオデバイスもセットでパススルー設定とするのが定番のようなので、これも設定します。
c3:00.0 Network controller [0280]: MEDIATEK Corp. MT7925 (RZ717) Wi-Fi 7 160MHz [14c3:0717]
c4:00.0 Non-Volatile memory controller [0108]: Shenzhen Longsys Electronics Co., Ltd. Lexar NM790 NVME SSD (DRAM-less) [1d97:1602] (rev 01)
c5:00.0 Display controller [0380]: Advanced Micro Devices, Inc. [AMD/ATI] Strix Halo [Radeon Graphics / Radeon 8050S Graphics / Radeon 8060S Graphics] [1002:1586] (rev c1)
c5:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Radeon High Definition Audio Controller [Rembrandt/Strix] [1002:1640]
c5:00.2 Encryption controller [1080]: Advanced Micro Devices, Inc. [AMD] Strix/Krackan/Strix Halo CCP/ASP [1022:17e0]
c5:00.4 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Strix Halo USB 3.1 xHCI [1022:1587]
c5:00.6 Audio device [0403]: Advanced Micro Devices, Inc. [AMD] Family 17h/19h/1ah HD Audio Controller [1022:15e3]
c6:00.0 Non-Essential Instrumentation [1300]: Advanced Micro Devices, Inc. [AMD] Strix/Strix Halo PCIe Dummy Function [1022:150d]
c6:00.1 Signal processing controller [1180]: Advanced Micro Devices, Inc. [AMD] Strix/Krackan/Strix Halo Neural Processing Unit [1022:17f0] (rev 11)ドライバをブラックリスト入り
“/etc/modeprobe.d/blacklist.conf” ファイルを編集して、ドライバをブラックリスト入りにします。以下のような内容を記述・追記します。
blacklist amdgpu
blacklist radeon
blacklist snd_hda_intelinitramfsを更新と再起動
以下のコマンドを実行してinitramfsを更新し、Proxmoxホストを再起動します。
update-initramfs -u -k all
reboot再起動後の確認
Proxmoxホストのシェルで、”lspci -nnk” コマンドを実行して確認すると、vfio-pci のドライバがグラフィックスデバイスなどに当たっていることが確認出来ます。
c5:00.0 Display controller [0380]: Advanced Micro Devices, Inc. [AMD/ATI] Strix Halo [Radeon Graphics / Radeon 8050S Graphics / Radeon 8060S Graphics] [1002:1586] (rev c1)
Subsystem: Device [2014:801d]
Kernel driver in use: vfio-pci
Kernel modules: amdgpu
c5:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Radeon High Definition Audio Controller [Rembrandt/Strix] [1002:1640]
Subsystem: Device [2014:801d]
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel仮想マシンを用意する
それでは仮想マシンを用意します。基本的にいつも通り作成して、UbuntuやArchlinuxなどをインストールします。その手順の中でも注意点があるので以下に記載します。
- CPU: タイプは host を選択
- BIOS : OVMF (UEFI) を選択
- EFI : “pre-enroll keys” のチェックを外す (Archlinuxのisoインストールで必要だった
- チップセット選択: q35
仮想マシンにGPUをデバイスパススルー
仮想マシンにOSがインストールできたら、GPUをデバイスパススルーします。仮想マシンはシャットダウンして設定を変更します。一般的には設定画面で、PCIデバイスの追加を行います。ここでRawデバイスから、先程のID情報を元に物理デバイスを仮想マシンに割り当てていきます。

今回のようなGPUの場合では、ROMファイルも設定したいため、Proxmoxホスト側のシェルから、この仮想マシンの設定を変更します。ここでは仮想マシンのID番号が 102 として、以下のファイルを編集します。
nano /etc/pve/qemu-server/102.confファイルの末尾に、以下のような記述を追加します。ここで romfile に指定したファイルは “/usr/share/kvm” のパス以下に配置しておく必要があります。冒頭の参考にしたページよりダウンロードもできますし、実際の環境から抽出するのもできます。
hostpci0: 0000:c5:00.0,pcie=1,romfile=vbios_8060s.bin
hostpci1: 0000:c5:00.1,pcie=1,romfile=AMDGopDriver.rom
hostpci2: 0000:c5:00.4,pcie=1,rombar=0
hostpci3: 0000:c5:00.6,pcie=1このようにして設定を行い、UbuntuおよびArchlinuxを起動したときの様子が以下の通りです。どちらもGPUをパスしており、仮想マシンの環境ながらもGPUを認識しています。注意点として、2つの環境を同時に使うことはできません。パススルーしているGPUが同じなので、別々に撮影しました。


まとめ
今回は iGPUをデバイスパススルーしました。簡単なサンプルでは気持ちよく動いていることを確認できたので、まずは普段使いにできそうに感じています。直接物理モニタおよびキーボード・マウスで操作していると、仮想環境であることを忘れてしまうかもなぁと少し嬉しくなりました。
余談ですが、初めてGPUをデバイスパススルーして動作させるということに成功したので、とても感激しているところです。仮想+物理デバイスはやっぱり面白いですね。
余談
GPUをデバイスパススルーしたとき、Reset Bugという定番の症状があるようです(AMD系列)。VMにGPUを割り当てた後、VMを終了後にGPUが再初期化できなくなってしまうというものです。これが発生するとホストPCそのものを再起動が必要になるようです。
今回の試した環境で、VM (Ubuntu)をシャットダウンして、別のVM (Archlinux)を起動するという流れにおいては、問題なくGPUを割り当てることができました。特にパッチを当てるなどはしていません。 VM側が Windows 環境だと、また少し変わった形になるかも知れません。
コメント