Unable to find swap-space signature

2008/08/10追記
この記事の内容はもはや古くなっている。
Ubuntu(Hardy)のサスペンドとハイバネート その2 改訂をあわせて参照すること。


http://d.hatena.ne.jp/tksmashiw/20080223の続き
手元のVostro1400で、Ubuntu(Hardy)でハイバネートすると表題のようなメッセージが表示され、復帰できない。その上swap領域が破壊されるのか、


# swapon sdaX
swapon: /dev/sdaX: Invalid argument
となり、新たにmkswapしないとswapパーティションを利用出来なくなる。参考:launchpadに立てられたバグ
別のマシンにインストールしたGutsyでも同じ現象が起こる。一方もう一台のマシンにインストールしたGutsyでは問題なく復帰できた。
前2者と後者では、前者がファイルシステムにLVMを使わずインストールしたのに対し、後者ではデフォルトの通りLVMを使用してインストールしたので、この辺が原因かと疑っているが、面倒なので検証していない。
この問題を回避するには、復帰時にgrubの編集機能で

resume=/dev/sdaX
resume=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
resume=LABEL=XXXXXX

のようなカーネルオプションをつけると良い。しかし毎回手動でつけるのは面倒なので、スクリプトを使ってハイバネーション時に/boot/grub/menu.lstを変換することにした。
まず、スワップパーテションにSWAPというラベルを付ける。


# []mkswap -L SWAP /dev/[]sdaX
次に以下の内容のファイル/etc/pm/sleep.d/95-grub-changemenu.shを作り、chmod a+x で実行可能にする。

#!/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
...省略

つづく・・・。