kazeno memo

メモとか

Ryzen CPUでGPU Passthrough出来ない問題

ProxmoxでGPU passthroughをしようと試みたけど、VMGPUを渡せていないようで上手く行かなかった。

が、BIOSのバージョンを上げたらどうにかなった話。

この人と使っているハードも症状も似通っていて、すごく助かった。

結論

  • BIOSのバージョンをAMD AGESA Combo-AM4 1.0.0.4 Patch B(3.70)にする
  • passthroughしたいGPUは2つ目以降のスロットに刺す。

構成

  • CPU
    Ryzen 7 1700
  • Motherboard
    ASRock X470 Master SLI
  • GPU (Host)
    NVIDIA ???
  • GPU (Guest Passthrough)
    NVIDIA GTX 1060

  • 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とかでググれば出てくると思う。

TechPowerUpGPU関連の情報サイト。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-grubGrubのエントリを更新する。

システムを再起動する。

VMの作成

  • BIOSはOVMF (UEFI)
  • Machineはq35
  • Displayはnone

で作成する。

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とだけ表示されている。

原因

BIOS(というかAGESA)の問題らしい。

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焼き直してもちゃんと起動できました。(自己責任で!)

そんなわけで、冒頭で述べたようにBIOSを3.70にすることでGPU passthrough出来るようになりました。