本記事は俺ちゃん著の Linux Mint インストール記事 の追っかけ記事である。基本的に、そちらを読んだ読者を対象としているが、他サイトを参考にして Linux Mint をインストールしたとか、既に大分前にインストールして使っているよという人も利用でき、おそらく参考になるだろう。
🕒 この記事を読むのに必要な時間 🕒
全文:おおよそ15分
📜 必要な知識 📜
Linuxに関する知識: 初級
Linuxコマンドライン操作: 初級
💻 実行環境 💻
OS: Linux Mint 22.1 x86_64
Kernel: 6.8.0-85-generic
Shell: bash 5.2.21
DE: Xfce 4.18
WM: Xfwm4
Terminal: xfce4-terminal
Packages: polkitd-pkla 124-2ubuntu1.24.04.2
🔶 概要
Linux Mint では初期状態ではハイバネーションが無効にしてある。
これを有効化する方法をここに記す。
ハイバネーションとは Windows でいう、休止状態のこと。 HDD/SSD などのストレージにメモリの内容を保存しておき、再度起動したときに、そこからメモリへ復元することで作業中の状態を復帰することができるという機能。(ハイバネートとも呼ばれる。復帰はリジューム)
電源を完全に切れることが利点。特にバッテリーで動作させることの多いラップトップ PC では大変便利な機能だ。
同じようなものにメモリの内容をそのままにして、他のデバイスの電源を切って低電力消費状態にする "サスペンド" というものがある。(こちらは Windows 用語で言えばスリープのこと)
ただし、サスペンドではメモリには電気を供給し続けなければならないため、完全に電源を切ることができない。
Linux Mint では初期状態でサスペンドは利用できるのだが、ハイバネーション機能は使用できなくなっている。これを使えるようにする。
🔶 前提条件
Linux Mint 22.1 以降がインストールしてある PC があること。
それ以前のバージョンでも動作すると思うが、保証はしない。
また、本記事で紹介する方法はスワップ領域をパーティションとして作っておく必要がある。
俺ちゃんのインストール記事 から来た人は既に作成済みだと思うが、そうでない人は GParted などを使って Linux 用の Swap パーティション を予め作成しておくこと。
その際、パーティションのラベルには "Swap" という名前を設定しておくこと。
🔶 Swap パーティションの有効化
ハイバネーションを有効にするにはまず、メインメモリの内容を退避させるスワップ領域へ格納するように設定しなければならない。
しかし、 Linux Mint の場合、デフォルトではせっかく作った Swap パーティション を使用してくれていないようだ。そこで /etc/fstab ファイルを編集して Swap パーティション を有効にすることから開始する。
まずはデフォルトになっている、ファイルを使ったスワップを解除する。
[スタートメニュー] > [システム] > [Xfce端末] で端末を開く。
そして以下のコマンドを打ち込む。
$ sudo swapoff -a
$ sudo rm -f /swapfile
$ sudo xed /etc/fstab
📌 初心者向けワンポイント解説 🔰
先頭の $ マークは プロンプト と言って端末のコマンドラインであることを示す記号なので打ち込まなくて良い。$ の後から入力すること。上記では 3 行のコマンドラインをまとめて示しているが、 1 行づつコピー&ペーストしてから Enter キーを押すこと。
コマンドは意外と長い場合があるので、ちゃんと末尾までコピーできているか、よく確認しよう。特に Qiita の記事にあるコマンドは隠れていて、横スクロールしなければ全文が見えない場合がある。
ついでにそのコマンドがいったいどういう意味を持つのか調べるてみると学習になるだろう。(最初は呪文だと思って、別に意味がわからなくても別にいいんだが… まあ、お任せする)
1 行目の実行時にパスワードを尋ねられるので入力すること。
3 行目を実行するとテキストエディタ xed が開く。
fstab ファイルはデフォルトでは上記画像のようになっているはずだ。
📌 初心者向けワンポイント解説 🔰
この手の設定ファイルでは、先頭に # が入っている行はコメント行だ。直接の設定内容ではなくて、その解説や補足事項、あるいは例示や不活化された設定などになっている。コメント行には何が書かれていても効力を持たない。
この中で最後の行( /swapfile の行)が今回編集する行。今は次のようになっている。
/swapfile none swap sw 0 0
これは Swap パーティション ではなくて swapfile という名前のファイルを、スワップ領域の代わりに使うという指定になる。これを以下のように書き換える。
PARTLABEL="Swap" none swap default 0 0
Swap パーティション のラベル名を もし "Swap" にしていなかった場合は適宜読み替えること。
書き換えたら メニューから [ファイル] > [保存] を選ぶか Ctrl + S キーで保存しておく。保存したら [×] ボタンで閉じてしまって良い。
次に swapon コマンドを使ってこのパーティションを ON にする。
$ sudo swapon -a
$ swapon --show
出力に Swap パーティション が表示されていれば、OK。ちゃんと ON になっている。
🔶 Swap パーティションをカーネル・パラメーターに追加する
Swap パーティションが無事システムに認識されたが、これだけだと単にメインメモリが一杯になってしまったときに、ページアウトするとき使われるに過ぎない。ハイバネーションを有効にするには、リジュームに使うことを宣言し、そのパーティションがどこであるか、カーネルに知らせてやる必要がある。1
Swap パーティション を知らせるには、それを何らかの方法で特定する必要がある。今回特定には UUID を使う。
UUID とは、そのストレージ・デバイスやパーティションを一意に特定するための ID である。この UUID を知るには端末を開いて以下のように打ち込む。
$ sudo blkid | grep -i swap | sed -re 's/.*\bUUID="([^"]+)".*/resume=UUID=\1/'
出力は以下のようになっているはずだ。
resume=UUID=<あなたのUUID>
ここで "<あなたのUUID>" の部分は環境に応じて変わるので必ず自身で実行したときの出力を使うこと。この結果をコピーしておく。
マウスで選択してから [編集] > [コピー] でクリップボードにコピーできる。
次に、引き続き端末上で以下のコマンドを打つ。
$ sudo cp -i -p /etc/default/grub /etc/default/grub.default
これは今から編集する GRUB の設定ファイルをバックアップしておく指定になる。もし間違えたりすると、最悪システムが起動不能に陥るため、念のためにバックアップしておく。
終わったら次のコマンドを打ち込む。
$ sudo xed /etc/default/grub
xed が開かれたら、 "GRUB_CMDLINE_LINUX_DEFAULT=" を探す。
Linux Mint 22.1 "Xia" の場合は 10 行目あたりにあった。
xed の設定画面で [行番号を表示] を ON にするとわかりやすいだろう。
次に "quiet splash" の splash の後に半角の空白を一つ入れ、先程コピーしておいた UUID の内容を貼り付ける。
メニューから [編集] > [貼り付け] を選ぶか、 Ctrl + V キーで貼り付けできる。
終わったらメニューから [ファイル] > [保存] を選ぶか Ctrl + S キーで保存しておく。保存したら xed は閉じてしまっていい。
次に、今行った変更を反映させる。
以下のコマンドを打つ。2
$ sudo update-grub
これで一旦システムを再起動する。
スタートメニューから [ログアウト] > [再起動] を選ぶか、以下のコマンドを端末へ打ち込めば再起動できる。
$ sudo reboot
🔶 ハイバネーションができるようになったか試してみる
再起動し終わったら再び端末を開き、以下のコマンドを打ち込んでみること。
$ sudo systemctl hibernate
すると、システムがシャットダウンする。
30秒以上待ってから、 PC の電源ボタンを押してもう一度起動しよう。3
普通に起動したときと変わらない GRUB 2 の画面が表示される。一番上を選んで起動させる。するといつもの Linux Mint のロゴが中央に表示され起動処理が開始されるのだが… "Resuming for /dev/XXXXX ..." のような文言がロゴの下に現れるだろう。これがハイバネーションから復帰中であることを示している。
その後、自動ログインにしていない場合はログイン画面が表示され、ログインすると先程 systemctl コマンドを実行した端末が開かれた状態の画面が復元される。これで成功。
❌️ うまくいかない場合は? 😞
今までの工程に間違いがないか確認しよう。
間違いがないのに復帰できない場合、何かがハイバネーション、あるいはリジュームを妨げている。その何かを探るため、ログを確認しよう。
$ journalctl -b -1
このコマンドは前回起動時のログを表示する。
ハイバネーションを実行した時と、復帰しようとした時の時間を鍵にして、その周辺で エラー(Failed/Error) や 警告(Warning) が出ていないか確認すること。電源管理は ACPI というモジュールが担当している。起点となる場所には "hibernat", "suspend", "freeze", "resume", "Restoring" などの単語が入っているので、それらもヒントにログを見てみること。
筆者が過去に経験したケースでは、USB機器が原因だったり、特定のカーネルやドライバが原因だったり、 initramfs が原因だったり、GDM や LightDM といったログイン画面を出しているディスプレーマネージャーが原因だったり、 PAM や polkit などの権限・認証関連の問題であったり、BIOS の ACPI 設定が原因だったりした。いろいろな要因が 休止/復帰 を妨害することがある。
これらの解決には、 Linux Mint フォーラム や、 Ubuntu 日本語フォーラム、別のディストリビューションではあるが ArchWiki などが役に立つことが多いが… 現代なら AI という強力な武器があるのでエラーメッセージを鍵に彼等に尋ねるのもよいだろう。
🔶 GUI のメニューに追加しておく
さて、コマンドを使ってハイバネーションできるようにはなった。
しかし、俺ちゃんのような絶えず端末を開いているギークはこれで十分だが、初心者のみんなからすれば GUI メニューからハイバネーションしたいと思うことだろう。そこでログアウト画面にハイバネーションの項目を追加してみよう。
ログアウト・メニューに追加するためには、メニューを有効化する必要がある。これにはアプリケーションが特権を要求したり、特権を持ったプロセスと通信するためのツールキットである polkit デーモンが関わってくるのだが、これの古い形式である pkla ファイルを使って有効化する。4
これにはまず、次のコマンドを使用してパッケージをインストールする必要がある。
$ sudo apt install -y -qq polkitd-pkla
polkitd-pkla パッケージがダウンロードされ、インストールされる。
ソフトウェアマネージャーでも同じことができるが、端末を開いているのならこの apt コマンドを使ったほうが速い。
インストールが完了したら、 pkla ファイル 2 つとルールファイルを作成してゆく。
$ sudo mkdir -p /etc/polkit-1/localauthority/50-local.d
$ sudo xed /etc/polkit-1/localauthority/50-local.d/com.linuxmint.enable-hibernate.pkla
xed が起動したら、以下をコピペする。
[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
次の画面のようになるだろう。
終わったら保存して閉じる。
次の pkla ファイルの作成に移る。
$ sudo mkdir -p /etc/polkit-1/localauthority/90-mandatory.d
$ sudo xed /etc/polkit-1/localauthority/90-mandatory.d/enable-hibernate.pkla
以下をコピペする。
[Enable hibernate]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions
ResultActive=yes
保存して閉じる。
最後のルールファイルの作成に移る。
$ mkdir -p /etc/polkit-1/rules.d
$ sudo xed /etc/polkit-1/rules.d/10-enable-hibernate.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;
}
});
保存して閉じる。
これで再起動すれば完了。
[スタートメニュー] > [ログアウト] で表示されるメニューに [ハイバネート] & [ハイブリッドスリープ] の 2 つが加わっているはずだ。
ハイブリッドスリープは、ハイバネーションのときと同じようにストレージ(のスワップ領域)へとメモリの内容を保存するが、そのままメモリにも残しておき、電源を切らずにサスペンドの状態にするという機能だ。
その結果、バッテリーが切れる前に電源を入れた場合には、普通にメモリに残っていた内容から素早く復帰でき、バッテリーがなくなって電源が落ちてしまった場合にはストレージ(のスワップ領域)から復帰するという二段構えの構成になる。
外出先などで「多分すぐにもう一度開くと思うけど… もしかしたら、しばらく開かないかも…」みたいなシチュエーションのとき便利だ。ただし、リチウムイオン・バッテリーの特性上、電源が落ちるまでバッテリーを酷使するとバッテリーを傷めてしまい、寿命を縮める原因となるので多用は禁物だが。
以上。
ハイバネーションを使って素敵な PC ライフを。
Cowabunga! 🐢 Have a nice day! 🫶
🔶 参考サイト
📝 MEMO: Linux Mint Forums
Linux Mint のフォーラムでのハイバネーションに関する投稿。ここで紹介されている setup-hibernate.sh が本稿の元ネタだ。だが、こちらは swapfile を使うやり方だったので、本稿では Swap パーティション に対応するよう変更。
なぜ俺ちゃんが swapfile よりも Swap パーティション を好むのかと問われれば理由はいくつかあるが、最もな理由としては Swap パーティション が専用領域であることだ。すなわち、日常的に行われる活動によってディスクの容量が逼迫したり、断片化が起きて低速になっていたりしても関係なくハイバネーションでき、復帰ができる。ファイルの場合はそれらの影響をもろに受ける。…ただし、対価として自由に使えるディスク容量は減ってしまうのだが。
なお、 swapfile を用いる場合には このスクリプトがやっているように オフセットというものをカーネルパラメーターに追加する必要がある。もし、やるなら注意すること。
📝 MEMO: ArchWiki
俺ちゃんの大好きな Arch Linux の Wiki ページ。非常に詳しく解説してある。
ディストリビューションが異なるため、環境が全く同じではなく、そのまま同じ手が通用するとは限らないが、 Linux 全てに共通する部分も多く参考になる。この Wiki に書かれているのは小手先の解法ではなく、言わば整った "式" である。故に読者に知識と理解力があれば適切に読み替えることで応用が効くのだ。無駄に冗長な俺ちゃんの記事もこのようなものを目指している。
この電源管理ページについても詳しく書かれており、暗号化や LVM パーティション を使ったハイバネーションについても記載されている。
-
Swap パーティションがどこかカーネルに知らせる:
システムを起動させるとき、初期に処理を開始するのはLinuxカーネルだ。ハイバネーションからの復帰はストレージに退避した内容をメモリに戻す必要があるので、カーネルはこの段階でその場所がどこであるか知っておく必要がある。これにはカーネル・パラメーターと呼ばれる仕組みを使う。より厳密に言えば、システムの初期化処理にはinitramfs(初期RAMディスク)と呼ばれる最小構成のLinuxシステムが関わっており、カーネルもそのinitramfsに従って使われるため、initramfsもハイバネーションからの 復帰(resumeという)に対応している必要がある。ディストリビューション によってはinitramfsが未対応の場合があるので、更新する必要がある。(Linux Mintの場合は必要ない。が、Arch Linuxなどでは必要)
これらへの指定は OS が起動する前の段階で行う。このあとの手順でGRUBの設定ファイルを書き換えているのはこのためである。 ↩ -
grub-update とは?:
このコマンドを実行すると、上記で書き換えた設定ファイルとシステムにインストールされたカーネルの状態などを調べて実際の GRUB メニューが書かれているファイルを更新する。このファイルは通常 /boot/grub/grub.cfg である。
なぜ、このファイルを直接書き換えないのかと言うと、こちらを書き換えてしまうとシステムの更新によってカーネルがバージョンアップした際などに上書きされてしまうためだ。 ↩ -
30秒以上待つとは?:
PC をシャットダウンしても、すぐさま内部の電気がすべて消えるわけではない。内部基板にはコンデンサなど一時的に電気を溜めている電子部品があり、それが完全に解放されて、完全に動作が停止するまでには少々時間がかかる。これを見越して安定した停止状態に移るまでの十分な時間の目安が 30秒だ。 PC などの精密電子機器の電源を入れ直す場合には、この時間を待ってから入れ直すのがもっとも機械に優しく、セオリーとなっている。 ↩ -
polkitデーモン、およびpklaファイルについて:
polkitデーモン(polkitdという)はpolkitと呼ばれる特権昇格などの権限に関する機能を提供しているサービス。諸君は "デーモン" というと 悪魔(Demon) のイメージが思い浮かぶだろうか? だが、 Linux… いや UNIX の世界ではこれは 精霊(Daemon) のことを指す。子供や純真な心の人にしか見えないといわれる妖精とか、自然が比喩的に 擬人化/神格化 された神秘の存在のことだ。
デーモンはこの精霊のように、表立っては見えないが UNIX 互換システムの裏側で密かに活躍することで世界を回している存在というわけだ。polkitdは元々はPolicyKitの略で権限に関するポリシーを定義し、取り扱うためにある。pklaファイルについては先述した通り、これの少々古臭い形式で現代ではデフォルトでは使われなくなってしまった形式。なので、ここで紹介している方法は実はあまり良い手ではない。将来的には通用しなくなる可能性が高いのだ。おそらく、pklaを代替するpolkitのconfの形式で書き直せばいいのだろうが… そのあたりは面倒なので誰かが調べて書いてくれるのを待っている。(おい!) ↩



