試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Linux上で休止状態を実現するTuxOnIceの概要と準備(3.0-rc1の時点)

概要

TuxOnIceは、以前Software Suspend2(あるいはSuspend2)と呼ばれていた、ハイバネーションの実装の1つ。
メモリの内容をディスクに保存して電源を切り、次に起動したときにこれを読み込むことで、作業状態を復元できる。
普通に電源を切ると、次に起動したときに

  • アプリケーションを起動し直す
  • ファイルを開き直す
  • 前の作業状態に持っていく

などといった作業を手動で行わなければならないが、休止をすることで、それらの作業を行うことなく、一度電源を切りながら、素早く元の状態に戻すことが可能。起動時間の短縮にもなる。
ここまでは一般的なハイバネーションについての概要だが、TuxOnIceでは、下に挙げるような利点がある。当然欠点もあるので、場合によっては他のuswsusp方式を考えるのもよい。
http://www.tuxonice.net/features に他の方式との比較もあるのだが、(2007年10月現在)若干情報が古い。*1

利点
  • 高速にメモリイメージを保存(2.2.9.5以降、マルチスレッドにも対応)
  • イメージの圧縮機能(パッチに含まれる、高速なLZFアルゴリズムを推奨。他のアルゴリズムも使用可能)
  • イメージの暗号化機能(カーネルのサポートする暗号化アルゴリズムを使用)
  • UserUIと呼ばれる、グラフィカルな進行状況表示機能(fbsplash互換のものとテキスト版がある)
  • スワップパーティションとファイルのどちらにもイメージを書き込める
  • ディスクイメージ保持モードにより、毎回同じ状態で復帰させることが可能(ハードディスク上のファイルシステムは読み取り専用にする必要がある)
  • 新しい機能が色々と追加(例: FUSEサポート)されていて、今後更に便利になる可能性がある
  • キャッシュを含めたメモリ全体のイメージ保存ができる(設定でキャッシュ抜きにもできる)
欠点
  • 2007年10月時点では本家(kernel.org)のLinuxカーネルに含まれず、多くのディストリ付属カーネルでも使用されていないため、自分でカーネルを設定/ビルドする必要があることが多い
  • カーネルパッチでの提供のため、パッチの対象となっているカーネルバージョンでないと適用できず、使用できない
  • 動作が安定していることもあれば、不安定なこともある(最近は安定版であれば比較的安定している気はする)
  • パッケージが「パッチ」「UserUI」「スクリプト」と分かれていて、どのように導入/使用すればよいのか分かりにくい
  • ファイルへのイメージ保存をする場合に、少しではあるが作業が必要(どこのパーティションのどの場所から読み込むのかをあらかじめ調べ、指定しておかなくてはならない)

準備

  • Linuxカーネルのソースとビルドツールなどを用意した上でTuxOnIceのパッチをカーネルソースに適用しておく
  • UserUIとhibernate-scriptをインストールしておく(これらはディストリのパッケージになっていることもある)
  • メモリイメージをスワップパーティションに書き込む場合、通常のスワップとは別に、TuxOnIce用のスワップパーティションを用意しておくとよいかもしれない。分けなくても動作はする(確認済み)が、「メモリ容量+スワップとして使用する容量」が無いといけない
  • スワップパーティションが準備できない場合や、ディスク領域を効率よく使いたい場合など、メモリイメージをファイルに書き込む場合の準備は後述
必要なディスク領域について

ファイルでもスワップでも、メモリのサイズと同じ容量は必要。既存のスワップを使用するなら、上にも書いたように、スワップとして使用する分だけ余計に必要で、用意するのが難しい場合は、ファイルに書き込むようにする。
/usr/src/linux/Documentation/power/tuxonice.txtの「b. Storage.」の項目(英語)も参照。

パッチ当ての例

シンボリックリンク/usr/src/linuxLinux 2.6.23のソースディレクトリ(/usr/src/linux-2.6.23/など)を指していて、TuxOnIceの3.0-rc1パッチを適用するものとする。

