2009年10月6日火曜日

無線LANとacpiの連携

acpiの仕組みとかの続き、無線LAN編のメモ

eeepc用のパッケージ「acpi-eeepc-generic」に乗っかってみる。
たぶん、デフォルトでFn+F2キーで無線LANデバイスのオンオフが可能になっているはず。

無線LANの扱い方についての基本は以前のブログ
無線Lan(手動)
ネットワーク(半自動)
辺りのメモが参考になるかも?

以前から「rfkill」とは何ぞや?!と思っていたんだけれど、acpi-eeepc-generic内のスクリプトを覗き見ていて、初めてちょっと理解。無線デバイスの電源のオンオフを行えるモジュール(?)らしい。S101はこの仕組みが使えるようだ。

/sys/class/rfkill以下に、rfkill*ディレクトリがあり、その中に幾つかのファイルがある。nameの中にはそのデバイスの名前があり、rfkill0/nameはeeepc-wlan、rfkill1/nameはeeepc-bluetoothとなっている。そして、同じディレクトリ内のstateファイルには0か1の数字があって、これを変更することでそのデバイスの状態を変更できるらしい。

というわけで、節電術については、この仕組みを使って無線デバイスの電源のオンオフを出来るようにすると良い。そして、無線LANについては、この電源のオンオフに連動してネットにも繋がるようにすれば便利になる。

今までの知識と一緒にまとめると、無線LANデバイス起動の処理は、次の通り。

 rfkillスイッチを使って、無線LANデバイスの電源を入れる。
 (キーボードの上の無線ラン用表示ランプ点灯)
  ↓
 S101用無線LANドライバath9kのロード
  ↓
 ifconfigによるデバイスの準備
  ↓
 wpa_supplicantによる、回線の接続
  ↓
 dhcpdでのIP取得(もしくは、デバイスのルーティング)

無線LANデバイスの終了は、上の処理を逆順にすることになる。

この手続きを実際に行う手伝いをパッケージ「acpi-eeepc-generic」同梱のスクリプト/etc/acpi/eeepc/acpi-eeepc-generic-toggle-wifi.shが行ってくれる。現実には、このスクリプトの中から、/etc/acpi/acpi-eeepc-generic-functions.sh内の関数を呼び出している。

そこで、まず、/etc/conf.d/acpi-eeepc-generic.confのCOMMANDS_WIFI_TOGGLE変数の値にこのスクリプトを指定する。acpi-eeepc-generic-toggle-wifi.shは、引数を付けずに呼び出した場合、状態のトグルを行うことになる。そして、その内容は、電源が入っていなかった場合、電源を入れて、ドライバをロードし、ifconfigでデバイスの準備をしてくれるまで、逆に、デバイスが起動している状態だと、デバイスを終了させて、ドライバをアンロードし、電源を落としてくれる。

但し、acpi-eeepc-generic-functions.shで定義されているdevice_onの流れを見ると、ドライバをロードする前にifconfigでデバイスをupしようとしているので、このままでは、デバイスがいつもupしないような気がする。ただ、電源管理については、電源を切ってくれるかどうかが重要なだけなので、いつものように他の好きなツールで行うことが出来るので、仕組みさえ分かれば、これで十分。

ここで、/etc/conf.d/acpi-eeepc-generic.confには次の変数が用意されている。

COMMANDS_WIFI_PRE_UP
COMMANDS_WIFI_POST_UP
COMMANDS_WIFI_PRE_DOWN
COMMANDS_WIFI_POST_DOWN

これらの変数にコマンド文字列を定義しておくと、それぞれ、電源を入れる前、入れた後、電源を落とす前、落とした後に実行してくれる。

そこで、以前に紹介したプロファイルを使うnetcfgをここで呼び出す設定をうちではしてみた。こうすることで、Fn+F2を押すたびに、デバイスの電源の入る切るに連動して、自動でネットワークに接続してくれる。

COMMANDS_WIFI_POST_UP=("netcfg myprofile")
COMMANDS_WIFI_PRE_DOWN=("netcfg -d myprofile")

さて、S101の無線LANは、現在の最新のカーネルパッケージでは、ちゃんとネットワークに繋がるようになっているので、ここまでの設定をすることで、快適に無線LAN生活が可能っぽい。

最後に、補足として、やっているうちに気がついた点をメモ

・サスペンド
現在、サスペンドの方はpm-utilsを使っているけれど、スリープとレジーム時の設定をまだしていないので、レジームした時のLANの挙動がおかしくなる。ただ、Fn+F2で一旦切って、立ち上げなおせば、またちゃんと繋げることができる。
pm-utilsについても、電源管理メモとしてまとめる予定。

・netcfgのタイムアウト設定
netcfgで回線接続を行う時、timeoutの設定時間が短いと、1度認証に失敗するとそのまま回線接続も失敗してしまってnetcfgが終了してしまうことが多い。wpa_supplicant自体は何度かトライしてくれるので、少し長めの(20秒位?)timeout時間の設定を明示しておく方がよさげ。
一方で、この間に電源オンオフ操作をすると、またおかしなことになる、、この辺りの挙動は/var/log/messeges.logへのacpiからの出力をみれば、ちゃんとデバイス起動の操作が完了したとかわかるんだけど普段はわからないので、あんまり短期間にFn+F2をプチプチ押さないようにするw

・S101の無線デバイスランプ
このランプは、LANとブルートゥースが兼用になっていて、両方の電源が落ちている場合のみ、消灯し、どちらかでも電源が入っていると、点灯する。うちでは、ブルートゥース機器は使ってないので、常時電源を落としてあるので、点灯時は、LAN有効、消灯時、LAN無効となっている。

0 件のコメント:

コメントを投稿