2009/11/13(金)Ubuntu9.10なmbookでサスペンド

たまにmbookとUbuntuをキーワードに検索してるのですが、サスペンド関係の話が目についたので、自分も少しかじってみたメモです。


初期の状態でサスペンドを行うとmbookはフリーズして失敗し、BIOSでSDIO Controllerをdisabledにするとサスペンドが成功することから、USB周りがあやしいと思っていました。無線LANのフリーズの時は苦労したので、今回もきついかな、と思いつつ検索してみるとなんてことはなく、SDカードをマウントしたままサスペンドするとフリーズしてしまうのは割と有名なbugでした。

解決方法は簡単で、サスペンド前にSDカードをアンマウントするだけです。もっともアンマウントし忘れると大変なので、サスペンドをしたら自動でアンマウントするようにします。

サスペンドに入る前

サスペンドは /usr/sbin/pm-suspend というコマンドで実行されるのですが、このファイルはスクリプトになっているので、編集してSDカードをアンマウントするようにします。
$ sudo vi /usr/sbin/pm-suspend
================

# SD card unmount
unmount /media/microsd

# The rule here? Simplicity.
export STASHNAME=pm-suspend
unmount /media/microsd が追加した行です。microsdの部分は人によって違うと思いますので注意してください。
【追記】pm-suspendは変更しないで、下述の00umountchvtにアンマウント処理を入れます

ビデオドライバ

次は復帰に関してなのですが、その前にnblogの中の人のmbookのビデオドライバについて説明しておきます。前回9.10のインストールときは、9.04用psbドライバを流用する方法を説明しましたが、今は9.10に対応したPPAを利用しています。9.10からはPPAの組み込みが簡単になりました。
$ sudo add-apt-repository ppa:kalon33/ppa
3Dは使わないので、最小限の4つだけ利用しています。
  • psb-kernel-headers
  • psb-kernel-source
  • psb-modules
  • xserver-xorg-video-psb


サスペンドからの復帰

話を戻してサスペンドからの復帰です。初期の状態ではサスペンドから復帰すると画面が崩れてしまう場合と、ブラックアウトになる場合があるようです。画面が崩れた場合は Ctrl+Alt+F1 で仮想端末に切り替えてから、Ctrl+Alt+F7 で復帰できます。

ブラックアウトになってしまった時は仮想端末を切り替える方法が使えないので、acpi-support の DOUBLE_CONSOLE_SWITCH=true についているコメントを外し、ブラックアウトが起こらないようにします。
$ sudo vi /etc/default/acpi-support
================

# Uncomment the next line to switch away from X and back again after resume.
# This is needed for some hardware, but should be unnecessary on most.
DOUBLE_CONSOLE_SWITCH=true

最後に画面の崩れ対策です。崩れないようにできればいいのですが、これはビデオドライバが原因のようです。psbドライバを組み込まないでサスペンドさせると、画面がまったく崩れません。

画面の崩れは Ctrl+Alt+F1 のあと Ctrl+Alt+F7 で復帰できるので、これを自動実行するスクリプトを作成します。/etc/pm/sleep.d に実行ファイルを置いておくとサスペンド時に実行されるので、00umountchvt というファイルを作成してパーミッションを755にしておきます。中身は以下の2行です。
chvt 1
chvt 7
chvtは仮想端末の切り替えを行うコマンドで、とりあえずこれで目的は果たせるのですが、これだとサスペンドに入るときと復帰時の2回実行されてしまうのでもう少し修正します。


検索していたら見つけた、サウンドドライバをサスペンドの復帰時に読み直すスクリプトらしいのですが流用させてもらいます。
【追記】SDカードのアンマウント処理を追加しました。
case "$1" in
        hibernate|suspend)
                [ -b /dev/mmcblk0p1 ] && umount /dev/mmcblk0p1
                ;;
        thaw|resume)
                chvt 1
                chvt 7
                ;;
        *) exit $NA
                ;;
esac


まとめ

以上で自分の場合はサスペンドがうまくいくようになりましたが、環境が違うと、この方法でうまくいくかわかりません。SDカードのマウントでフリーズする辺りは、早々に修正されそうな気もします。

ちなみにnblogの中の人は、まったくと言っていいほどサスペンドを使わないので、修正が来ても気づかないかもしれません。