# cd /usr/src/linux
# bzcat [tuxonice-3.0-rc1-for-2.6.23.patch.bz2の場所] | patch -p1   
patching file Documentation/power/tuxonice-internals.txt
patching file Documentation/power/tuxonice.txt
patching file MAINTAINERS
(中略)
patching file mm/vmscan.c
カーネル設定例

下はLinux 2.6.23/TuxOnIce 3.0-rc1の場合。デフォルトのメモリイメージパーティション(CONFIG_PM_STD_PARTITION)は環境に合わせて変更する。hibernate-scriptの設定で上書きもできる。ファイルに書き込む場合、特に指定しなくてもよい。

  • TuxOnIceの設定項目は任意。ファイルにメモリイメージを保存するのならスワップの代わりにCONFIG_TOI_FILEを有効にする。UserUIを使用する場合の場所(CONFIG_TOI_USERUI_DEFAULT_PATH)もディストリに合わせて修正。これもhibernate-scriptの設定で上書きできる。
  • CONFIG_TOI_REPLACE_SWSUSPは、古いswsusp方式の代わりとして使うためのもので、必須ではない。
  • CONFIG_TOI_KEEP_IMAGEは、ほとんどの場合、無効でよい。
  • 暗号アルゴリズムは、ここではAESを選択している。x86_64でない場合、CONFIG_CRYPTO_AESのほうをモジュールとしておく。
  • 圧縮アルゴリズム(LZF)は組み込み必須。
Power management options  --->
 [*] Power Management support                [CONFIG_PM]
 [*] Hibernation (aka 'suspend to disk')     [CONFIG_HIBERNATION]      
 (/dev/hda7) Default resume partition        [CONFIG_PM_STD_PARTITION]
 <*> Enhanced Hibernation (TuxOnIce)  --->
  < > File Allocator                         [CONFIG_TOI_FILE]
  <*> Swap Allocator                         [CONFIG_TOI_SWAP]
  <*> Compression support                    [CONFIG_TOI_CRYPTO]
  <*> Userspace User Interface support       [CONFIG_TOI_USERUI]
  (/sbin/tuxoniceui_fbsplash) Default userui program location
                                             [CONFIG_TOI_USERUI_DEFAULT_PATH]
  [ ] Allow Keep Image Mode                  [CONFIG_TOI_KEEP_IMAGE]
  [ ] Replace swsusp by default              [CONFIG_TOI_REPLACE_SWSUSP]
  [*] Checksum pageset2                      [CONFIG_TOI_CHECKSUM]
  (25)  Default waiting time for emergency boot messages
                                             [CONFIG_TOI_DEFAULT_WAIT]
 [*] ACPI Support (Advanced Configuration and Power Interface) Support  --->
                                             [CONFIG_ACPI]
Cryptographic API  --->
 < > AES cipher algorithms                   [CONFIG_CRYPTO_AES]
 <M> AES cipher algorithms (x86_64)          [CONFIG_CRYPTO_AES_X86_64]
 <*> LZF compression algorithm               [CONFIG_CRYPTO_LZF]

スワップへの書き込みを準備 + initrdに関する注意点

カーネル設定で書き込み先のデバイス名(CONFIG_PM_STD_PARTITION)を指定してあれば、設定ファイルやブートローダのメニューファイルでの指定は(「resume=」を含め)一切必要ない。
これが未指定だったり、別のデバイス名を指定したかったりする場合のみ、両ファイルで指定を行う。

ファイル名: /etc/hibernate/suspend2.conf

SuspendDevice swap:/dev/hda7

GRUBの設定ファイルは環境によって値の変わる部分が多いため、書き方の参考までに。後ろに「resume=swap:[デバイス名]」を追加する。
ファイル名: /boot/grub/menu.lst

