0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ryzen 7 7800X3DのiGPUをKVMへパススルー ― Claude Fable 5でCode 43とAMDドライバ停止を解消

0
Posted at

はじめに

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ドライバ導入時のハングを解消しました。

  1. kvm.ignore_msrs=1
  2. VFCT抽出vBIOSをGPU functionへ指定
  3. AMD GOP ROMをaudio functionへ指定
  4. 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ドライバ導入時は以下の手順で進めました。

  1. Windows Updateを一時停止
  2. AMD公式オフラインインストーラを使用
  3. 「ドライバのみ」で導入
  4. インストール途中で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ウィンドウへ表示
  • キーボード、マウス操作

まで確認できました。


まとめ

今回発生した主な問題は以下です。

  1. AMDドライバが途中で停止
  2. WindowsでCode 43
  3. Code 43解消後もドライバ導入時にハング

今回の環境では、次の対応後に正常動作を確認しました。

  1. kvm.ignore_msrs=1
  2. VFCT抽出vBIOSをGPU functionへ指定
  3. AMD GOP ROMをaudio functionへ指定
  4. QXLを削除し、iGPUをVM唯一のGPUにする

加えて、UbuntuではAppArmorによるROM読み取り拒否への対応が必要でした。

これにより、

  • Code 43
  • AMDドライバ導入時のハング

を解消できました。

一方、ホスト再起動なしで2回目のVMセッションを開始するとGPUを再利用できない問題は未解決です。

今回、Claude Codeを使って実機情報を確認しながら仮説を立て、設定を1つずつ変更することで切り分けを進めました。

同じようにCode 43やAMDドライバ停止で悩んでいる方の、切り分け材料になれば幸いです。


参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?