Linux ノートパソコン パソコン関連

DebianノートPCを閉じたらdeepサスペンドにする設定ワンライナー

VAIO風ノートPCのターミナルにcat /sys/power/mem_sleepとs2idle [deep]を表示したイメージ。

DebianのノートPCを持ち歩くとき、ふたを閉じている間のバッテリー消費が気になります。
本当はハイバネート(Windows言うところの休止状態)を使えるようにしたかったのですが、SecureBootを無効にする必要がありました。
サスペンドの方式も複数あるらしく、今回はサスペンドの方式をs2idleからdeepへ切り替える設定をまとめます。

⚠ 注意事項

設定内容やプログラムの内容は、用途・環境に応じて適切なものが変わります。

各種設定値や環境情報についてよく理解を深め、壊れてもよい環境で十分に検証してください。

なるべく正確に書くよう心掛けていますが、本投稿内容を実施される際には自己責任の下でお願いいたします。

サスペンドのs2idleとdeepは何が違う?

Linuxの「サスペンド」には複数の方式があるっぽいです。
s2idleとdeepはどちらも作業状態をメモリに残したまま動作を一時停止しますが、ハードウェアをどこまで休ませるかが異なります。

項目s2idledeep
方式Suspend-to-Idle。OSがアプリを停止し、デバイスを省電力状態にして、CPUを深いアイドル状態にするSuspend-to-RAM。ファームウェアと連携し、メモリの保持に必要な電力を残して、システムの多くを低電力状態にする。ACPIではS3(Suspend to RAM)に相当
待機中の消費電力機種やドライバ次第。対応機種では十分に低く抑えられるs2idleより低くなる場合があるが、実測での比較が必要
復帰一般に復帰が速く、復帰に使えるデバイスも多い復帰に時間がかかる場合があり。
機種・ドライバとの相性確認が必要
対応状況Linuxのサスペンド対応環境で広く利用できる機種・ファームウェア側の対応が必要
作業状態の保持メモリへの通電が必要メモリへの通電が必要

つまり、s2idleだから必ず電池が減りやすいわけではありません。
今回はこのPCがdeepに対応していたため、バッテリー消費を改善できるか試すことにしました。
deepでのサスペンドと復帰は確認済みです。実際に1日程度スリープさせたままにしても、バッテリーはまだ半分ぐらい残っていました。

どちらも電源を落として作業状態をストレージに保存する「ハイバネート(休止状態)」とは異なります。
Secure Bootを有効にしたまま利用でき、スワップへの休止イメージ保存も必要ありません。

参考:Linuxカーネル公式:System Sleep States

deepはメモリに作業状態を残すサスペンドで、休止状態とは異なります。
待機電力を抑えられる可能性がありますが、効果は機種によって変わります。
電力消費はゼロにならず、バッテリーが切れると作業状態を失う可能性があります。

今回の環境と確認状況

  • Debian GNU/Linux 13(trixie)
  • カーネル:6.12.111+deb13-amd64
  • Secure Boot:有効
  • メモリ:約15GiB
  • 対応するスリープ方式:s2idle / deep

実機では、一時的にdeepへ切り替えて手動でサスペンドし、正常に復帰できることを確認しました。
deepの永続設定ファイルの作成もエラーなく完了しています。

deepに対応しているか確認する

cat /sys/power/mem_sleep

今回の初期表示は次のとおりでした。

[s2idle] deep

角括弧で囲まれた方式が現在の選択です。
この表示ならs2idleが選ばれていて、deepも利用できます。
deepが表示されないPCには、この記事の設定をそのまま適用できません。

一時的にdeepへ切り替えて試す

まず作業中のファイルを保存します。

echo deep | sudo tee /sys/power/mem_sleep
cat /sys/power/mem_sleep

次の表示になれば切り替え成功です。

s2idle [deep]

続いて実際にサスペンドします。

sudo systemctl suspend

