Ubuntu18.04 ハイバネート(休止)

Ubuntu16.04 の頃には特に問題なくハイバネートできていたがそれ以降のバージョンでうまくいかない/設定方法がわからない、という記事をよく見かけます。 自分もその一人ですが、今回やり方がわかったのでメモしておきます。

18.04時点で、obsolatedとなった昔の方法を含めいくつかやり方があるようですが、ここで記載するのはuswsusp(s2disk)を用いる方法です。

参考リンク

note

  • pm-utils(pm-hibernate含む)(Arch Linux Wiki による解説)を用いる解説もまだ見かけるが、 obsoletedな方法である。pm-utilsパッケージはもはやメンテナンスされていない。

  • ハイバネートを行う際にはスワップ領域にディスクイメージを対比させるようだが、スワップ領域がパーティションである場合とファイルである場合がある。それぞれ容量の拡張方法が異なることに注意。

    • Ubuntu17.04以降(?)でスワップファイルになったようだが、それ以前のバージョンからアップグレードした場合にはスワップパーティションを利用しているかもしれない。

設定手順

カーネルがサポートしているかの確認

cat /sys/power/state

コマンドを実行して、結果に disk が含まれているかを確認する。 例:

$ cat /sys/power/state
freeze mem disk

disk が含まれていない場合、BIOSの設定でSecure Bootが有効になっていれば無効にする、という対策がよく書かれている。 自分の場合、Secure Bootは無効であったが、休止モードの利用も無効になっていた。休止モード利用を有効に設定すると disk が現れた。

スワップ領域の容量確認と拡張

cat /proc/swaps コマンド(あるいは swapon -s コマンドでも同様の結果を得られる)で現状を確認。

$ cat /proc/swaps
Filename                Type        Size    Used    Priority
/swapfile                               file        2097148 890488  -2

/swapfile という約2GBのファイルをスワップ領域として利用しているのが確認できる。(これがUbuntu18.04のデフォルトのはず。以下これを前提としてスワップ領域を拡張する。スワップパーティションを利用していた場合、別の手順となるため、他の解説ページを参照のこと。)

必要なサイズは、 公式FAQによると

For more modern systems (>1GB), your swap space should be at a minimum be equal to your physical memory (RAM) size "if you use hibernation", otherwise you need a minimum of round(sqrt(RAM)) and a maximum of twice the amount of RAM.

ということなので、物理メモリ16GBの場合は16GB〜32GB程度、ということだろうか。今回32GBに増やすことにした。

sudo swapoff /swapfile
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

冒頭に記載した`cat /proc/swaps`で変更を確認できる。

また、次のコマンドでこのスワップファイルのUUIDを参照できる。

$ sudo findmnt -no SOURCE,UUID -T /swapfile
/dev/nvme0n1p3 02cf8bf4-7690-4cf8-9aa3-c58c8fcc7ff0

uswsusp のインストールとセットアップ

インストール

sudo apt install uswsusp

セットアップ

/etc/uswsusp.conf を作成する。(インストール時に作成されていたが、一応再作成することにした)

sudo dpkg-reconfigure -pmedium uswsusp

このとき、次のようなメッセージが表示されたが、はいを選択して継続するのが正解のようだ。(※ いいえも選択し直してみたが何が変わったのかわからなかったが。)

uswsusp の設定ファイルで指定されているスワップファイル、あるいはスワップパーティションが有効になっていません。
多くの場合、これはユーザ空間でのソフトウェアサスペンドが期待通りに動作しないことを意味しています。他のスワップ領域を選ぶ必要があります。                                      しかし、いくつか稀なケースとして、この設定通りになることもあります。
利用可能なスワップ領域がありませんが、続行しますか?
  • "レジュームに利用するスワップ領域" は、上で述べた sudo findmnt -no SOURCE,UUID -T /swapfile で表示されたUUIDのものを選択するようだ。

    • 自分の場合は /dev/disk/by-uuid/02cf8bf4-7690-4cf8-9aa3-c58c8fcc7ff0 (もう一つ表示されていた選択肢 /swapfile だと駄目なのかはわからない)

  • 暗号化はしないことにした。

  • 別の解説の手順で /etc/initramfs-tools/conf.d/resume ファイルを作成するように書かれていたので先にそれを試していたのdが、このファイルがあると正しくスワップ領域を認識できなかった。削除してやり直すと上手く行った。

カーネルパラメータ resume 設定

/etc/default/grub ファイルの、

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

の行を次のように編集した:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=02cf8bf4-7690-4cf8-9aa3-c58c8fcc7ff0"

ここで設定しているUUIDはこれまでに見てきた /swapfile のもの。 設定を反映するために次のコマンドを実行:

sudo update-grub

(※ 参照した解説では`resume_offset`も設定すべきと書かれていたが、無くても上手く行った)

ハイバネートを試しレジュームできることを確認

(再起動してからの方が良いのか?不明)

sudo s2disk

を実行。再起動後resumeできた。 なお失敗する場合は単に電源OFFの挙動になってしまうので、途中作業のものは全て保存してから試すべきだろう。

追加の設定

systemd hibernate の更新

今回のs2diskを利用する方法で設定を上書きする。

sudo systemctl edit systemd-hibernate.service

でエディタを開き、次の内容を記述して保存。

[Service]
ExecStart=
ExecStart=/usr/sbin/s2disk
ExecStartPost=/bin/run-parts -a post /lib/systemd/system-sleep

これにより、 /etc/systemd/system/systemd-hibernate.service.d/override.conf ファイルが生成される。

編集の確認

sudo systemctl hibernate

を実行してハイバネートとresumeが機能することを確認する。

アイドル時スリープ(suspend)でなく休止(hibernate)にする

gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'hibernate'