概要
2026-09-13、MacBookPro11,5上のOmarchyで、vga_switcheroo を使ってAMD dGPUからIntel iGPUへ一時的に切り替える試験を実施した。iGPUへの切替とAMD dGPUの停止には成功したが、90秒後の自動復旧でAMD dGPUを再開できなかった。画面表示とsystemd関連処理が停止し、最終的に電源ボタン長押しによる再起動が必要になった。
再起動後はAMD dGPUが表示担当へ戻り、systemd、SDDM、Hyprlandは正常に稼働した。失敗中のsystemd unitとファイルシステム破損を示すログはなかった。OSの再インストールは不要だった。
この障害を受け、現在のカーネルと amdgpu の組み合わせでは、稼働中の vga_switcheroo によるGPU往復切替を使用しない。今後iGPU運用を検討する場合は、起動前に表示担当を選ぶ方式を別途調査する。
関連する事前調査は OmarchyでのiGPUとdGPU運用の検討 を参照。
影響
- 内蔵画面が暗転したまま復旧しなかった
- SDDMは起動を試みたが、Wayland compositorが繰り返しタイムアウトした
- GPU状態の読み取り、復旧スクリプト、
systemctl statusが応答しなくなった pam_systemd_homeがsystemdのユーザー情報を取得できず、SSH経由の新しいsudo認証も停止した- SSH接続と基本的なユーザープロセスは動作していた
- 約17分後、電源ボタン長押しで再起動した
対象環境
- 機種: Apple MacBookPro11,5
- OS: Omarchy 4.0.3-1
- Kernel: 7.2.3-arch1-3
- iGPU: Intel Iris Pro 5200、
i915 - dGPU: AMD Radeon R9 M370X、
amdgpu - GPU切替:
apple_gmuxとvga_switcheroo - Display manager: SDDM
- Wayland compositor: Hyprland
時系列
| 時刻 | 事象 |
|---|---|
| 10:53 | 最初の手動切替を試行。AMD HDMI音声をWirePlumberが使用しており、client 101 refused switch で拒否された |
| 10:54 | 予約した自動復旧が動作し、AMD表示とHyprlandへ正常に戻った |
| 11:04:23 | 改良したテストスクリプトをTTYから実行。SDDMとWirePlumberを停止し、AMD音声デバイスが解放されたことを確認した |
| 11:04:23 | IGD を書き込み。AMD音声が無効になり、amdgpu ... switched off を記録した |
| 11:04:27 | vga_switcheroo の状態確認が正常終了した |
| 11:06:16 | 90秒後の復旧処理が DIS を書き込み、AMD dGPUの再開を開始した |
| 11:06:16 | AMD GPUをD3hotおよびD3coldからD0へ遷移できず、デバイスへアクセスできないと記録した |
| 11:06:36 | AtomBIOS処理が20秒以上ループし、amdgpu asic init failed となった |
| 11:06:38 | ring gfx test failed (-110)、amdgpu_device_ip_resume failed (-110) を記録した |
| 11:06:38 | SDDMを起動したが、GPU復旧前だったため画面表示は戻らなかった |
| 11:06:41 | AMD GPU resetが -22 で失敗し、GPU Recovery Failed を記録した |
| 11:10以降 | AMD reset workqueueが122秒、245秒、368秒、491秒、614秒以上停止していると繰り返し報告された |
| 11:21頃 | 電源ボタン長押し後に再起動した |
| 11:21以降 | AMD dGPUを表示担当として正常起動。失敗中のsystemd unitは0件だった |
技術的な原因
直接の失敗は、停止したAMD dGPUを vga_switcheroo で再開するときに、PCI電源状態をD3coldからD0へ戻せなかったことである。amdgpu はその後AtomBIOSによる初期化、graphics ringの検査、GPU resetを順に試みたが、いずれも完了しなかった。
Unable to change power state from D3cold to D0, device inaccessible
atombios stuck in loop for more than 20secs
amdgpu asic init failed
ring gfx test failed (-110)
amdgpu_device_ip_resume failed (-110)
GPU Recovery Failed: -22
ログから確定できるのは、AMD dGPUの電源再開と再初期化が失敗したことまでである。R9 M370X固有の制約、amdgpu、Apple gmux、Kernel 7.2.3のどの実装が根本原因かは特定していない。
被害を拡大した条件
復旧処理が同じ切替機構に依存していた
自動復旧は、90秒後に同じ vga_switcheroo へ DIS を書き込む設計だった。iGPU切替に失敗する場合には有効だが、dGPUの再開処理自体が停止すると復旧処理も停止する。障害箇所と復旧経路が分離されていなかった。
書き込み完了を復旧成功として扱った
復旧スクリプトは DIS の書き込み後にSDDMを起動したが、AMD GPUがD0へ戻り描画できることを確認していなかった。実際にはAMDの初期化が失敗したままSDDMが起動し、Wayland compositorの起動失敗を繰り返した。
SSHからの管理操作にもsystemdとPAMを使用した
SSH自体は動作していたが、systemd側の処理停止が pam_systemd_home に波及した。新しいsudo認証は Transport endpoint is not connected となり、GPU状態の読み取りやSysRqによる再起動をroot権限で実行できなかった。
機能した対策
- 最初の試行ではWirePlumberがAMD音声デバイスを保持していることをカーネルが検出し、切替を拒否した
- 二回目の試行では、SDDMとWirePlumberを停止することでiGPU切替まで到達できた
- SSH接続が残っていたため、カーネルログと停止プロセスを確認できた
- 強制再起動後、EFIの表示設定はAMDのまま維持され、通常構成へ戻った
- 再起動後の確認では、systemd、SDDM、Hyprland、両GPUドライバに継続障害がなかった
再発防止策
決定済み
- Kernel 7.2.3と
amdgpuで、稼働中にIGDとDISを往復する試験は行わない ~/gpu-switch-test/run-test.sh、switch-integrated.sh、restore-discrete.shは再実行しない- iGPU運用の次の候補は、EFIまたはブート時に表示担当を選び、起動後にdGPUを再開しない方式に限定して調査する
未実施
- 危険なGPU切替スクリプトを実行不能にする
- ブート時iGPU選択の復旧手順を、実機変更前に設計する
- 外部ディスプレイ、別の起動エントリ、SSH以外のroot復旧経路を準備する
- Kernelまたは
amdgpuの既知問題と、R9 M370Xで安全に使える構成を調査する
今回得られた判断材料
iGPUへの切替は成功したため、Intel GPU、gmux、内蔵パネル切替の存在は確認できた。一方、AMD dGPUを停止したあと同じブート内で再開する操作は、この環境ではシステム停止につながる。
したがって、今後検討する「通常はiGPU、必要時だけdGPU」という運用は、macOSのような実行中の往復切替を前提にできない。iGPU固定、または再起動を境界とするGPU選択として設計し直す必要がある。
参照
- OmarchyでのiGPUとdGPU運用の検討
- Linux Kernel: VGA Switcheroo
- journal boot offset
-1、2026-09-13 10:53–11:21 JST