Unable to find swap-space signature
2008/08/10追記
この記事の内容はもはや古くなっている。
Ubuntu(Hardy)のサスペンドとハイバネート その2 改訂をあわせて参照すること。
http://d.hatena.ne.jp/tksmashiw/20080223の続き
手元のVostro1400で、Ubuntu(Hardy)でハイバネートすると表題のようなメッセージが表示され、復帰できない。その上swap領域が破壊されるのか、
となり、新たにmkswapしないとswapパーティションを利用出来なくなる。参考:launchpadに立てられたバグ
# swapon sdaX
swapon: /dev/sdaX: Invalid argument
別のマシンにインストールしたGutsyでも同じ現象が起こる。一方もう一台のマシンにインストールしたGutsyでは問題なく復帰できた。
前2者と後者では、前者がファイルシステムにLVMを使わずインストールしたのに対し、後者ではデフォルトの通りLVMを使用してインストールしたので、この辺が原因かと疑っているが、面倒なので検証していない。
この問題を回避するには、復帰時にgrubの編集機能で
resume=/dev/sdaX
resume=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
resume=LABEL=XXXXXX
のようなカーネルオプションをつけると良い。しかし毎回手動でつけるのは面倒なので、スクリプトを使ってハイバネーション時に/boot/grub/menu.lstを変換することにした。
まず、スワップパーテションにSWAPというラベルを付ける。
次に以下の内容のファイル/etc/pm/sleep.d/95-grub-changemenu.shを作り、chmod a+x で実行可能にする。
# []mkswap -L SWAP /dev/[]sdaX
#!/bin/bash . /usr/lib/pm-utils/functions TARGET="/boot/grub/menu.lst"; grub_modify() { UNAME_R=$(uname -r) test -w $TARGET || return 1; local -i gdefault=0; local ttl rest; grep '^title' $TARGET | while read ttl rest ; do if [ -z "$(echo $rest |fgrep $UNAME_R)" ] ; then gdefault=$gdefault+1; else sed -i~ -r "\ s/^(default\s+)[[:digit:]]/\1${gdefault}/;\ s/^(timeout\s+)5/\11/;\ s/^#\s*(hiddenmenu)/\1/;\ s/^(\s*kernel.*\/vmlinuz-${UNAME_R}.*)/\1\ resume=LABEL=SWAP/;\ " $TARGET; return 0 ; fi done return 1 ; } grub_resume() { cp -a ${TARGET}~ $TARGET ; return 0 ; } case "$1" in hibernate) grub_modify; ;; thaw) grub_resume; ;; *) ;; esac exit $?
何このスパゲッティ!って感じだが、やっていることは、
- 引数がhibernateなら
- 引数がthawなら
- バックアップmenu.lst~をmenu.lstに上書きして戻す。
である。
このスクリプトがうまく動くかは
で確かめる。
# []/etc/pm/sleep.d/95-grub-changemenu.sh hibernate[]
# []less /boot/grub/menu.lst[]
最後に/etc/fstabのswapの行を修正しておく。
...省略 LABEL=SWAP swap swap defaults 0 0 ...省略