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

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

Ubuntu Gutsy(7.10)でuswsusp + hibernate-scriptによるハイバネーションを行う

Ubuntu Linux(Debianも同様)では、TuxOnIceを使用するよりも、uswsusp方式のほうが楽で、簡単に導入できる。hibernate-scriptがこれに対応していることにより、一部設定が必要な部分もあるが、TuxOnIceによる休止をhibernate-scriptで実行するのと同じ感覚で休止できる(直接s2diskを実行してもOK)。もちろん、X Window System上での作業状態も保存される。
ただし、今回の実験では、ファイルへの書き込みと、休止時のグラフィカルな進行状況表示はうまくいかなかった。
(2009/1/15)Ubuntu Intrepid(8.10)の時点では、標準で用意されているシャットダウンメニューからの「ハイバネート」から休止/復帰ができていることを確認した(Sun xVM VirtualBox上)。これがうまく動作しない場合やhibernate-scriptで細かく(休止前や復帰後の)動作を制御したい場合にはここで扱っているuswsuspを使用することになる。

uswsusp(Userspace Software Suspend)について

その名の示す通り、ユーザ空間プログラムを使用して休止状態にするパッケージ。uswsusp自体は休止/復帰の支援を行うもので、カーネルは従来のswsuspの項目を有効にしてビルドされている必要がある。Linux 2.6.17と、それ以降のバージョンで使用できる。
swsuspのユーザ空間上の支援という形のためか、全体的には、TuxOnIceよりも使いやすく、欠点も少ないような印象がある。

利点
  • ユーザ空間プログラムを使用するため、カーネルへのパッチが必要なく、導入が楽
  • LZO(過去のバージョンではLZF)圧縮と暗号化、イメージのチェックといったTuxOnIceと同様の機能で休止/復帰プロセスを支援
  • ディスクとメモリの両方へのイメージ保存の組み合わせ(s2both)をサポート
  • イメージ保存は古い方式のためか、安定している
  • ユーザ空間のグラフィカルな進行状況表示(Splashy)を使用できる仕組みになっている
欠点
  • ディスクイメージ保持モードやFUSEサポートなど、TuxOnIceにしかない機能は使用できない
  • 色々な外部ライブラリを要求する
  • ページキャッシュ*1を含めてメモリ全体を保存するTuxOnIce*2と異なり、メモリのキャッシュが保存されない(swsuspの仕様?)

準備の流れ

せっかくUbuntuを使うので、わざと端末を使わない方向でやってみる。OSインストール直後の前提で、DebConfのUIの設定も含んでいる。もちろん、端末を起動して作業を行っても問題はない。

  1. 「システム - システム管理 - Synaptic パッケージ・マネージャ」を選択し、Synapticを起動
  2. 「検索」ボタンを押し、「hibernate」と入力、対象は「パッケージ名」で検索
  3. hibernate」の項目をダブルクリックしてチェック
  4. 同様に「uswsusp」と「splashy」をそれぞれパッケージ名検索してチェック、「splashy-themes」も入れる
  5. 「適用」ボタンでダウンロードとインストールを行う
  6. ダイアログに「利用可能なスワップ領域がありませんが、続行しますか?」とたけ出たらとりあえず進めておく(設定はされない?)
  7. Synapticを終了
  8. GNOMEパネルを右クリックし「パネルへ追加」で「アプリケーションの実行...」を追加
  9. 追加されたアイコンをクリックして「gksudo "gnome-terminal -x dpkg-reconfigure debconf"」と入れて実行し、キーボードの上下矢印キーで「Gnome」インターフェースを選択してEnter*3その先の質問はそのままEnter
  10. アプリ起動のアイコンから今度は「gksudo dpkg-reconfigure uswsusp」を実行し、uswsuspの設定に入る(設定後少し時間がかかる)
    • バイスノード: 空のまま
    • チェックサム確認: はい
    • 圧縮: はい
    • 早めに書き出し: はい
    • 推奨最大サイズ: そのまま(メモリとスワップのサイズや好みにより調整するのもよい)
    • ログのレベル,最大のログレベル: そのまま(好みで変更)
    • スワップ: UUIDではなく、「/dev/sda5」などのスワップバイス名に変更
    • 暗号化: いいえ(好みにより有効にし、暗号化の設定を行う)
    • スプラッシュ: はい
  11. 起動のアイコンから「gksudo gedit /etc/hibernate/hibernate.conf」を実行し、「TryMethod ususpend-disk.conf」を一番上に書き足す

(2008/4/24)スワップのUUID記述に関しては「uswsusp(ユーザ空間で動作する休止状態支援ツール)を使用してスワップパーティションの指定にUUIDを使用する」を参照。

休止の実行とラッパースクリプト

まずはhibernateをパスワード無しで実行できるようなsudoの設定が必要。「TuxOnIceの休止と復帰の実際(3.0-rc1の時点)」を参照。グループ名の部分は「%admin」に変更しておく。
(2007/10/24)実際の作業としては、アプリの実行から「gksudo "gnome-terminal -x visudo"」を実行し、

Cmnd_Alias HIBERNATE=/usr/sbin/hibernate
%admin ALL=NOPASSWD: HIBERNATE

の2行を追加し、Ctrl+XYEnterの順に押して上書き保存する。

次にラッパースクリプトを作り(内容は好みで修正)、これを実行するようなランチャをパネルなどに作成しておく。

[任意]ファイル名: ~/bin/hibernate-wrapper-gutsy

#! /bin/dash

HIBERNATE_OPT="--force"
VERSTYLE_OPEN="<span style='italic' weight='bold' foreground='darkred'>"
VERSTYLE_CLOSE="</span>"

if [ "$1" != "-f" ]; then
  zenity --question --title="休止状態の確認" --text "\
uswsusp:\t\t${VERSTYLE_OPEN}$(dpkg-query -W -f='${Version}\n' uswsusp)${VERSTYLE_CLOSE}
hibernate-script:\t${VERSTYLE_OPEN}$(dpkg-query -W -f='${Version}\n' hibernate)${VERSTYLE_CLOSE}

休止しますか?"
  if [ $? = 1 ]; then
    exit 1
  fi
fi

gksudo "/usr/sbin/hibernate ${HIBERNATE_OPT}"
numlockx off; numlockx on

確認ダイアログはこのようになる。

ファイルへの書き込みについて

uswsuspは、ファイルへのイメージ保存をサポートしている。手順*4通りに作業を行うことで、イメージの保存は、スワップへの書き込みと同様に進み、電源が切れるところまではいくのだが、現状では、復帰がうまくいかない。
もし、(スワップとして使用する容量 + 圧縮済みメモリイメージの容量を含めるのに)十分なサイズのスワップパーティションがあるのであればそれを使い、そうでなければ、既存のスワップパーティションをメモリイメージ保存専用にして、スワップ用途として「ファイル」のスワップを用いるという手段もあり、こちらのほうが作業が少なくて楽。
(2007/10/23)ファイルへの書き込みと復帰に成功したので修正

関連記事:

*1:http://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E6%96%B9%E5%BC%8F の「デマンドページング」を参照。http://www.tuxonice.net/features にはTuxOnIceのメモリイメージ保存方式についての記述がある

*2:設定により、キャッシュを保存しないこともできる

*3:パッケージの設定インターフェースが何故か端末になっているため、GUIにしておく

*4:ソースアーカイブに含まれるHOWTOを参照。この記事では扱わない