最近いくつかのパソコンに openSUSE をインストールしていて、サスペンドから復帰した時に Wifi が使えなくなるマシンがあった。簡単な対処で解決できたのでメモしておく。ここの例は openSUSE 12.2 を工人舎の SH8KP12 に導入したもの(他の pm-utils を使う GNU/Linux ディストリビューションで応用可)。

この事例に出くわしてまず思い出したのは、Linux で ACPI のサスペンドが出来るようになったころのこと。当時はサスペンドのためのユーティリティなども用意されておらず、コマンドラインで # echo 3 > /proc/acpi/sleep などと打って状態を操作していた。これで正常にサスペンド/レジューム出来ない場合は、USB 関係のモジュールが問題を起こしていることが多く、サスペンド前にそれらをアンロードし、レジューム後にロードし直すところまでコマンドラインでやっていた。


今回の Wifi の問題も同じ方法で回避できるだろうと予想した。Wifi のドライバとして使われているカーネルモジュールの名称は、システムトレイに格納されている NetworkManager のアプレットで確認できる。工人舎 SH8 に内蔵の Wifi に対しては rt73usb というものが使われている。予想を確かめるためにまずはコマンドラインで # modprobe -r rt73usb と打って実行してからサスペンドし、レジューム後に # modprobe rt73usb としてみる。すると正常に無線 LAN に接続できた。

そして、これを自動化するための仕組みが今は用意されている。/etc/pm/sleep.d/ というディレクトリがそれで、ここにシェルスクリプトを置くと、サスペンド/レジュームする時に実行される。今回 SH8 にインストールした openSUSE ではこのディレクトリにすでに一つのスクリプトが置かれていたので、それを雛形にしてファイルを作った。

#!/bin/bash

. $PM_UTILS_LIBDIR/functions

case "$1" in
        hibernate|suspend)
                        modprobe -r rt73usb
                ;;
        thaw|resume)
                        modprobe rt73usb
                ;;
        *)
                ;;
esac

exit 0

これを root でファイル名 50wifi としてそこに保存し、# chmod +x 50wifi として実行権限を付ける。これで問題は解決したのであった。お手軽だね…。