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

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

TuxOnIceの休止と復帰の実際(3.0-rc1の時点)

  1. hibernate-scriptを使用した休止の実行
    1. 実行方法
    2. sudoコマンドでパスワードを入力せずにスクリプトを実行する設定
    3. カスタムラッパースクリプトの例
    4. NVIDIAモジュールの削除に失敗して止まる
  2. 復帰

hibernate-scriptを使用した休止の実行

hibernate-scriptは、TuxOnIceだけでなく、他のハイバネーション方式(古いsysfs方式と、ユーザ空間で動作するuswsusp)にも対応した休止/復帰サポートスクリプトで、休止前と復帰後に行う必要のある様々な処理を自動で行ってくれる(ある程度の設定は必要だが、この記事では扱わない)。
X Window System上での作業の保存に関する補助やスクリーンセーバでのロックなど、便利な機能も提供している。
設定ファイルを用いて、環境に合わせた柔軟なカスタマイズを行うことも可能。モジュールやデーモンの制御などもできる。
完全に望みの挙動にするためには、環境により、hibernate-scriptの設定ファイルやカーネル設定の調整と試行錯誤がある程度必要かもしれない。

実行方法

$ sudo /usr/sbin/hibernate
あるいは
# /usr/sbin/hibernate

を実行するのみ。
Gentoo Linuxでは、保存されたイメージの処理を自動で行うようにするため

$ sudo rc-update add hibernate-cleanup boot

を事前に(一度だけ)実行しておく。
TuxOnIce方式限定の機能として、--reboot=1オプションを付けることで、イメージ書き込み後、電源断する代わりに再起動をすることができる。hibernate-scriptの動作テストをするのに有用。

sudoコマンドでパスワードを入力せずにスクリプトを実行する設定
下の例では、wheelグループに対して、スクリプトの管理者権限での実行を許可している。「%wheel」の部分をユーザ名にすると、ユーザ単位での指定ができる。管理者権限でvisudoを実行して、以下の設定をする。

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

カスタムラッパースクリプトの例
hibernate-script自体、色々な機能があるのだが、デスクトップ環境を使用している場合など、休止前と復帰後に何かの処理をさせたいこともある。例えば、nvclockGPUのクロック調整をしている場合、復帰時に定格に戻ってしまうため、これを再設定するようにする。GPUクロック値の「150」は、好みによって書き換える。*1
numlockxは、NumLockのLEDが復帰後に消えてしまうのを防ぐために実行している。
[任意]ファイル名: ~/bin/hibernate-wrapper

#! /bin/dash

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

if [ "$1" != "-f" ]; then
  zenity --question --title="休止状態の確認" --text "\
TuxOnIce core:\t\t${VERSTYLE_OPEN}$(cat /sys/power/tuxonice/version)${VERSTYLE_CLOSE}
TuxOnIce UserUI:\t${VERSTYLE_OPEN}$(${USERUIDIR}/tuxoniceui_text -h 2>&1 | tail -n 1 | cut -d ' ' -f 4)${VERSTYLE_CLOSE}
hibernate-script:\t${VERSTYLE_OPEN}$(${HIBERNATEDIR}/hibernate --version | cut -d ' ' -f 3)${VERSTYLE_CLOSE}

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

sudo /usr/sbin/hibernate ${HIBERNATE_OPT}
nvclock -n 150
numlockx off; numlockx on

その他、好みにより、行う処理を調整。
上のスクリプトは、sudoをパスワード無しで実行できる設定が済んでいる前提で、-fオプションを付けたときを除いてzenityによる確認ダイアログが出るようにしている(引数解析は手抜き)。

ダイアログの中にはバージョン情報を表示しているが、そのテキストのスタイルはPangoのマニュアルの「Pango Text Attribute Markup Language」(英語)を参考にしている。

NVIDIAモジュールの削除に失敗して止まる
NVIDIAモジュールは、「休止時に削除しないと問題の起こるモジュール」のリストに入っていて、
ファイル名: /etc/hibernate/common.conf

UnloadBlacklistedModules yes

が書かれていると、アンロードに失敗して休止処理が中断される。しかし、少なくとも手元のGeForce 7300 LEではアンロードされないことによる問題は起こらないため、/etc/hibernate/blacklisted-modulesから「nvidia」を消すか、下のように

$ sudo /usr/sbin/hibernate --force

中断しないように実行するかのどちらか。なお、同GPUでは、vbetoolも必要なく、使用するとフレームバッファコンソール(fbcon)の表示が乱れるだけだった。

復帰

次回起動時、前回と同じカーネルを同じパラメータを渡して起動する(ブートローダメニューで前回と同じものを選択する)と、自動的にイメージが読み込まれ、hibernate-scriptが復帰処理を行ってくれる。メモリイメージはこのときに無効化される。
事情により、復帰をせずに通常起動させたい場合には、カーネルコマンドラインを修正し、「noresume」(3.0-rc1の時点では「noresume2」ではない)を追加する。
GRUBの場合、まずメニューが出ずにカウントダウンする場合Escでメニューを表示させ、次に一覧から該当カーネルの項目を選択してeを押す。その後、kernel行を選択した状態でeを押し、カーネルコマンドラインの編集に入り、後ろに「noresume」を付けてEnterし、その後bで起動させる。

*1:メモリクロック値も変更できるカードの場合、-mオプションも指定するとよい