Proxmox VE 8上のWin11でRyzen7 5700UのGPUをPassthroughで使用する

# はじめに
Proxmox VE 8で稼働しているVM(Windows11)のパフォーマンスを少しでも上げたいと思い年末年始の休暇を利用して試行錯誤しました。
同様のことをやりたい人は多そうなのに、なぜかRyzenのGPU(APU)をPassthroughに関する日本語の情報は少なかったので、とりあえずやったことを残しておきます。

:::note warn
最終的にVMからGPUが見えるようになった状態を手順にしてありますが、この手順で実現できるのかどうかは検証できていません。また実際には不要な手順も残っているかもしれません。
:::

# 環境
我が家のProxmoxサーバはRyzen7 5700Uが搭載されたミニPCで稼働してます。
今回は、このミニPCのRyzen7 5700UのGPUをVM(Windows11)にPassthroughします。

Proxmox VE のバージョン：8.3.2
使用しているkernel：6.8.12-5-pve

# Proxmoxサーバの設定変更
## ハードウェア(BIOS)設定
PassthroughするためにはBIOS設定も注意する必要ありますが(デフォルト状態で設定されていたので)省略。
IOMMUとかその辺の項目をenableにする必要あり。

## grub設定変更
/etc/default/grub のGRUB_CMDLINE_LINUX_DEFAULTを以下に変更する。
```
GRUB_CMDLINE_LINUX_DEFAULT="amd-pstate=passive quiet video=efifb:off initcall_blacklist=sysfb_init textonly iommu=pt pcie_acs_override=downstream,multifunction"
```

上記の変更後にupdate-grubを実行
```
# update-grub
```

## /etc/initramfs-tools/modulesにvfioモジュールを追加
/etc/initramfs-tools/modulesに以下を追加
```:/etc/initramfs-tools/modules
vfio
vfio_iommu_type1
vfio_pci
```

## /etc/modprobe.d/vfio.confの作成
### PCIデバイスのIDを確認
lspciコマンドでVGAデバイスのIDを確認する(04:00.0の部分)。
```
# lspci -nn |grep VGA
04:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Lucienne [1002:164c] (rev c1)
```

### Ryzen 5700U関連のデバイスを確認
確認したID(04:00)で絞り込んでRyzen7 5700Uのデバイスを確認する。
```
# lspci -nn | grep 04:00
04:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Lucienne [1002:164c] (rev c1)
04:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Renoir Radeon High Definition Audio Controller [1002:1637]
04:00.2 Encryption controller [1080]: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 10h-1fh) Platform Security Processor [1022:15df]
04:00.3 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne USB 3.1 [1022:1639]
04:00.4 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne USB 3.1 [1022:1639]
04:00.5 Multimedia controller [0480]: Advanced Micro Devices, Inc. [AMD] ACP/ACP3X/ACP6x Audio Coprocessor [1022:15e2] (rev 01)
04:00.6 Audio device [0403]: Advanced Micro Devices, Inc. [AMD] Family 17h/19h HD Audio Controller [1022:15e3]
04:00.7 Signal processing controller [1180]: Advanced Micro Devices, Inc. [AMD] Sensor Fusion Hub [1022:15e4]
```

### vfio.conf作成
ids=にはlspci -nnで確認したIDを書く。VGA(1002:164c)とAudio device(1002:1637)をPassthroughする。
```:/etc/modprobe.d/vfio.conf
options vfio-pci 1002:164c,1002:1637 disable_vga=1

softdep radeon pre: vfio-pci
softdep amdgpu pre: vfio-pci
softdep snd_hda_intel pre: vfio-pci
```

