LM22 にハイバネーション設定

この年末でノート PC が壊れてしまい タワー型の PC をメインで使うことになりました。随分前から使っているのですが、サスペンド/ハイバネートが効かないのが気にはなっていました。

ハイバネートできなくても使うこと自体にはなんら支障はありませんが、普段ノートを使い電源切らない運用しかしていないのでビミョーに不便です。やっぱり中断前の作業状態にすぐ復帰できるの地味ながらとても便利です。

でネットを調べるといろいろな手順がヒットしますがまとめると概ねこんな感じになるらしい。

  1. スワップファイルかスワップパーティションを作成する
  2. GRUB にスワップを使うことを知らせる (/etc/defaults/grub の更新)
  3. update-grub で設定を反映し、テスト

スワップファイルを作成

ネット上ではスワップファイルを使うケースが多いが若干設定箇所が異なるので注意が必要です。

この PC はすでにスワップファイル使っているのでスワップパーティションの作成はしません。

この辺は適当に。

スワップファイルのある場所の UUID とオフセットを確認する。自分の例ではスワップファイルは /swapfile というパス名で作成していますので適宜あわせてください。

; uuid の確認
$ sudo findmnt / -o UUID
e62d2aa4-2253-4f99-bb9b-28cc9bd0c888

; 別の方法
$ ls -l /dev/disk/by-uuid
rwxrwxrwx - root 29 Dec 14:46 181B-6932 -> ../../sda2
lrwxrwxrwx - root 29 Dec 14:46 be4c8276-05df-4175-9e40-55a460df91db -> ../../sdb
lrwxrwxrwx - root 29 Dec 14:46 e62d2aa4-2253-4f99-bb9b-28cc9bd0c888 -> ../../sda3


; オフセットの確認
~$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 34359738368 (8388608 blocks of 4096 bytes)
 ext:     logical_offset:             physical_offset:  length:   expected: flags:
   0:            0..   32767:   78086144..  78118911:  32768:            
   1:    32768..   65535:     4161536..   4194303:   32768:   78118912:
   2:    65536..   98303:     8355840..   8388607:   32768:    4194304:
..... ずっと続く

; この例だと 78086144.. が該当します。

設定ファイルを更新する

カーネルにレジュームを使うことと、スワップファイルの位置を知らせる。

設定ファイルの場所はいくつかあるらしいが /etc/default/grub を変更することにした。GRUB_CMDLINE_LINUX_DEFAULT= に resume=UUID=e62d2aa4-2253-4f99-bb9b-28cc9bd0c888 resume_offset=78086144 を追記する。

sudo vi /etc/default/grub
...
GRUB_CMDLINE_LINUX_DEFAULT="quiet splashi apm=off acpi=force resume=UUID=e62d2aa4-2253-4f99-bb9b-28cc9bd0c888  resume_offset=78086144"
...
:wq

設定を反映する

最近 GRUB の設定をいじることはあまりなくなってすっかり忘れていましたが、gurb を更新します。よくわかっていませんが、このコマンドの過程で initramfs も更新される? のかなと思います。

$ sudo update-grub

再起動して、テストする。

$ systemctl hibernate

うまく行くと SSD への少し長いアクセスのあと電源が切れます。もちろん電源を再投入すると元の作業状態でデスクトップが再開されます。

もしかすると BIOS/UEFI で ACPI を有効にする設定が必要かもしれません。

2024-12-30 追記

終了ダイアログにハイバーネートを追加

systemctl hibernate が動いているのですっかり OK かと思っていたが、終了ダイアログにハイバーネートボタンがないことに気づいた。

ターミナルから入力すればいいのだが、これはこれで微妙に面倒くさい。「交流電燈舎第弐工房日誌」さんの記事の通りに、/etc/polkit-1/localauthority にフォルダとファイルを作成してみる。

こんな感じで /etc/polkit-1/localauthority/50-local.d/50-hibernate.pkla ファイルを作成した。(pkla はピーケーエルエーです。)
ファイル名は数字から始まり、かつ .pkla で終われば適当な感じでOKだと思う。

[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes

再起動するもダイアログの内容は変わらなかった。

いろいろ調べてみるとどうも polkit (policy kit) というのでハイバーネート権限があるかどうかで挙動が変わるらしい。早速確認すると、sudo なしだと no で policy kit 的にはハイバーネートできないってことになっているらしい。

$ busctl call org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager CanHibernate 
s "no"
$ sudo busctl call org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager CanHibernate 
s "yes"

参考リンクの Linux Mint Forums の記述を参考に .rules ファイルを作成する。

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.login1.hibernate" ||
        action.id == "org.freedesktop.login1.hibernate-multiple-sessions" ||
        action.id == "org.freedesktop.upower.hibernate" ||
        action.id == "org.freedesktop.login1.handle-hibernate-key" ||
        action.id == "org.freedesktop.login1.hibernate-ignore-inhibit")
    {
        return polkit.Result.YES;
    }
});

本来なら subject に実行ユーザーの情報が入ってくるので、一定の権限のユーザーだけ許可するように処理を書くべきなようです。今回は subject を捨てて闇雲に許可しているのでセキュリティ的には問題ありそうですが、よくわからないので良しとします。

ファイルを保存して再起動すると、.pkla ファイルが反映され、終了ダイアログと設定 “Power Management” でハイバーネートの設定が表示されるようになりました。

Windows ならインスーラが認識できなければほぼ実現できないことがやれるようになるのは Linux のいいところでもあり、だからこそ煩わしいところでもある。昔よりはずっと良くなったがまだまだ覚えなければいけないことはたくさんある。

参考

電源管理/サスペンドとハイバネート – ArchWiki
このページは ArchiWiki の中では比較的わかりにくいです。

ハイバネーション, レジューム, サスペンド, LinuxMint – 交流電燈舎第弐工房日誌
このページはわかりやすかった

Linux Mint 21.2 でハイバネートできるようにする(rEFInd を使っている場合) – 🍣すしでもどうですか
rEFInd は GRUB2 のようなブートローダらしい、なのでブートローダ関連のファイル修正は GRUB2 とは異なる

How to enable Hibernate Mode on Linux Mint | FOSS Linux

[SOLVED] Mint 22 enable hibernation in power and shutdown menu – Linux Mint Forums