La Fonera+をオープンソースの無線LANルータ化

いささか鮮度の落ちたネタではある。無線LANやルータの勉強のためにFONのハードウェアLa Fonera+を購入した。La Foneraは、搭載されているフラッシュメモリをDD-WRTOpenWRTといったオープンソースの組み込みLinuxに書き換えて動作させることができる。ただ、初代のLa Foneraは2006年に発売されて以来、さんざんハックされつくされた感がある。そこで、今回はまだ事例のないLa Fonera+にオープンソースの無線LANルータOSDD-WRTの最新安定版V24-sp1を組み込んでみた。

RedBootモードに入る

La Fonera+は電源を入れるとRedBootというイニシャルブートローダが最初に起動する。改造に当たってはこのRedBootを使ってフラッシュメモリーの内容を書き換える必要がある。RedBootのモードに入る方法は2とおりある。起動して2秒以内に次のいずれかの方法でCtrl+Cを受信するとLa Fonera+はRedBootプロンプトの状態になる。

  1. telnet
  2. シリアルポート

telnetでRedBootに入る方法

この方法は本体のハードウェアに手を出さずに済む。工場出荷時の設定では、telnetのIPアドレスは192.168.1.1、ポートは9000なので電源を入れた直後にコンソールから次のコマンドを打てばよい。

  1. telnet 192.168.1.1 9000

と打つと次の例(Windows標準添付コンソール使用)ようにRedBootに入れる。だが、この「起動して2秒以内」のタイミングがなかなかつかみづらい。RedBootに入れないでそのまま本体のLinuxがブートしてしまうことが多い。使用しているPCがMacやBSD系Linuxの場合、telnetでCtrl+Cが送れない。この場合は次のコマンドでできるらしいが試してはいない。

  1. 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

シリアルポートからRedBootに入る方法

簡単な工作が必要だ。まず本体の裏2箇所にあるゴム足をはがし、下に隠れているネジをはずす。

このネジはヘクスローブと呼ばれる6角形の星型をしたネジで、T-8番という大きさが合う。

嵌め合いになっているわけではなく、そっと白い上蓋を持ち上げるだけで外れる。

次の図の丸印の場所(基板にJP1とシルク印刷してある)にある4ピンのピンヘッダーがシリアルポートだ。関係はないが、未実装のUSB周りの回路や1個のLED(基盤にはLED4とシルク印刷)など基板パターンが見られる。

シリアルポートは、Ethernetコネクタに遠い方から順番に次の通り。このうちVCC(+3.3V)は使用しない。

ピン番号1234
名称GNDRxDTxDVCC

この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と打つ。

  1. RedBoot> fconfig -l -n
  2. boot_script: true
  3. boot_script_data:
  4. .. fis load -b 0x80100000 loader
  5. .. go 0x80100000
  6.  
  7. boot_script_timeout: 2
  8. bootp: false
  9. bootp_my_gateway_ip: 0.0.0.0
  10. bootp_my_ip: 192.168.1.1
  11. bootp_my_ip_mask: 255.255.255.0
  12. bootp_server_ip: 192.168.1.254
  13. console_baud_rate: 9600
  14. gdb_port: 9000
  15. info_console_force: false
  16. net_debug: false
  17. RedBoot>

TFTPサーバの設置

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である。

  1. RedBoot> ip_address -l 192.168.1.1/24 -h 192.168.1.7
  2. IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
  3. Default server: 192.168.1.7
  4. RedBoot>

フラッシュの初期化。

  1. RedBoot> fis init
  2. About to initialize [format] FLASH image system - continue (y/n)? y
  3. *** Initialize FLASH Image System
  4. ... Erase from 0xa87e0000-0xa87f0000: .
  5. ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
  6. RedBoot>

TFTPからイメージを読み込む。

  1. RedBoot> load -r -v -b 0x80041000 linux.bin
  2. Using default protocol (TFTP)
  3. |
  4. Raw file loaded 0x80041000-0x80662fff, assumed entry at 0x80041000
  5. RedBoot>

フラッシュへ書き込む(30分ぐらいかかるので気長に待つ)

  1. RedBoot> fis create linux
  2. ... Erase from 0xa8030000-0xa8652000: ...................................................................................................
  3. ... Program from 0x80041000-0x80663000 at 0xa8030000: ...................................................................................................
  4. ... Erase from 0xa87e0000-0xa87f0000: .
  5. ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
  6. RedBoot>
書き換わったことを確認する。
  1. RedBoot> fis list
  2. Name FLASH addr Mem addr Length Entry point
  3. RedBoot 0xA8000000 0xA8000000 0x00030000 0x00000000
  4. linux 0xA8030000 0x80041000 0x00622000 0x80041000
  5. FIS directory 0xA87E0000 0xA87E0000 0x0000F000 0x00000000
  6. RedBoot config 0xA87EF000 0xA87EF000 0x00001000 0x00000000
  7. RedBoot>

