いささか鮮度の落ちたネタではある。無線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 -n
boot_script: true
boot_script_data:
.. fis load -b 0x80100000 loader
.. go 0x80100000
boot_script_timeout: 2
bootp: false
bootp_my_gateway_ip: 0.0.0.0
bootp_my_ip: 192.168.1.1
bootp_my_ip_mask: 255.255.255.0
bootp_server_ip: 192.168.1.254
console_baud_rate: 9600
gdb_port: 9000
info_console_force: false
net_debug: false
RedBoot>
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.7
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.7
RedBoot>
フラッシュの初期化。
RedBoot> fis init
About 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.bin
Using default protocol (TFTP)
|
Raw file loaded 0x80041000-0x80662fff, assumed entry at 0x80041000
RedBoot>
フラッシュへ書き込む(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 list
Name FLASH addr Mem addr Length Entry point
RedBoot 0xA8000000 0xA8000000 0x00030000 0x00000000
linux 0xA8030000 0x80041000 0x00622000 0x80041000
FIS directory 0xA87E0000 0xA87E0000 0x0000F000 0x00000000
RedBoot config 0xA87EF000 0xA87EF000 0x00001000 0x00000000
RedBoot>
書き換えたイメージを起動するようにRedBootの起動パラメータを変更する。ついでに起動時のタイムアウト時間を5秒に変更する。また、DD-WRTのシリアルコンソールのデフォルトのボーレートが115200なので、RedBootのボーレートそれにあわせておく。
RedBoot> fconfig
Run script at boot: true
Boot script:
.. fis load -b 0x80100000 loader
.. go 0x80100000
Enter script, terminate with empty line
>> fis load -l linux ★
>> exec
>>
Boot script timeout (1000ms resolution): 2 ★
Use BOOTP for network configuration: false
Gateway IP address:
Local IP address: 192.168.1.1
Local IP address mask: 255.255.255.0
Default server IP address: 192.168.1.254
Console baud rate: 115200 ★
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
RedBoot>
再起動する。
RedBoot> reset
DD-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 2008
CPU revision is: 00019064
(中略)
DD-WRT v24 std (c) 2008 NewMedia-NET GmbH
Release: 07/26/08 (SVN revision: 9994)
DD-WRT login: root
Password:
==========================================================
____ ___ __ ______ _____ ____ _ _
| _ \| _ \ \ \ / / _ \_ _| __ _|___ \| || |
|| | || ||____\ \ /\ / /| |_) || | \ \ / / __) | || |_
||_| ||_||_____\ 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 ps
root@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が動くようだ。ついでにこちらもいじってみたい。