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

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

hibernate-scriptの設定ファイルと、GRUB設定の入れ替え機能について

hibernate-scriptの設定ファイル

hibernate-scriptが実行時に直接使用するのは/etc/hibernate/hibernate.conf
デフォルトでは、その内容が

TryMethod suspend2.conf
TryMethod disk.conf
TryMethod ram.conf

となっていて、ここに書かれている、方式ごとのファイルを参照する形になっているため、TuxOnIce以外の方式の例として、uswsusp方式でディスクに書き込むようにしたいのであれば、

TryMethod ususpend-disk.conf

の記述を一番上に書くか、あるいは、hibernate-F(--config-file)オプションを使用して直接

$ sudo /usr/sbin/hibernate -F /etc/hibernate/ususpend-disk.conf

のようにする。
/etc/hibernate/common.confは、方式固有でない共通設定ファイル。/etc/hibernate/suspend2.confではTuxOnIce固有の設定が書かれている。ファイル名(suspend2.conf)は、Suspend2からTuxOnIceへの名称変更により、今後変更される可能性もある。
具体的な設定項目名とその説明は、

$ man hibernate.conf

で見られる(英語)が、設定項目数はかなり多い。

動作の流れと休止/復帰プロセスにおけるカスタムコマンドの実行方法について

ログファイル/var/log/hibernate.logを見ても分かるが、

  • 休止時には、必要に応じてデーモンを停止させたり、デバイスドライバカーネルモジュールを削除したり、マウント解除を行ったりなど、休止状態に入るための準備が、段階を経て進められる
  • その段階は01(システム動作中の状態)から99(休止の実行)まであり、休止をするときには01から99へ、復帰時には逆に99から01へ向かう

どの段階で何が行われるのかは、hibernate-scriptにより決められていて、基本的には、適切な順番で進んでいくのだが、自分で、この中の任意の段階番号を指定して、自由にコマンドを実行することもできる。

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

# 休止段階で任意のコマンドを実行
OnSuspend [番号] [コマンド行]
# 復帰段階で任意のコマンドを実行
OnResume [番号] [コマンド行]

GRUBの設定ファイル入れ替え機能について

休止状態からの復帰をするためには、休止を行ったときと同じカーネルとそのコマンドラインで起動し、更に、デフォルトのスワップパーティションを使用する場合を除いて、そのコマンドラインには、メモリイメージの正確な場所が「resume=」オプションとして指定されている必要がある。*1
新しいカーネルと別の(安定したバージョンなどの)カーネルといった具合に/boot/grub/menu.lstに複数のカーネルが書かれている場合、復帰時のメニューで、誤って休止したときと別なカーネルを選んでしまうと、正常に復帰は行われない。また、別のOSが起動できるように構成してある場合も、そちらを起動させてしまうことのないようにしたほうがよい場合がある。*2
hibernate-scriptには、GRUBのメニューリストファイルを休止の途中で別のリストファイルに入れ替え、次回起動後に元のファイルに戻すという機能がある。これをうまく使うことで、次回起動時、(一時的に)休止したときのカーネル以外から起動できないようにすることができる。

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

ChangeGrubMenu yes
GrubMenuFile /boot/grub/menu.lst
AlternateGrubMenuFile /boot/grub/menu-suspended.lst
BackupGrubMenuFile /boot/grub/menu.lst.hibernate.bak

上の例では、通常のメニューファイル/boot/grub/menu.lstと、入れ替えるメニューファイル/boot/grub/menu-suspended.lstを用意して、自動的に入れ替えを行ってくれる。/boot/grub/menu-suspended.lstの内容は、/boot/grub/menu.lst元にして、「TuxOnIceのカーネル」以外の項目(title行からboot行までのひとまとまり)を削除した内容とする。更に、
ファイル名: /boot/grub/menu.lst

splashimage (hd0,4)/grub/splash.xpm.gz

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

splashimage (hd0,4)/grub/splash-tuxonice.xpm.gz

通常起動時と休止後の起動時とで別々の背景画像を用意し、復帰時に表示されるメニューの背景を変えるのも、好みによって行っておくとよいかもしれない。上の設定は例なので、画像のあるパーティションやファイル名は環境に合わせる。
「BackupGrubMenuFile」というのは、オリジナルのメニューファイルのバックアップファイルとなる名前で、この名前のファイルを用意するわけではない。休止/復帰がうまくいかなかった場合、メニューファイルは置き換えられっ放しになることがあるので、後でこのファイルを/boot/grub/menu.lstとして戻す。
(2008/5/18)GRUB 2では、ファイル入れ替え機能を使用すること自体に影響はないが、使用される設定ファイルは変わるため、ファイル名を修正する必要がある。
ファイル名: /etc/hibernate/common.conf

ChangeGrubMenu yes
GrubMenuFile /boot/grub/grub.cfg
AlternateGrubMenuFile /boot/grub/grub-suspended.cfg
BackupGrubMenuFile /boot/grub/grub.cfg.hibernate.bak


GRUB 1の背景画像の作り方は、色々なところに載っているが

  • サイズは640x480
  • 色数は14色
  • 形式はxpmで、gzip圧縮しておく(.xpm.gz)

にする。ImageMagickconvertコマンドで変換する方法が有名。
下の例は、縦横比4:3の画像image.jpgをリサイズ・減色して/boot/grub/splash.xpm.gzとして保存するまでの流れ。

$ convert -resize 640x480 -colors 14 img.jpg - | gzip -9 > splash.xpm.gz
$ sudo mv -i splash.xpm /boot/grub/

関連記事:

*1:カーネル設定でスワップ書き込みを有効にして、かつデフォルトの書き込み先として、書き出したいスワップパーティションのデバイス名を指定した場合において、そのデフォルトのパーティションに書き出す場合のみ、カーネルコマンド行から「resume=」を省略できる

*2:GNU/Linuxと別のOSとで共通して読み書きをサポートしているパーティションがあるとまずい。Linuxの休止中に別のOSを動かしたい場合、休止処理の途中で、該当パーティションのマウント解除をするとよい。これはhibernate-scriptの設定ファイルでできる