いささか鮮度の落ちたネタではある。無線LANやルータの勉強のためにFONのハードウェアLa Fonera+を購入した。La Foneraは、搭載されているフラッシュメモリをDD-WRTやOpenWRTといったオープンソースの組み込みLinuxに書き換えて動作させることができる。ただ、初代のLa Foneraは2006年に発売されて以来、さんざんハックされつくされた感がある。そこで、今回はまだ事例のないLa Fonera+にオープンソースの無線LANルータOSDD-WRTの最新安定版V24-sp1を組み込んでみた。
La Fonera+は電源を入れるとRedBootというイニシャルブートローダが最初に起動する。改造に当たってはこのRedBootを使ってフラッシュメモリーの内容を書き換える必要がある。RedBootのモードに入る方法は2とおりある。起動して2秒以内に次のいずれかの方法でCtrl+Cを受信するとLa Fonera+はRedBootプロンプトの状態になる。
この方法は本体のハードウェアに手を出さずに済む。工場出荷時の設定では、telnetのIPアドレスは192.168.1.1、ポートは9000なので電源を入れた直後にコンソールから次のコマンドを打てばよい。
telnet 192.168.1.1 9000と打つと次の例(Windows標準添付コンソール使用)ようにRedBootに入れる。だが、この「起動して2秒以内」のタイミングがなかなかつかみづらい。RedBootに入れないでそのまま本体のLinuxがブートしてしまうことが多い。使用しているPCがMacやBSD系Linuxの場合、telnetでCtrl+Cが送れない。この場合は次のコマンドでできるらしいが試してはいない。
echo -e "\0377\0364\0377\0375\0006" >break.bin; sudo nc -vvv 192.168.1.1 9000 < break.bin; telnet 192.168.1.1 9000
簡単な工作が必要だ。まず本体の裏2箇所にあるゴム足をはがし、下に隠れているネジをはずす。
このネジはヘクスローブと呼ばれる6角形の星型をしたネジで、T-8番という大きさが合う。
嵌め合いになっているわけではなく、そっと白い上蓋を持ち上げるだけで外れる。
次の図の丸印の場所(基板にJP1とシルク印刷してある)にある4ピンのピンヘッダーがシリアルポートだ。関係はないが、未実装のUSB周りの回路や1個のLED(基盤にはLED4とシルク印刷)など基板パターンが見られる。
シリアルポートは、Ethernetコネクタに遠い方から順番に次の通り。このうちVCC(+3.3V)は使用しない。
| ピン番号 | 1 | 2 | 3 | 4 |
| 名称 | GND | RxD | TxD | VCC |
この3本の線を使ってPCと接続すればよいのだが注意点がある。
トランジスタやツエナーダイオードなどを使って回路を組めば安価にこのRS232CとTTLの電圧変換をすることができるが、今回は手持ちでUSB-シリアル変換基板(ストロベリーリナックス社FT232RX)があったのでこれを利用させてもらった。シリアルコンソールの設定は工場出荷時で9600bps/8ビット/1ストップビット/パリティーなしである。
電源を入れシリアルコンソール(今回はTeraTermを使わせていただいた)に== Executing boot script in 2.000 seconds - enter ^C to abortと表示されたところでCtrl+Cを押すとRedBootに入る。
このようにしてひとたびResBootのモードに入れば、起動時のタイムアウト時間(2秒)やブート時のIPアドレス、シリアルコンソールのボーレート、telnetポートなどといったRedBootのパラメータが変更できる。RedBootのパラメータを確認するにはfconfig -l -nと打つ。
RedBoot> fconfig -l -nboot_script: trueboot_script_data:.. fis load -b 0x80100000 loader.. go 0x80100000 boot_script_timeout: 2bootp: falsebootp_my_gateway_ip: 0.0.0.0bootp_my_ip: 192.168.1.1bootp_my_ip_mask: 255.255.255.0bootp_server_ip: 192.168.1.254console_baud_rate: 9600gdb_port: 9000info_console_force: falsenet_debug: falseRedBoot>La Fonera+はひとまずこのままにしておいて、La FoneraのフラッシュをDD-WRTに入れ替える準備を進める。RedBootは書き換えるフラッシュのイメージを別のマシン上のTFTPサーバからダウンロードする。なのでまずは、このTFTPサーバを設置する必要がある。今回は簡単に済ませるためにPoor TFTP Server を使わせていただいた。TFTPサーバを設置するPCのIPアドレスは192.168.1.7とした。
DD-WRT V24-sp1のイメージlinux.bin(約6.1MB)をDD-WRTからダウンロードし、先に設置したTFTPサーバからダウンロードできる場所に配備する。Poor TFTP Server の場合、exeと同じフォルダにlinux.binを置けばよい。
http://www.dd-wrt.com/dd-wrtv2/downloads/v24-sp1/Consumer/Fon/Fonera/linux.bin
これでフラッシュ書き換えの準備ができた。RedBootに戻って次のようにコマンドを入力する。自分のIPアドレス、TFTPサーバーのIPアドレスを設定する。今回の場合それぞれ、192.168.1.1と192.168.1.7である。
RedBoot> ip_address -l 192.168.1.1/24 -h 192.168.1.7IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0Default server: 192.168.1.7RedBoot>フラッシュの初期化。
RedBoot> fis initAbout to initialize [format] FLASH image system - continue (y/n)? y*** Initialize FLASH Image System... Erase from 0xa87e0000-0xa87f0000: .... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .RedBoot>TFTPからイメージを読み込む。
RedBoot> load -r -v -b 0x80041000 linux.binUsing default protocol (TFTP)|Raw file loaded 0x80041000-0x80662fff, assumed entry at 0x80041000RedBoot>フラッシュへ書き込む(30分ぐらいかかるので気長に待つ)
RedBoot> fis create linux... Erase from 0xa8030000-0xa8652000: ...................................................................................................... Program from 0x80041000-0x80663000 at 0xa8030000: ...................................................................................................... Erase from 0xa87e0000-0xa87f0000: .... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .RedBoot>RedBoot> fis listName FLASH addr Mem addr Length Entry pointRedBoot 0xA8000000 0xA8000000 0x00030000 0x00000000linux 0xA8030000 0x80041000 0x00622000 0x80041000FIS directory 0xA87E0000 0xA87E0000 0x0000F000 0x00000000RedBoot config 0xA87EF000 0xA87EF000 0x00001000 0x00000000RedBoot>書き換えたイメージを起動するようにRedBootの起動パラメータを変更する。ついでに起動時のタイムアウト時間を5秒に変更する。また、DD-WRTのシリアルコンソールのデフォルトのボーレートが115200なので、RedBootのボーレートそれにあわせておく。
RedBoot> fconfigRun script at boot: trueBoot script:.. fis load -b 0x80100000 loader.. go 0x80100000Enter script, terminate with empty line>> fis load -l linux ★>> exec>>Boot script timeout (1000ms resolution): 2 ★Use BOOTP for network configuration: falseGateway IP address:Local IP address: 192.168.1.1Local IP address mask: 255.255.255.0Default server IP address: 192.168.1.254Console baud rate: 115200 ★GDB connection port: 9000Force console for special debug messages: falseNetwork debug at boot time: falseUpdate RedBoot non-volatile configuration - continue (y/n)? y... Erase from 0xa87e0000-0xa87f0000: .... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .RedBoot>再起動する。
RedBoot> resetDD-WRTが起動する。DD-WRTのrootの初期パスワードはadminである。
Linux version 2.6.23.17 (root@dd-wrt) (gcc version 4.1.1) #5158 Sat Jul 26 03:47:50 CEST 2008CPU revision is: 00019064 (中略) DD-WRT v24 std (c) 2008 NewMedia-NET GmbHRelease: 07/26/08 (SVN revision: 9994) DD-WRT login: rootPassword: ========================================================== ____ ___ __ ______ _____ ____ _ _ | _ \| _ \ \ \ / / _ \_ _| __ _|___ \| || | || | || ||____\ \ /\ / /| |_) || | \ \ / / __) | || |_ ||_| ||_||_____\ V V / | _ < | | \ V / / __/|__ _| |___/|___/ \_/\_/ |_| \_\|_| \_/ |_____| |_| DD-WRT v24 http://www.dd-wrt.com ==========================================================Jan 1 00:01:29 login[822]: root login on 'console' BusyBox v1.11.1 (2008-07-26 03:51:42 CEST) built-in shell (ash)Enter 'help' for a list of built-in commands. root@DD-WRT:~#root@DD-WRT:~#管理画面用のWebサーバが動いていることを確認する。
root@DD-WRT:~# ps PID USER VSZ STAT COMMAND 1 root 2580 S /sbin/init noinitrd 2 root 0 SW< [kthreadd] 3 root 0 SW< [ksoftirqd/0] 4 root 0 SW< [events/0] 5 root 0 SW< [khelper] 6 root 0 SW< [kblockd/0] 7 root 0 SW [pdflush] 8 root 0 SW [pdflush] 9 root 0 SW< [kswapd0] 10 root 0 SW< [aio/0] 11 root 0 SW< [mtdblockd] 24 root 2604 S /sbin/watchdog 86 root 2576 S resetbutton 171 root 1568 S /usr/sbin/telnetd 173 root 3880 S httpd -p 80 ★ 308 root 1152 S cron 357 root 2572 S process_monitor 627 root 2600 S /sbin/wland 828 root 1588 S -sh 829 root 1572 R psroot@DD-WRT:~#ブラウザーでhttp://192.168.1.1/を開くと管理画面が表示される。
ルータとしてのスループットはともかくとして、DD-WRTの機能の多さには驚かされる。とりあえずは、チュートリアルなどを参考に単純な無線LANのAPの設定から始めた。今のところWEP64ビット暗号化で問題なく動いている。DDNS設定、WON設定なども行いたい。さらに、OpenWRTベースなのでipkg(opkgというのもある)でコンパイル済みアプリケーションなどを簡単に追加できるはずなので使ってみたい。できたら、ソースから独自のアプリケーションをコンパイルしipkg化して追加することにも挑戦してみたい。GPLの恩恵によりソースが公開されているので勉強にはいい教材になりそうである。先代のLa Fonera(+でない方)にはGPIO端子があるので期待していたが、残念なことににLa Fonera+にはGPIO端子らしきものが見当たらない。ls /proc/gpibをすると22個のポートが表示されるが、オンボードの周辺回路のために全部予約されてしまっているのだろうか?商品として一般利用者向けの使い勝手は向上したと思うが、私のような特別?な意図で購入したものにとっては前のバージョンの方が良かったかもしれない。また、ネットを見ると2つあるEthernetインターフェース用のデバイスドライバのソースコードは、パッチだらけで汚く醜く、バグも多そうだとかというコメントも見られる。基板パターンを見てもUSBが実装された次のバージョン(La Fonera 2:国内では未発売)との間の”間に合わせ”という印象がぬぐえない。
La Foneraと同じAtheros社のMIPSアーキテクチャの石を使っているPlanex社のポケットルータGW-MF54G2もDD-WRTが動くようだ。ついでにこちらもいじってみたい。