title  Gentoo Linux TuxOnIce
root (hd0,4)
kernel /vmlinuz quiet root=/dev/hda6 video=uvesafb:1280x1024-32,mtrr:3,ywrap splash=silent,theme:livecd-2007.0 console=tty1 resume=swap:/dev/hda7
initrd /initrd-tuxonice-splash.gz
boot

上の例でuvesafbを使用しているのは、fbsplashのUserUIを使用するため(fbsplashのUserUIはカーネルフレームバッファ + fbcon上でないと動作しない)。また、initrdが書かれているが、これはsplashutilsとUserUIで使用しているもので、カーネルモジュールが含まれているものではなく、ディストリのカーネルパッケージに付属するカーネルモジュール入りのinitrdをそのまま使用してはならない。復帰処理を正常/安全に行うため、初期化スクリプトの修正が必要。

あたりを参照。

ファイルへの書き込みを準備

一度作成したイメージファイルの配置場所を変更(移動)する場合、一度それを消してから、下のように再作成後、設定し直すのが無難。
以下、例として、1GiBの/toi.imgにイメージを保存するものとする。環境と好みに合わせて場所とサイズは調整。

hibernate-scriptによる自動イメージ作成

CONFIG_TOI_FILEが有効になっているカーネルで起動しておく。

ファイル名: /etc/hibernate/suspend2.conf

# イメージファイルの場所と、MiB単位のサイズを指定
FilewriterLocation /toi.img 1024

「FilewriterLocation」の項目に書かれた場所にイメージファイルがあればこれを使用するが、無ければhibernate-scriptの実行時に自動的に作成してくれる(ハイバネーションは行われない)。

$ sudo /usr/sbin/hibernate
...
hibernate: Creating [指定されたサイズ] MB filewriter target.
ABORTING: resume is not setup correctly. Unless you have setup your bootloader
correctly, resuming will most likely fail. To correct this, add
"resume=file:/dev/hda6:0x104a0" to your kernel command line in your
LILO or GRUB configuration file and reboot.
hibernate: Aborting.

上の場合、ファイルが/dev/hda6上の0x104a0という場所にあるということを知らせてくれている。指示にあるように、「resume=file:/dev/...」の部分を手動で/boot/grub/menu.lstkernel行に追加し、必ず再起動を行う。また、「file:/dev/...」部分は、イメージの自動作成を行ったときに表示された値をコピペする(この記事に書かれている値をそのまま使用しない)点に注意。
下は例だが、スワップの説明と同様、書き方の参考までに。

ファイル名: /boot/grub/menu.lst

title  Gentoo Linux TuxOnIce
root (hd0,4)
kernel /vmlinuz quiet root=/dev/hda6 video=uvesafb:1280x1024-32,mtrr:3,ywrap splash=silent,theme:livecd-2007.0 console=tty1 resume=file:/dev/hda6:0x104a0
initrd /initrd-tuxonice-splash.gz
boot
手動でイメージを作成

CONFIG_TOI_FILEが有効なカーネルで起動し、以下の流れでイメージ作成と場所情報の取得を行う。「count=1024」の部分がイメージサイズ(MiB単位)となる。

# echo TuxOnIce > /toi.img
# dd if=/dev/zero bs=1M count=1024 >> /toi.img
# echo /toi.img > /sys/power/tuxonice/file/target
# cat /sys/power/tuxonice/resume

得られた「file:...」の値を「resume=file:...」として、/boot/grub/menu.lstへ書き込む。書き方は上の自動作成の場合と同じなので省略。

関連記事:

関連URL: http://www.tuxonice.net/ - 本家

使用したバージョン:

  • Linux 2.6.23
  • TuxOnIce 3.0-rc1
  • TuxOnIce-UserUI 0.7.2
  • hibernate-script 1.97(一部修正)

*1:2007年10月現在、本家サイトの情報は、全体的に情報が古めになってしまっている気がする。カーネル付属ドキュメント(/usr/src/linux/Documentation/power/tuxonice.txt)や、「hibernate」「hibernate.conf」のmanページなどのほうが新しい(いずれも英語)。