into the void

ソフトウェアに関する雑多な調査日記

BeagleBoard-xm rev.CにUbuntu 12.04をいれて無線アクセスポイントにする

Androidでいろいろやってみるために使っていたBeagleBoardだが、無線アクセスポイントにしたり、ファイルサーバにしたりといったやりたいことに対して、Androidを使うメリットがほとんどないことに今更ながら気づいた。
ので、Androidはいったんやめて普通のLinuxを入れてみることにした。

Ubuntu Serverのインストール

ARM Soc用のLinux、Linaro Linuxが使ってみたかったけど、Pandaboard用しかないようなので、Ubuntuにした。
下記のサイトにUbuntu ServerのOMAP3用のプレインストールイメージがあるので、ダウンロードしてSDカードに書き込む。
https://wiki.ubuntu.com/ARM/OMAP
バージョンは最新の12.04にした。
SDカードへの書き込みは下記のコマンド。

gunzip -c ubuntu-12.04-preinstalled-server-armhf+.img.gz | sudo dd bs=1M of=/dev/
sync

SDカードをBeagleboardにさして起動するとすんなりUbuntuが立ち上がる。
最初にセットアップメニューが表示されるので、言語やロケーション、インストールする機能を選択する。日本語表示に関して不具合がでるのがいやだったので、言語はEnglishにしておいた。機能はsshサーバだけ入れておいた。あとは必要に応じてインストールすることにする。apt-getで手軽にインストールできるし。
ネットワークインタフェースも何もしなくても認識するので、sshで別のPCからアクセスできることを確認して初期設定完了。

ちなみに最初は手持ちのUSB無線LANの動作実績がある2.6系のカーネルが良くて、11.04のイメージをもってきてインストールしたんだけど、USBおよびUSB LANが認識されず断念した。どうも、xmのrev.A及びrev.Bとrev.Cでは、USBハブの初期化に必要な処理が異なるらしく、11.04のコードはそれに対応していない様子。カーネルソースにパッチをあてて再構築してみたが、こんどはインストール済みのモジュールとカーネルでシンボルのチェックサムが食い違いまくって、モジュールがロードできなくなるという事態に襲われたのでそこでやめた。プレインストールのイメージにビルドに使われているソースってほんとに2.6.38なのかと疑いたくなる。

無線アクセスポイントの設定

手持ちのGW-US54GXSを使ったがうまくいかなかった。カーネル3.0系では最初からzd1211rwドライバが入っていてこれがmasterモードにも対応しているらしいのですんなりいくかと思ったのに。
デバイスの認識まではできるが、hostapdをつかってアクセスポイントとして起動しようとすると、beacon送信系の関数でエラーがでて起動できない。
次にAndroid環境で使っていたVendor Driverをビルドして使ってみた。2.6用のパッチだと足りない部分がいくつかあったので、適当に修正してビルドとロードはできるようになったが、デバイスを認識してくれない。。。
これで一週間くらい消費してしまったので、しかたなくネットで調べて動作実績がありそうなBuffaloのWLI-UC-GNMを買ってきた。最近は、アクセスポイントとしてもつかえる無線子機がたくさん出てるんですね。
WLI-UC-GNMをさしたらすんなり認識。iwコマンドでAPにも対応していることも確認した後、hostapdでの軌道もできた。
ひとつはまったのが、有線とのブリッジ接続。なぜか下記のコマンドを実行した後じゃないとbrctl addifで失敗した。

/sbin/iw dev wlan0 set 4addr on

rc.localでひととおり設定するようにした。

echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/ifconfig eth0 0.0.0.0
/sbin/ifconfig wlan0 0.0.0.0
/sbin/brctl addbr br0
/sbin/brctl addif br0 eth0
/sbin/iw dev wlan0 set 4addr on
/sbin/brctl addif br0 wlan0
/sbin/ifconfig br0 up
/sbin/ifconfig br0 192.168.1.200 netmask 255.255.255.0
route add default gw 192.168.1.1
echo "nameserver 192.168.1.1" > /etc/resolv.conf
sleep 2
/usr/sbin/hostapd /etc/hostapd/hostapd.conf &

hostapd.confはこんな感じ

interface=wlan0
bridge=br0

driver=nl80211
ssid=
hw_mode=g
channel=6
wpa=3
wpa_passphrase=
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP