はじめに
Ryzen 7 7800X3Dの内蔵GPU(Raphael iGPU)を、KVM/QEMU上のWindows 11 VMへパススルーしました。
AMDドライバの停止やCode 43が解消できず、Claude Codeを使って調査・切り分けを実施しました。
本記事は、Claude Code Fable5による原因分析と設定案をもとに、筆者が実機でコマンド実行・動作確認した結果をまとめたものです。
筆者自身がすべての技術的背景を理解できているわけではないため、実機で確認できた事実を中心に記載します。
解消できた課題
- WindowsのCode 43
- AMDドライバ導入時のブラックアウト、ハング
- Looking GlassによるUbuntu上からのVM操作
未解決の制約
VM停止後、ホストを再起動せずに2回目のVMセッションを開始すると、iGPUを正常再初期化できません。
現在は、
1ホスト起動 = 1 VMセッション
として運用しています。
この点は未解決です。
発生した事態
やりたかった構成は以下です。
- RTX 4070 Ti SUPER:Ubuntuホスト用
- Ryzen 7 7800X3D内蔵GPU:Windows 11 VM用
しかし、次の問題が発生しました。
1. AMDドライバを導入できない
Windows 11 VMは起動するものの、AMDドライバのインストールが途中で停止しました。
主な症状は以下です。
- 64%付近で停止
- 画面がブラックアウト
- VMが応答しなくなる
2. デバイスマネージャーでCode 43
iGPU自体はWindowsから認識されましたが、デバイスマネージャーではCode 43となり、正常利用できませんでした。
3. Code 43解消後もドライバ導入でハング
vBIOSとGOP ROMを追加するとCode 43は解消しました。
しかし、AMDドライバを有効化するタイミングで再びブラックアウトし、VMがハングしました。
最終的に、QXLを削除してiGPUをVM唯一のGPUにすることで、ドライバ導入に成功しました。
環境
| 項目 | 内容 |
|---|---|
| CPU | Ryzen 7 7800X3D |
| iGPU | Raphael 1002:164e
|
| Audio | 1002:1640 |
| M/B | MSI MAG B650 TOMAHAWK WIFI |
| dGPU | RTX 4070 Ti SUPER |
| ホスト | Ubuntu 24.04.2 |
| Kernel | 6.17.0-35 |
| QEMU | 8.2.2 |
| libvirt | 10.0.0 |
| ゲスト | Windows 11 |
| VM | q35 + OVMF |
| Looking Glass | B7 |
結論
今回の環境で確認した問題と対応は以下です。
| 確認した問題 | 対応 |
|---|---|
kvm.ignore_msrsが無効 |
ignore_msrs=1を設定 |
| iGPUへROMが提供されていない | VFCTからvBIOSを抽出し、GPU functionへ指定 |
| UEFI GOPが不足 | AMD GOP ROMを追加 |
| QXL共存時にAMDドライバ導入でハング | QXLを削除し、iGPUを唯一のGPUに変更 |
最終的に、次の構成でCode 43とAMDドライバ導入時のハングを解消しました。
kvm.ignore_msrs=1- VFCT抽出vBIOSをGPU functionへ指定
- AMD GOP ROMをaudio functionへ指定
- QXLを削除して
video=noneに変更
以下、実施内容を簡潔に記載します。
前提:VFIOバインド
iGPUとaudio functionをvfio-pciへバインドします。
/etc/modprobe.d/vfio.conf
options vfio-pci ids=1002:164e,1002:1640 disable_vga=1
softdep amdgpu pre: vfio-pci
softdep snd_hda_intel pre: vfio-pci
反映します。
sudo update-initramfs -u
再起動後、lspci -nnkで両デバイスがvfio-pciを使用していることを確認します。
今回の環境では、VFIOバインドとIOMMU分離は正常でした。ここ自体がCode 43の原因ではありませんでした。
1. ignore_msrsを設定
確認すると、kvm.ignore_msrsは無効でした。
/etc/modprobe.d/kvm.conf
options kvm ignore_msrs=1 report_ignored_msrs=0
反映します。
sudo update-initramfs -u
再起動後に確認します。
cat /sys/module/kvm/parameters/ignore_msrs
Yなら有効です。
2. VFCTからvBIOSを抽出
Raphael iGPUでは、通常のPCI ROMを取得できませんでした。
一方、ACPI VFCTテーブルは存在していました。
/sys/firmware/acpi/tables/VFCT
Claude CodeでVFCTを解析し、iGPUのvBIOSを抽出しました。
抽出したROMでは以下を確認しています。
-
55 AAヘッダ PCIR- Vendor ID
1002 - Device ID
164e
ROMを配置します。
sudo mkdir -p /var/lib/libvirt/vbios
sudo install -m 644 \
vbios_1002_164e.bin \
/var/lib/libvirt/vbios/
VM XMLではGPU functionへ指定します。
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000'
bus='0x10'
slot='0x00'
function='0x0'/>
</source>
<rom bar='on'
file='/var/lib/libvirt/vbios/vbios_1002_164e.bin'/>
</hostdev>
ただし、今回の環境ではvBIOS追加だけではCode 43は解消しませんでした。
3. AppArmorの読み取り拒否を解消
vBIOS指定後、VM起動時に次のエラーが発生しました。
failed to find romfile
ファイル自体は存在していました。
journalctl -kを確認すると、AppArmorのDENIEDが原因でした。
許可を追加します。
sudo mkdir -p \
/etc/apparmor.d/abstractions/libvirt-qemu.d
echo '/var/lib/libvirt/vbios/*.bin r,' \
| sudo tee \
/etc/apparmor.d/abstractions/libvirt-qemu.d/vbios
今回の環境では、failed to find romfileはファイル不存在ではなく、AppArmorによる読み取り拒否でした。
4. AMD GOP ROMを追加
VFCTから抽出したvBIOSを追加してもCode 43が残りました。
抽出したvBIOSはレガシーイメージで、今回のVMはOVMFによるUEFI起動でした。
そこで、以下のリポジトリを参考にしました。
isc30/ryzen-gpu-passthrough-proxmox
7800X3D向けGOP ROMを確認して使用しました。
確認した項目は以下です。
- Vendor ID
1002 - Device ID
164e - Code Type
3 - AMD GOP文字列
ROMを配置します。
sudo install -m 644 \
AMDGopDriver_7800x3d.rom \
/var/lib/libvirt/vbios/amdgop_1002_164e.bin
今回の構成では、audio functionへ指定しました。
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000'
bus='0x10'
slot='0x00'
function='0x1'/>
</source>
<rom bar='on'
file='/var/lib/libvirt/vbios/amdgop_1002_164e.bin'/>
</hostdev>
追加後、
- OVMF起動時から物理HDMIへ表示
- WindowsのCode 43解消
を確認しました。
5. QXLを削除
Code 43は解消しましたが、AMDドライバ導入時に再びハングしました。
当時の構成は以下です。
- QXL:primary
- Raphael iGPU:2枚目
そこでQXLを削除しました。
<video>
<model type='none'/>
</video>
SPICEは入力経路として残します。
<graphics type='spice' autoport='yes'/>
この状態で再試行すると、AMDドライバのインストールに成功しました。
今回の環境では、QXLを削除し、iGPUをVM唯一のGPUにすることが決め手になりました。
BIOS設定
今回の環境では以下の設定で運用しています。
| 項目 | 設定 |
|---|---|
| UMA Frame Buffer Size | 512M |
| Above 4G Decoding | Enabled |
| CSM | Disabled |
| IOMMU | Auto / Enabled |
UMA Frame Buffer SizeがAutoのときは、画面表示が崩れる症状も発生しました。
Windows側
AMDドライバ導入時は以下の手順で進めました。
- Windows Updateを一時停止
- AMD公式オフラインインストーラを使用
- 「ドライバのみ」で導入
- インストール途中でVMを再起動しない
未解決:2回目のVMセッションでGPUを再利用できない
パススルーとAMDドライバ導入には成功しました。
しかし、VM停止後にホストを再起動せず再度VMを起動すると、iGPUを正常再初期化できません。
試した内容は以下です。
| 方法 | 結果 |
|---|---|
| amdgpuへ再バインド | PSP timeoutで失敗 |
| S3サスペンド→復帰 | VM起動時にホストフリーズ |
| RadeonResetBugFix | ハング軽減のみ。GPU再利用は不可 |
この問題は未解決です。
現在は、
1ホスト起動 = 1 VMセッション
として運用し、次回VM利用前にUbuntuホストを再起動しています。
補足:Looking GlassでUbuntu上から操作
QXLを削除したため、Ubuntu上でのVM表示にはLooking Glassを使用しました。
VMへ共有メモリを追加します。
<shmem name='looking-glass'>
<model type='ivshmem-plain'/>
<size unit='M'>128</size>
</shmem>
最終的に、
- Windows 11 VMをRaphael iGPUで描画
- Ubuntu上のLooking Glassウィンドウへ表示
- キーボード、マウス操作
まで確認できました。
まとめ
今回発生した主な問題は以下です。
- AMDドライバが途中で停止
- WindowsでCode 43
- Code 43解消後もドライバ導入時にハング
今回の環境では、次の対応後に正常動作を確認しました。
kvm.ignore_msrs=1- VFCT抽出vBIOSをGPU functionへ指定
- AMD GOP ROMをaudio functionへ指定
- QXLを削除し、iGPUをVM唯一のGPUにする
加えて、UbuntuではAppArmorによるROM読み取り拒否への対応が必要でした。
これにより、
- Code 43
- AMDドライバ導入時のハング
を解消できました。
一方、ホスト再起動なしで2回目のVMセッションを開始するとGPUを再利用できない問題は未解決です。
今回、Claude Codeを使って実機情報を確認しながら仮説を立て、設定を1つずつ変更することで切り分けを進めました。
同じようにCode 43やAMDドライバ停止で悩んでいる方の、切り分け材料になれば幸いです。
参考
- isc30/ryzen-gpu-passthrough-proxmox
- Looking Glass
- inga-lovinde/RadeonResetBugFix
- LongSoft/UEFITool
- Linux Kernel
drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c