ProxmoxでGPU passthroughをしようと試みたけど、VMにGPUを渡せていないようで上手く行かなかった。
が、BIOSのバージョンを上げたらどうにかなった話。
この人と使っているハードも症状も似通っていて、すごく助かった。
結論
構成
- CPU
Ryzen 7 1700 - Motherboard
ASRock X470 Master SLI - GPU (Host)
NVIDIA ??? OS
Proxmox 6.3- Kernel
Linux 5.4.78-2-pve x86_64
パススルーのための設定
マザーボードのPCIeスロット
GPU passthrough関連のチュートリアルを見ていると、一番目のPCIeスロットにGPUを刺しているとpassthrough出来ないよ、といった注意が書いてあります。
これは、UEFI(BIOS)が起動時にROM(vBIOS)を改竄してからOS側へ渡すので、passthroughしようとすると、ハイパーバイザが正常に扱えず失敗するということのようです。つまりUEFIにパススルーしたいGPU以外のGPUを使わせれば良いということです。
多くのマザーボードではCPUに近いスロットのGPUを優先して使うようなので、一番目のスロットにホストOS用、二番目のスロットにはゲストOS用のGPUを刺すことになります。
Gigabyteのマザーボードだと、UEFIの設定で起動時に使うGPUを指定出来るらしい。
CPUがCore iシリーズやAPUだったり、オンボードのGPUが付いているマザーボードの場合はそっちを使えば良い(?)
ハイパーバイザ側でROMファイルを指定する
Proxmox使っているならここを見れば良い
GPUが複数枚用意できない場合、ハイパーバイザ側でオリジナルの(改竄されていない)ROMファイルを読み込ませることで、改竄されたROMを上書きするという方法もある。
ROMファイルを用意する方法は、
- GPUから抽出
- TechPowerUpからダウンロード
のいずれか。
GPUから抽出する場合、vfio dump gpu rom
とかでググれば出てくると思う。
TechPowerUpはGPU関連の情報サイト。GPU-ZというツールやGPUの詳細スペック、過去バージョン含めたvBIOSのアーカイブとかあって便利。私は信頼できるサイトだと思ってる。
TechPowerUpのvBIOSファイルは、ファイル先頭にGPU-Z用のヘッダが埋め込まれているのでそのまま使えないようです。ヘッダを除去するスクリプトはGithubにたくさんあります。「dump nvidia vbios OR rom site:github.com」などと調べると出てくると思います。
UEFI(BIOS)の設定
次の項目を有効化する。
Proxmoxの設定
/etc/modprobe.d/vfio.conf
options vfio-pci ids=<GPUのID>,<GPU内蔵サウンドデバイスのID> disable_idle_d3=1
IDは# lspci -nnv | less -
でNVIDIA
を検索すれば見つけられる。サウンドデバイスも一緒に指定しないとpassthrough出来ないので注意。
disable_idle_d3=1
は"Refused to change power state, currently in D3"
というエラーに対応したとき指定したものなので、必要ないかもしれない。
/etc/modules-load.d/vfio.conf
vfio vfio_iommu_type1 vfio_pci vfio_virqfd
/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=pt"
modprobeを編集したのでupdate-initramfs -u
でinitramfsを再生成する。
update-grub
でGrubのエントリを更新する。
システムを再起動する。
VMの作成
で作成する。
Hardware
タブでAdd
からPCI Device
を追加する。
- DeviceはGPUの名前が表示されているのでそれを選ぶ
- All Functionsにチェック(これでサウンドデバイスもまとめて指定できる)
- Primary GPUにチェック
- ROM-Barにチェック
- PCI-Expressにチェック
起動
これでVMを起動するとハングする。
dmesgには、vfio_bar_restore: reset recovery - restoring BARs
とかいろいろ出てくる。
lspci -nnv
を見てみると、GPUの項目が!!! Unknown header type 7f
とだけ表示されている。
原因
vfio関連のスレッドを見ているとAGESAのバージョン一つでエラーが出たり治ったりといった感じで結構シビア。
私が使っているマザーボードのAMD AGESA Combo-AM4 1.0.0.4 Patch B
が適用されているBIOSのバージョンは3.70。
注意書きを見てみると、
*ASRock do NOT recommend updating this BIOS if Pinnacle, Raven or Summit Ridge CPU is being used on your system.
(Pinnacle, Raven, Summit RidgeのCPUを使っている人は、BIOSの更新おすすめしないよ。)
と書いてあって怖かったけど、GPU passthroughのために4~5回BIOS焼き直してもちゃんと起動できました。(自己責任で!)