## BIOSイメージからROMを抽出
[ここ](https://github.com/isc30/ryzen-7000-series-proxmox)の情報を参考にROMを抽出。
抽出されたvbios_1002_1636_1.romファイルをProxmox環境の/usr/share/kvm/に配置する。
```
# cp -p /tmp/extract/output/vbios_1002_1636_1.rom /usr/share/kvm/
```

:::note info
/usr/share/kvm/に配置するのは lspciで調べた以下のメッセージにある[1002:164c]に該当するファイルです。
```
04:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Lucienne [1002:164c] (rev c1)
```
:::

同様にAMDGopDriver.romも配置する。(これも抽出できるとおもうのだけど未確認。[ここ](https://github.com/isc30/ryzen-7000-series-proxmox?tab=readme-ov-file#optional-getting-ovmf-uefi-bios-working-error-43)の情報を参考に入手した)

## Proxmoxサーバ再起動前の確認
GPU のドライバとしてamdgpuを使用していることを確認。
```
# lspci -nnk | grep -A 2 04:00.0
04:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Lucienne [1002:164c] (rev c1)
        Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Lucienne [1002:0123]
        Kernel driver in use: amdgpu
```        

## Proxmoxサーバを再起動
initramfsを更新した後、OSを再起動する。
```
# update-initramfs -u -k all
# shutdown -r now
```

## Proxmoxサーバ再起動後の確認
使用しているのドライバがvfio-pciになっていることを確認する。
```
# lspci -nnk | grep -A 3 04:00.0
04:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Lucienne [1002:164c] (rev c1)
        Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Lucienne [1002:0123]
        Kernel driver in use: vfio-pci
        Kernel modules: amdgpu
# lspci -nnk | grep -A 3 04:00.1
04:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Renoir Radeon High Definition Audio Controller [1002:1637]
        Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Renoir Radeon High Definition Audio Controller [1002:1637]
        Kernel driver in use: vfio-pci
        Kernel modules: snd_hda_intel
```

# VM側の設定(Windows11)
## PCIデバイスを追加
WebUIからPCIデバイスを追加する。
その後、定義ファイルを直接編集してROMファイルを指定する。
```:/etc/pve/nodes/pve/qemu-server/122.conf
hostpci0: 0000:04:00.0,pcie=1,romfile=vbios_1002_164c.bin
hostpci1: 0000:04:00.1,pcie=1,romfile=AMDGopDriver.rom
```

## ディスプレイを変更
ディスプレイの設定でグラフィックカードを「VirGL GPU」にしていたら起動できなくなったので「既定」に変更する。

# VMを起動して動作確認
## GPUが見えていることを確認
デバイスマネージャーを開いて確認する。

## ドライバのインストール
[AMDのサイト](https://www.amd.com/ja/support/download/drivers.html)からダウンロードしたWindows用ドライバをインストールする。

## RadeonResetBugFixのインストール
[RadeonResetBugFix](https://github.com/inga-lovinde/RadeonResetBugFix)をインストールする。
これをインストールしないと、VMを再起動しようとすると起動できない状態になり、再起動するためにはProxmoxサーバ自体を再起動する必要あるらしい。

:::note info
これをインストールしていても時々そのような状況になることがある気がする。画面見えないから詳細不明。
:::

RadeonResetBugFixService.exeを実行ファイルを配置するパスにおいて以下を実行する。
```
RadeonResetBugFixService.exe install
```
:::note warn
Downloadsディレクトリに配置したまま実行すると、Downloadsディレクトリのパスで登録されてしまうので注意。
:::

## VMをシャットダウンして出力先を変更
追加したPCIデバイスをメインGPUに変更。
ディスプレイをnoneに変更。

## リモートデスクトップ接続して確認
リモートデスクトップで接続して、GPUがPassthroughされて見えていることを確認。

## Passthrough設定後
[Sunshine](https://app.lizardbyte.dev/Sunshine/?lng=en)をインストールして[Moonlight](https://moonlight-stream.org/)でリモートアクセスしてます。
軽いSteamゲームであれば動作するので良い感じです。

:::note
Sunshine起動時にディスプレイがつながっていないとエラーになるようなので、ミニPCにはHDMIダミープラグを指してます。
:::

# 参考リンク
https://forum.proxmox.com/threads/pci-gpu-passthrough-on-proxmox-ve-8-installation-and-configuration.130218/
https://forum.proxmox.com/threads/amd-apu-gpu-passthrough.138878/
https://github.com/isc30/ryzen-7000-series-proxmox
https://gist.github.com/matt22207/bb1ba1811a08a715e32f106450b0418a
https://zenn.dev/fukumen/articles/proxmox-gpu-passthrough-cezanne