ぶていのログでぶログ

思い出したが吉日

Ubuntu 18.10で暗号化スワップを使っていてもハイバネーションする

Ubuntuデスクトップをメインに使いだしてから、ハイバネーションできないことが一番のネックだった。。 業務が終わりPCを閉じ、次の日業務を開始しようとPCを起動するとスリープのままになっており、電池の残量が60%とかになっている…。 土日を挟んだりすると完全に電池が切れていたりする。。 電池が切れた状態で電源ボタンを押してもうんともすんとも言わないし、XPS13だと起動ランプが分かりづらい(っと私は思っている)ので電源長押ししても何も起こらないし、そのうち電池切れになっていることを思い出して、復旧するみたいなことが月イチくらいにあった*1

この問題を解決しようと18.04のときに何度か試したのだが、何回かリブートを繰り返すと暗号化スワップがなぜか無効化する*2のでうまく行っていなかった。。 18.10にしてから再度チャレンジしたらうまく行ったのでブログに書いておく。 なお、以下のサイトを参考に設定を行った。

ubuntuforums.org askubuntu.com

1. セキュアブートの無効化

いきなりハードルが高いw セキュアブートを無効化しないと、Linuxではハイバネーションが有効にならない。 理由はよくわからない、、が事実そうだった。 Linux単体で使っている場合、セキュアブートを無効化してもそんなに困らないと思う(たぶん)。 しかし、Windowsデュアルブートにしている場合、TPMが読めないのか起動時にBitLocker解除用のコードを手入力しなくてはならずかなりだるい。。 私の場合、メインはLinuxで使っているので、Windowsを使うときだけセキュアブートを有効にするという運用方法で回避することにした。

なお、参考サイトではセキュアブートを無効化するかUnsignedなLinuxカーネルを使うと書いてある。 UnsignedなLinuxカーネルを使うことでセキュアブートを意図的に無効化できるのだろうか?(憶測)。 で、こちらも試してみたのだがgrubがモジュールロードできないというエラーを吐いて起動できなかったのであった。。

セキュアブートを無効化して起動し、/sys/power/stateを見るとdiskが追加されていてハイバネーションが有効になっているのがわかる。

$ cat /sys/power/state
freeze mem disk

2. 暗号化スワップの用意

次に暗号化スワップを用意する。 と言っても特別な手順を行なう必要はなく通常通りなので、参考サイトのコマンドをそのまま実行した。 以下は、私の環境で実行した時の手順になる。

# 暗号化スワップの作成
$ sudo cryptsetup luksFormat --cipher aes-xts-plain64 --verify-passphrase --key-size 256 /dev/nvme0n1p6
$ sudo cryptsetup luksOpen /dev/nvme0n1p6 nvme0n1p6_crypt
$ sudo mkswap /dev/mapper/nvme0n1p6_crypt

# fstabを編集
$ sudo vim /etc/fstab
$ grep swap /etc/fstab
/dev/mapper/nvme0n1p6_crypt none            swap    sw              0       0
$ sudo swapon -a
$ sudo swapon -s

# 起動時に暗号化を有効にする
$ sudo vim /etc/crypttab
$ grep nvme0n1p6 /etc/crypttab
nvme0n1p6_crypt /dev/nvme0n1p6 none luks,swap,discard
$ sudo bash -c "echo RESUME=/dev/mapper/nvme0n1p6_crypt > /etc/initramfs-tools/conf.d/resume"

# GRUB_CMDLINE_LINUX に resume=/dev/mapper/nvme0n1p6_cryptを追加
$ sudo vim /etc/default/grub
$ grep GRUB_CMDLINE_LINUX_DEFAULT /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/mapper/nvme0n1p6_crypt"

# initramfs/grubを更新
$ sudo update-initramfs -u -k all
$ sudo update-grub

ここまで設定し再起動すればハイバネーションが実行できるようになっているはず。 ハイバネーションは以下のコマンドで実行できる。

$ systemctl hibernate

3. 蓋を閉じたときにハイバネーションする

ここまでの設定でハイバネーションが行えるようになったが、ノートPCの蓋を閉じてもハイバネーションに移行しない。 さすがにそれは不便なので変更する。 設定は、/etc/systemd/logind.conf を変更する必要がある。 デフォルトではコメントアウトされているとおもうので、コメントを外し対象行を修正する。

$ egrep -v "^($|#)" /etc/systemd/logind.conf
[Login]
HandleLidSwitch=suspend-then-hibernate

suspend-then-hibernate は一定時間サスペンドした後にハイバネーションに移行する。 この設定にしているのはなぜかというと、例えば会議に参加するときなどに一時的にノートPCを閉じて移動し、すぐにノートPCを開いて操作するみたいなときにハイバネーションになっていると困るからだ。 サスペンドからハイバネーションに切り替えるタイミングは /etc/systemd/sleep.conf に以下のような設定を行なうとできる。 このファイルは存在しないので新規に作成した。

$ cat /etc/systemd/sleep.conf
[Sleep]
HibernateDelaySec=1800

再ログインすることで設定が反映されるらしいが、あまり自信がなかったので再起動して反映させた。

ハイバネーション運用をして気がついたこと

この設定を行ってから約一ヶ月くらい経ったが概ね期待どおりの動作をしている。 ただし、やはりというかクラムシェルで動かしているとちょっと挙動がおかしい。 私の環境では、クラムシェル状態でそのままディスプレイケーブルを抜くとハイバネーションに移行するようなのだが、その後二度と起動してこない…。 どこで死んでいるのか全くわからないので、結局電源長押しで再起動してしまっている…。

解決策にはなっていないのだが、クラムシェルはやめてデュアルディスプレイで運用することで、今の所この現象の遭遇率は下がっている。

18.04でも設定できる?

参考サイトを見るとUbuntu 18.04と書いてある。 私が試したのは18.10なのだが、もしかしたら18.04でもここまで書いた手順でうまく行くかもしれないのだが、いまさらそれを検証する気にはなれないのでご容赦…。

まとめ

Ubuntu18.10で暗号化スワップを使っていてもハイバネーションできるようになった。 これで運搬時にバッテリーが消費されるのを極力減らすことができるようになった。 この記事では、ハイバネーションが無効化された状態の18.04から18.10にアップグレードしてから、ハイバネーションを有効にしたので今回紹介した手順が必要であった。 試してはいないのだが、もしかしたらUbuntu18.10のOSインストーラーがいい感じにココらへんを設定してくれるかもしれない。

*1:多すぎ

*2:マウントに失敗してクリーンアップされている??