10月 242011
 

いやね。とあるタイミングで ports を csup したら KDE のバージョンが KDE-4.6.5 から KDE-4.7 系にアップデートしていたので「お。新しい KDE4 がリリースされたっ!!」とか思い portupgrade -arR しようかと思ったのだけど FreeBSD 自体も 9 系が CURRENT から RELENG_9 になったので、せっかくだから RELENG_8 から RELENG_9 にしてしまえーーっ!! ってことで、 NotePC にインストールされている FreeBSD を FreeBSD 9.0-RC1 にしてしまったのでありました。

バージョンアップしたのはデスクトップと NotePC の両方。で、今回の記事は ThinkPad X100e についてになります。

それにしてもこの NotePC、夏はてんでダメですな。温度が上がりすぎて勝手に shutdown が走ってしまう。裏を返すと正常に ACPI が動作している。とも言うんですが、Windows7 なんかは夏場の暑い時期だと起動後五分も持たずに shutdown、FreeBSD でも hw.acpi.thermal.tz0._PSV=80.0C とか設定入れて CPU クロックを落としたりするんだけど、自動 shutdown してしまう。メッセージを出力しつつ・・。orz。

熱い CPU っちゅーのはツライですなぁ・・。

と、言うことで本題の suspend/resume についてですが、以前、一回記事にしていますよね。そのとき試したのは RELENG_8 だったのだけど、今回は RELENG_9 でトライっ!! って感じ。で、見事に supend/resume してくれます。わーーいっ!!

そもそも ThinkPad X100e は無線 LAN カードに if_iwn を利用しているのですが、こいつがまた FreeBSD では動作しない・・。orz RELENG_8 では、以前は一時的に動作していたのに 2011/07/05 くらいに改修が入ってそれ以降は動作しなくなってしまった・・。RELENG_9 でも試したんだけどやっぱり動作しない。

しょーがないので僕の場合、無線 LAN は USB の if_run を利用していたのであります。が、こいつは suspend/resume の時に悪さすることが解りました。

suspend/resume するマシンの僕の環境は以下の通り

0. 僕の環境
・FreebBSD 9.0-RC 2011/10/19 10:00 頃に csup して来たものを利用
・Xorg-7.5.1 + dri-7.6.1,2 + xf86-video-ati-6.14.2
・KDE-4.7.2 しかし、なぜだか解りませんがデスクトップ効果が有効になりません・・。orz

では、実際に suspend/resume する時の手順を以下に書いてみましょう。

1. Xorg の画面を抜ける
X が起動していてその上で動作している端末上で acpiconf -s3 や KDE4 の[スリープ]を押しただけだと suspend はしますが resume してくれません。X を起動している人は Ctrl+Alt+F1 などでいったん X を抜けてコンソールの画面を表示させます。

なお、sysctl にはこれを自動でやってくれる hw.syscons.sc_no_suspend_vtswitch という MIB があるのですが、これが有効になってないんですよねぇ・・。なので手動で X を抜けます。

2. とりあえず無線 LAN の利用を停止する
僕の場合は run0 で認識している USB NIC を引っこ抜きました。その後で acpiconf-s3 とたたきました。すると suspend してくれます。その後、フタを閉じて開くと PC と言うか OS が目覚めるのでリターンキーを 2,3 発叩きます。するとコンソールが現れると思います。sync 連打して無事を確認します。おーー。 resume しましたねぇー。パチパチパチ。

ここで run0 で認識する USB NIC を接続すると無線 LAN が利用できるようになります。後は Ctrl+Alt+F2|3|4 などを押して X を表示させれば無事に X の画面が表示してくれると思います。

RELENG_8 の頃はコンソールのプロンプトが返ってきても X の再表示ができなくて drm.ko が暴走していたんだけど、 RELENG_9 ではそんなことは無いようです。それが大きな違いでしょうかね。

3. USB NIC は実はくせ者?
さてさて、上記 2. で suspend/resume が利用できるようになりました。もう一回、上記の手順で suspnd/resume すんべかと思い試してみると・・。あいや。orz resume は一回限り有効で、二回目の resume ではコンソールが凍り付きますね。

この場合は、無線 LAN の利用をきっぱりとあきらめましょう。一回目の suspend 前に X の画面を抜けた後、USB NIC を引っこ抜きます。その後で if_run を kldunload します。これがミソです。

有線 NIC を利用する場合、つまり if_re を利用している限りでは何回も suspend/resume してくれます(僕が試したのは連続四回ですが;-)。

そう考えると usb か、 if_run のどちらかに問題があるような気がしないでもないですが、今の段階ではカーネルがそれらしいログを出力してくれないのでちょっとまだ原因がわかりません。また、if_run 以外の 無線 LAN ドライバではどうなのか?もちょっと解りません。

もし if_iwn が動作したとしたら、それは多分 PCI バスに接続されているので、なんか動作しそうな感じはしないでもないんですけどねぇ。

以上は、僕が持っている ThinkPad X100e で RELENG_9 な FreeBSD を走らせたときの suspend/resume の動作になります。
けども RELENG_9 も生ものなので今日動いたものは明日は動かないかもしれない部分も多々あるので、今の環境を保持しておいたほうが良いのかなぁ?

どっちにしても FreeBSD において supend/resume したのは実に CASIO FIVA MPC-206 以来の快挙なのであります。嬉しいですなぁ;-)。わーーいっ!!

後はデスクトップ機で suspend/resume してくれるとすんげー嬉しいんですけどね;-)。