電源ボタンなどで復帰し、画面や入力、ネットワークが正常に使えるかを確認します。
今回の実機ではサスペンドと復帰に成功しました。
この状態は一時変更の状態で、再起動すると元に戻ります。

deepを永続化するワンライナー

Debian 13のsystemdで利用できるMemorySleepModeを使い、サスペンドするたびにdeepを選択させます。

sudo install -d -m 0755 /etc/systemd/sleep.conf.d && printf '%s\n' '[Sleep]' 'SuspendState=mem' 'MemorySleepMode=deep' | sudo tee /etc/systemd/sleep.conf.d/90-deep-sleep.conf >/dev/null

作成される設定は次の内容です。

[Sleep]
SuspendState=mem
MemorySleepMode=deep

同名ファイルがあれば上書きします。既存の設定がある場合は先に確認してください。
設定はサスペンド時に使われるため、コマンド実行直後や再起動直後にmem_sleepの表示がdeepになっていなくても大丈夫っぽいです。

ふたを閉じたらサスペンドさせるワンライナー

sudo install -d -m 0755 /etc/systemd/logind.conf.d && printf '%s\n' '[Login]' 'HandleLidSwitch=suspend' 'HandleLidSwitchExternalPower=suspend' 'HandleLidSwitchDocked=ignore' | sudo tee /etc/systemd/logind.conf.d/90-lid-suspend.conf >/dev/null
状態ふたを閉じたとき
バッテリー駆動サスペンド
AC電源接続中サスペンド
ドック接続中・複数画面使用中何もしない

サスペンドの深さは前節のMemorySleepMode=deepで指定します。
logindの設定は、ふたを閉じたときにサスペンドするかどうかを担当します。
こちらも同名ファイルは上書きします。

再起動後に動作を確認する

作業を保存し、都合のよいタイミングで再起動します。

sudo systemctl reboot

再起動後、まずバッテリー駆動・外部画面なしでふたを閉じ、復帰できるか確認します。
復帰後、次のコマンドで実際のサスペンド方式を確認できます。

sudo journalctl -b -k --no-pager | grep -E 'PM: suspend (entry|exit)'

該当するサスペンドのログに PM: suspend entry (deep) があれば、deepで入ったことを確認できます。
バッテリーの減りは、同じ条件・同じ待機時間で比較してみます。

ふたを閉じても動作しない場合

デスクトップ環境の電源管理がノートPCの蓋閉めのイベントを担当していると、logindの設定だけでは動作が変わらない場合があります。
デスクトップ側でも「ふたを閉じたとき」をサスペンドに設定します。

systemd-inhibit --list
systemd-analyze cat-config systemd/logind.conf
systemd-analyze cat-config systemd/sleep.conf

handle-lid-switch を取得しているアプリや、別の追加設定による上書きを確認してください。

元に戻す

今回作成した2つのファイルを削除し、作業を保存して再起動します。

sudo rm -- /etc/systemd/sleep.conf.d/90-deep-sleep.conf /etc/systemd/logind.conf.d/90-lid-suspend.conf
sudo systemctl reboot

今回の追加設定がなくなり、既存の設定とカーネルの既定値に戻ります。ほかに設定があれば、その設定が使われます。

deepにして1日ほど放置してみた

設定後、スリープにしたまま1日程度放置してみました。
その後に開いてみると、バッテリーはまだ半分ぐらい残っていました。持ち歩いて、次に使おうとしたときにもバッテリーが残っているのはありがたいです。

スリープ開始時の残量をそろえた厳密な比較ではありませんが、今回のノートPCではひとまず実用的に使えそうな感触です。バッテリーの状態や機種によって結果は変わるので、同じくらい持つことを保証するものではありません。

ハイバネートを見送った理由

当初は休止状態も検討しましたが、今回のDebian標準カーネルではSecure Bootに伴うカーネルロックダウンにより利用できませんでした。Secure Bootを無効にする運用は選ばず、今回は有効のまま使えるdeepサスペンドにしました。

参考資料

-Linux, ノートパソコン, パソコン関連
-, ,