2009/10/16(金)UbuntuなmbookでNetworkManagerを使う

Ubuntu9.04なmbookで、無線をNetworkManagerで管理できるようになったのでそのメモです。


最初に
mbookはSDIO接続のsd8686という無線LANカードが入っています。これをUbuntuで使うためには以前書いた通りで、メーカーのサイトからファームウェアをダウンロードし、sd8686.bin、sd8686_helper.bin という名前にして /lib/firmware に置きます。

しかし、sd8686のドライバ本体であるlibertasの挙動がおかしいのかことあるごとにフリーズしてしまい、使い物になりません。iwconfigで手動設定すれば使えますし、最悪それでも構わないのですが、友人にmbookを自慢するときに無線の接続がコマンドだったりすると(少なくともnblogの中の人は)がっかりしてしまいます。

moblinで遊んでいるときに知った、Connection Managerのconnmanを使うことにより、無線もGUIで接続可能になりましたが、Ubuntu9.04のconnmanはバージョン0.4とまだ低いため、お世辞にも安定しているとは言えません。おまけに9.10ベータではそのconnmanですら使えなくなってしまいました。connmanの方は正式版でどうなるかまだわかりませんが、NetworkManagerはカーネル(に含まれているドライバ)依存っぽいのであいかわらずフリーズすると思われます。

ということで、自分では原因を突き止められないので、ひたすらgoogle先生にがんばってもらいなんとか解決できたのでまとめておきます。


ビルド環境の構築
結論から書くと、ドライバ(libertas)のSourceを変更して作り直す作業になります。ですので、まずはビルド環境を整えます。
$ sudo apt-get install build-essential kernel-package libncurses5-dev libqt3-mt-dev

$ sudo apt-get install linux-source-2.6.28
$ cd /usr/src
$ sudo tar xvjf linux-source-2.6.28.tar.bz2

$ cd linux-source-2.6.28
$ sudo cp /boot/config-2.6.28-15-generic .config
$ sudo make oldconfig
参考サイト
dogmap.jp - カーネル再構築のススメ

libertasを手直し
libertas-dev mailing listに流れていたsd8686 linux system hang when associating to access pointが解決方法なので一連の流れに目を通しておきます。そしてあとのほうで流れてきたpatchを当てます。差分はgitで当てるのですが、そんなに量があるわけではないので手作業でも大丈夫かと思います。
参考サイト
Design Recipe 別館 Blog - Git の使い方の基本の"き"

このままビルドするとエラーが出るので、それを直します。もっともnblogの中の人はプログラムも英語もよくわからないので適当に直しました。詳しい人が見て補完してくれると助かります。以下2ヶ所がpatchを当てた後に自分が直したところです。

1つ目:wext.cでlog構造体が定義されてないというエラーが出たのでコメントアウトします。
/usr/src/linux-source-2.6.28/drivers/net/wireless/libertas/wext.c

// priv->wstats.discard.code = le32_to_cpu(log.wepundecryptable);
// priv->wstats.discard.misc = le32_to_cpu(log.ackfailure);
2つ目:ヘッダーに依存するエラーが出るので頭の方に付け加えます。
/usr/src/linux-source-2.6.28/drivers/net/wireless/libertas/cmdresp.c

#include <asm/unaligned.h>

ビルドしてエラーがでなければ、/usr/src/linux-source-2.6.28/drivers/net/wireless/libertas 以下に各種koファイルが出来上がるので、それを組み込みます。
$ sudo make-kpkg clean
$ sudo make-kpkg --initrd --revision=test01 kernel_image kernel_headers
以前は./script以下をいじって、ドライバだけビルドした記憶があるのですが、構成が変わってしまったのかファイルが見当たりませんでした。今回はカーネルの設定も変更したので、カーネルごとビルドしましたが、ドライバが目的ならlibertas関連だけビルドすれば大丈夫だと思います。


ドライバの組み込み
無線がONになってる場合は、WLAN-BTボタンを押して、無線を切ってから組み込まれてるドライバをはずします。
$ sudo modprobe -r libertas_sdio libertas
/lib/modules/2.6.28-15-generic/kernel/drivers/net/wireless/libertas 以下にある現在のドライバをバックアップして、ビルドした libertas.ko と libertas_sdio.ko をコピーします。

WLAN-BTボタンを押して、dmesgやlsmodでドライバが組み込まれたか確認します。

NetworkManagerで無線の設定をして、固まらなければ成功です。Kernelイメージのバージョンアップがあるたびに libertas.ko と libertas_sdio.ko をコピーするのを忘れないようにします。



2.6.31なカーネルではまだ動作確認してないのですが、たぶん同じように修正できると思います。ここ1週間ほど、NetworkManagerで運用していますが、サスペンドからの復帰もこなしてくれるので、とても便利になりました。libertasを入れ替えているので、Wicdにしても固まることはありません。あと2週間ほどで9.10が出てしまいますが、とりあえず9.04での環境構築は終了といった感じです。