Open3

Omarchy導入TIPS

showsanshowsan

MacBook(Omarchy/Arch Linux)のサスペンド問題を解決した話

この記事はAIに執筆させています。
この修正はClaudeにログを読んでもらいながら対応を一緒に考えて実装しております。
端末によって対応は異なってくるかもしれないので注意。

謝辞

この記事を見つけてくださる人がいなければ辿り着けませんでした。
kmkkiiiさんに感謝を

https://x.com/kmkkiii/status/1977031543152689177?s=46

TL;DR

MacBookでOmarchy(Arch Linux)を使用していて、サスペンド(suspend)からの復帰が不安定だった問題を、Thunderboltドライバのブラックリスト化s2idleモードの強制で解決しました。

症状

発生していた問題

  • サスペンドから復帰しない(キーボード・トラックパッドが反応しない)
  • 2回目のサスペンドで必ずフリーズする
  • deepモードでサスペンドすると完全にクラッシュして強制再起動が必要
  • USBコントローラー(xhci_hcd)のエラーが頻発

エラーログ

xhci_hcd 0000:06:00.0: Controller not ready at resume -19
xhci_hcd 0000:06:00.0: PCI post-resume error -19!
xhci_hcd 0000:06:00.0: HC died; cleaning up
modprobe: FATAL: Module apple_bce is in use.

環境

  • 機種: MacBook Air 2017年モデル(T2チップ搭載モデル)
  • OS: Omarchy (Arch Linuxベース)
  • カーネル: 6.17.1-arch1-Watanare-T2-2-t2
  • デスクトップ環境: Hyprland (Wayland)

原因

1. Thunderboltドライバの問題

MacBookのThunderboltドライバ(thunderboltモジュール)がサスペンド/復帰時に以下の問題を引き起こしていました:

  • USBコントローラー(xhci_hcd)との競合
  • 復帰時のデバイス初期化失敗
  • 2回目以降のサスペンドでのハング

参考: MacBook Pro 2017でLinuxを使う際のメモ - サスペンド/レジューム

2. サスペンドモードの問題

Arch Linuxのデフォルトではdeepモードが選択されることがありますが、MacBookでは:

  • deepモード: キーボードでの復帰ができない、クラッシュする
  • s2idleモード: 比較的安定しているが、デフォルトで選択されない場合がある

3. apple_bceモジュールの扱い

MacBookのキーボード・トラックパッドを制御するapple_bceモジュールが、サスペンド時に使用中として扱われ、適切にサスペンドできないことがありました。

解決方法

ステップ1: Thunderboltドライバをブラックリスト化

Thunderboltを使用していない場合、ドライバをブラックリストに追加することで問題を回避できます。

sudo nano /etc/modprobe.d/blacklist-thunderbolt.conf

以下を記述:

blacklist thunderbolt

initramfsを再生成:

sudo mkinitcpio -P

ステップ2: s2idleモードを強制

再起動後もs2idleモードを維持するため、カーネルパラメータに追加します。

sudo nano /etc/kernel/cmdline

既存の内容の最後に追加:

mem_sleep_default=s2idle

initramfsを再生成:

sudo mkinitcpio -P

ステップ3: 蓋を閉じたときの動作設定

蓋を閉じたときにサスペンドするよう設定します(お好みで)。

sudo nano /etc/systemd/logind.conf

以下の行を編集(#を外す):

HandleLidSwitch=suspend
HandleLidSwitchExternalPower=suspend
HandleLidSwitchDocked=suspend

設定を反映:

sudo systemctl restart systemd-logind

ステップ4: 再起動

sudo reboot

動作確認

s2idleモードの確認

cat /sys/power/mem_sleep

出力例:

[s2idle] deep

[s2idle]のようにカッコで囲まれていればOK。

Thunderboltモジュールの確認

lsmod | grep thunderbolt

何も出力されなければ、ブラックリストが機能しています。

サスペンドテスト

# 1回目
sudo systemctl suspend
# 復帰を確認

# 2回目
sudo systemctl suspend
# 復帰を確認

または、蓋を閉じて→開けるを繰り返してテスト。

ログ確認(推奨)

sudo journalctl -f > ~/suspend-test.log

別ターミナルでサスペンドテストを実行し、ログを確認します。

成功時のログ例:

kernel: PM: suspend entry (s2idle)
kernel: bce_vhci: suspend done
kernel: PM: suspend exit
kernel: bce_vhci: resume done
systemd-logind: Operation 'suspend' finished.

xhci_hcdのエラーが出なければ成功です!

結果

改善されたこと

✅ サスペンド/復帰が安定して動作
✅ 2回目以降のサスペンドも問題なし
✅ キーボード・トラックパッドが正常に復帰
✅ xhci_hcdのエラーが完全に消失
✅ 蓋の開閉でのサスペンド/復帰が正常動作

ベンチマーク

  • サスペンド時間: 約1秒
  • 復帰時間: 約2秒
  • 連続サスペンド: 10回以上テストして全て成功

注意点

Thunderboltを使用する場合

この方法はThunderboltドライバをブラックリストに入れるため、Thunderbolt接続のデバイスは使用できなくなります。

Thunderboltが必要な場合は、代わりに以下のカーネルパラメータを試すことができます:

thunderbolt.dyndbg=+p

または、特定のThunderboltデバイスのみ無効化する方法を検討してください。

不要なサービスの削除

過去にサスペンド問題を解決しようとして作成したサービスがある場合は、削除することをおすすめします:

sudo systemctl disable unload-bce.service reload-bce.service fix-suspend.service fix-resume.service
sudo rm /etc/systemd/system/unload-bce.service
sudo rm /etc/systemd/system/reload-bce.service
sudo rm /etc/systemd/system/fix-suspend.service
sudo rm /etc/systemd/system/fix-resume.service
sudo systemctl daemon-reload

トラブルシューティング

それでもサスペンドがうまくいかない場合

サスペンドを諦めて画面オフのみにする

安定性を最優先する場合、サスペンドを無効化して画面オフのみで運用する方法もあります。

sudo nano /etc/systemd/logind.conf
HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore

Hyprlandの場合、hypridleで画面オフのタイミングを設定できます。

Hibernation(ハイバネーション)を試す

サスペンドが不安定な場合、ハイバネーションの方が安定することがあります:

sudo systemctl hibernate

ただし、swap領域の設定が必要です。

まとめ

MacBookでのLinuxサスペンド問題は、主に以下の要因で発生します:

  1. Thunderboltドライバとの競合
  2. サスペンドモード(deep vs s2idle)の選択ミス
  3. apple_bceなどのハードウェア固有ドライバの問題

これらを適切に設定することで、安定したサスペンド/復帰が可能になります。

特にThunderboltドライバのブラックリスト化は効果が大きく、多くのMacBookユーザーに有効な解決策だと思います。

参考資料

おわりに

MacBookでLinuxを使うのはまだまだ発展途上の部分がありますが、適切な設定で十分実用的に使えます。

同じ問題で困っている方の参考になれば幸いです!


動作環境

  • MacBook Air (T2チップ搭載)
  • Omarchy (Arch Linux)
  • カーネル 6.17.1
  • Hyprland (Wayland)

検証日: 2025年10月12日