Ubuntu16.04 の頃には特に問題なくハイバネートできていたがそれ以降のバージョンでうまくいかない/設定方法がわからない、という記事をよく見かけます。 自分もその一人ですが、今回やり方がわかったのでメモしておきます。
18.04時点で、obsolatedとなった昔の方法を含めいくつかやり方があるようですが、ここで記載するのはuswsusp(s2disk)を用いる方法です。
参考リンク
-
Ubuntu 18.04 can’t resume after hibernate - Ask Ubuntu
-
全体の流れの説明
-
-
-
Arch Linux Wiki
-
-
Ubuntu 18.04 can’t resume after hibernate - Ask Ubuntu
-
uswsusp の利用方法
-
-
How do I increase the size of swapfile without removing it in the terminal? - Ask Ubuntu
-
スワップファイルサイズ変更の参考手順
-
-
-
Ubuntu Wiki
-
ブートローダでカーネルパラメータを渡す設定方法
-
-
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'