書き換えたイメージを起動するようにRedBootの起動パラメータを変更する。ついでに起動時のタイムアウト時間を5秒に変更する。また、DD-WRTのシリアルコンソールのデフォルトのボーレートが115200なので、RedBootのボーレートそれにあわせておく。

  1. RedBoot> fconfig
  2. Run script at boot: true
  3. Boot script:
  4. .. fis load -b 0x80100000 loader
  5. .. go 0x80100000
  6. Enter script, terminate with empty line
  7. >> fis load -l linux ★
  8. >> exec
  9. >>
  10. Boot script timeout (1000ms resolution): 2 ★
  11. Use BOOTP for network configuration: false
  12. Gateway IP address:
  13. Local IP address: 192.168.1.1
  14. Local IP address mask: 255.255.255.0
  15. Default server IP address: 192.168.1.254
  16. Console baud rate: 115200 ★
  17. GDB connection port: 9000
  18. Force console for special debug messages: false
  19. Network debug at boot time: false
  20. Update RedBoot non-volatile configuration - continue (y/n)? y
  21. ... Erase from 0xa87e0000-0xa87f0000: .
  22. ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
  23. RedBoot>

再起動する。

  1. RedBoot> reset

DD-WRT起動

DD-WRTが起動する。DD-WRTのrootの初期パスワードはadminである。

  1. Linux version 2.6.23.17 (root@dd-wrt) (gcc version 4.1.1) #5158 Sat Jul 26 03:47:50 CEST 2008
  2. CPU revision is: 00019064
  3.  
  4.      (中略)
  5.  
  6. DD-WRT v24 std (c) 2008 NewMedia-NET GmbH
  7. Release: 07/26/08 (SVN revision: 9994)
  8.  
  9. DD-WRT login: root
  10. Password:
  11. ==========================================================
  12.  
  13. ____ ___ __ ______ _____ ____ _ _
  14. | _ \| _ \ \ \ / / _ \_ _| __ _|___ \| || |
  15. || | || ||____\ \ /\ / /| |_) || | \ \ / / __) | || |_
  16. ||_| ||_||_____\ V V / | _ < | | \ V / / __/|__ _|
  17. |___/|___/ \_/\_/ |_| \_\|_| \_/ |_____| |_|
  18.  
  19. DD-WRT v24
  20. http://www.dd-wrt.com
  21.  
  22. ==========================================================
  23. Jan 1 00:01:29 login[822]: root login on 'console'
  24.  
  25.  
  26. BusyBox v1.11.1 (2008-07-26 03:51:42 CEST) built-in shell (ash)
  27. Enter 'help' for a list of built-in commands.
  28.  
  29. root@DD-WRT:~#
  30. root@DD-WRT:~#

管理画面用のWebサーバが動いていることを確認する。

  1. root@DD-WRT:~# ps
  2. PID USER VSZ STAT COMMAND
  3. 1 root 2580 S /sbin/init noinitrd
  4. 2 root 0 SW< [kthreadd]
  5. 3 root 0 SW< [ksoftirqd/0]
  6. 4 root 0 SW< [events/0]
  7. 5 root 0 SW< [khelper]
  8. 6 root 0 SW< [kblockd/0]
  9. 7 root 0 SW [pdflush]
  10. 8 root 0 SW [pdflush]
  11. 9 root 0 SW< [kswapd0]
  12. 10 root 0 SW< [aio/0]
  13. 11 root 0 SW< [mtdblockd]
  14. 24 root 2604 S /sbin/watchdog
  15. 86 root 2576 S resetbutton
  16. 171 root 1568 S /usr/sbin/telnetd
  17. 173 root 3880 S httpd -p 80 ★
  18. 308 root 1152 S cron
  19. 357 root 2572 S process_monitor
  20. 627 root 2600 S /sbin/wland
  21. 828 root 1588 S -sh
  22. 829 root 1572 R ps
  23. 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:国内では未発売)との間の”間に合わせ”という印象がぬぐえない。

引用
The ethernet drivers is different than OpenWrt's one (ar2313.c). Different and yes, it need cleanup. The code's comments are amazing : ≪FIXME: ugly, ugly hack!≫, ≪XXX: clean up this garbage!≫, ≪FIXME: does this work?≫.

Fonera+ users, the code inside your router is ugly, unfinished, and probably buggy...

La Foneraと同じAtheros社のMIPSアーキテクチャの石を使っているPlanex社のポケットルータGW-MF54G2もDD-WRTが動くようだ。ついでにこちらもいじってみたい。

2009年02月22日