Gentoo Linux上のTuxOnIceでUUID指定による休止を試すが...
「Gentoo Linux上のuswsuspについての覚え書き(復帰デバイス名を直接指定する方法)」と同じ要領でTuxOnIceのやり方に合わせてスワップファイルへの休止を試したのだが、復帰がうまくいかない。
(2008/5/7)色々試した末、うまく動作するようになった。詳細は後ろの追記を参照。
その際に行った作業を下にまとめておく。
準備
「Gentoo Linux上のuswsuspについての覚え書き(復帰デバイス名を直接指定する方法)」で書いたパッチにTuxOnIce上でUUID指定をするための(initrd内のスクリプトに対する)修正が含まれている。これを適用しておく前提で以下の作業をする。ファイルシステムの作成からスワップファイル有効化まで
流れは同じなので、作業例(パーティションに/dev/hda7を使用した場合)のみ。ここで作成したのは「Linux上で休止状態を実現するTuxOnIceの概要と準備(3.0-rc1の時点)」で作成したTuxOnIce用のファイルではなく、スワップをファイルとしてファイルシステム上に作成したもの。*1
$ sudo mkfs.ext3 -m 0 -L swap -T largefile4 /dev/hda7 $ sudo mkdir /media/swap $ sudo mount -t ext3 /dev/hda7 /media/swap $ sudo dd if=/dev/zero of=/media/swap/swap.dat bs=1G count=[大きな値] dd: writing `/media/swap/swap.dat': デバイスに空き領域がありません (出力以下略・最大サイズのファイル容量を割り当てた後自動的に終了) $ sudo mkswap /media/swap/swap.dat $ sudo swapon /media/swap/swap.dat
パーティションとスワップファイルを自動的に使用する設定
これも同様。ファイル名: /etc/fstab
UUID=[スワップを作成したパーティションのUUID] /media/swap ext3 noatime 0 1 /media/swap/swap.dat none swap sw 0 0
パーティション内の場所を取得
スワップを有効化(swapon)した後で実行する。$ cat /sys/power/tuxonice/swap/headerlocations For swapfile `/media/swap/swap.dat`, use resume=swap:/dev/hda7:0x206f0.
今回得られた数字は「0x206f0」だった。
hibernate-scriptの設定ファイルでのUUID指定
上でパーティション内の場所が「0x206f0」と出た場合は下のようになる(実際に出た値に合わせる)。ファイル名: /etc/hibernate/suspend2.conf
SuspendDevice swap:/dev/disk/by-uuid/[スワップを作成したパーティションのUUID]:0x206f0
カーネル引数(GRUBの設定)
理由はよく分からないが、起動時のカーネルの引数に「real_resume」指定をすると、休止しようとしても/usr/share/hibernate/scriptlets.d/suspend2: line 562: echo: write error: デバイスもしくはリソースがビジー状態です
で失敗する。この部分で実行されるコマンドは
echo > /sys/power/tuxonice/do_hibernate
となっていて、手動でこれを実行してもこのエラーになっている。
そこで、起動時にはreal_resumeを付けすに起動し、復帰時にのみ付けることにした。
ファイル名: /boot/grub/menu.lst
title Gentoo Linux root (hd0,4) kernel /kernel quiet root=UUID=[「/」パーティションのUUID] video=uvesafb:1280x1024-32,mtrr:3,ywrap maxvf:60 splash=silent,theme:livecd-2007.0 console=tty1 noexec=off initrd /initrd.cpio.gz boot
ファイル名: /boot/grub/menu-suspended.lst
title Gentoo Linux root (hd0,4) kernel /kernel quiet root=UUID=[「/」パーティションのUUID] video=uvesafb:1280x1024-32,mtrr:3,ywrap maxvf:60 splash=silent,theme:livecd-2007.0 console=tty1 noexec=off real_resume=swap:UUID=[スワップファイルを含むパーティションのUUID]:0x206f0 initrd /initrd.cpio.gz boot
real_resumeの値をこのような書式で渡したときに/sys/power/tuxonice/resumeには「swap:/dev/hda7:0x206f0」のような書式で入るような処理をパッチの中で追加している。
テスト
休止は正常に行われたが、復帰に失敗して通常起動してしまう。その後のカーネルのメッセージを見ると$ dmesg (中略) TuxOnIce: Detected TuxOnIce binary signature. Can't start a cycle when actions are already running. (以下略)
このようなメッセージが出ていて、書き込んだ領域自体はうまく見つけられているように見えるのだが、処理がうまく進まなかったようだ。
復帰先のデバイス名は正常に名前解決(UUIDからデバイス名を得る処理)されて、書式も正常だった。
$ cat /sys/power/tuxonice/resume swap:/dev/hda7:0x206f0
この状態でもうまくいかなかったため、今回はここで断念することに。
パッチの修正とまとめ
(2008/5/7)Can't start a cycle when actions are already running.
のメッセージが出て書き込み先*2が「ビジー状態」になってしまうのは、initrd内の/etc/initrd.scriptsのswsusp_resume()関数の中で旧swsuspによる復帰をを試行しているのが原因のようだった。/linuxrcの中のこの関数の呼び出し部分をコメントアウトしたところ、休止も復帰も正常に行えた。
アップロードしたパッチは修正済みのものに入れ替えた。
Gentoo上のTuxOnIceで休止/復帰の領域をUUIDで指定するのに必要な作業をまとめると
- 修正済みパッチを当てたgenkernelでinitrdを作成
- スワップパーティションを使用したい場合、そのままでは復帰時にパーティションが見えない(?)ため、スワップの代わりにファイルシステムを作成し、その中にスワップのファイルを作成(ddでサイズ確保後mkswapで初期化)してから、このパーティションとスワップファイルを自動で使用するように/etc/fstabを編集
- swaponでスワップを有効化後/sys/power/tuxonice/swap/headerlocationsの最後に書かれている「0x」で始まる文字列を控える
- GRUBの設定ファイル*3中のkernel行には「real_resume=swap:UUID=[スワップファイルを作成したパーティションのUUID]:[控えた「0x」で始まる文字列]」を追加、initrd行には、genkernelの作成したinitrdを指定
- hibernate-scriptのTuxOnIce固有の設定ファイル/etc/hibernate/suspend2.confでは、「SuspendDevice swap:/dev/disk/by-uuid/[スワップファイルを作成したパーティションのUUID]:[控えた「0x」で始まる文字列]]」を記述
- 以上の準備ができたら再起動した後、休止/復帰のテストを行う
となる。
使用したバージョン: