玄箱のu-boot化とDebian lennyアップデート
懸案だった無印玄箱のDebian lenny化だが、そのためにはブートローダーにloader.oを使ったものからu-bootに変更すること、フラッシュROMの書き換えという大きな壁があった。フラッシュROMの書き換えはミスるとJTAGが無いと復旧が困難で、不精してシリアル接続さえもしていない小生にとっては玄箱はゴミ箱行きとなってしまうリスクがあった。
多くの先達が有益な情報を残して公開してくれているが、多くの場合EMモードにした状態でフラッシュROMの書き換えをしており、シリアル接続が必携という感があり専用のシリアルケーブルの用意を面倒がっていた自分は腰が重くなっていた。しかし一部のサイトではそもそもEMモードに入らずともフラッシュROMの書き換えが出来るとあり、今回試してみた。結果は可能だった。
通常のEMモードを経由した流れは以下の通り。
EMモードへ移行するためのデバイスファイル名がカーネル2.4と2.6で異なるため、その際の書き込み先を注意する。
EMモードになるとフラッシュ上のカーネル、kernel2.4から起動する。IPアドレスも初期化されるので注意。
IPアドレスはだいたい以下のどちらか。
- 192.168.11.150 <== こちらが本命か
- 192.168.1.100?
- 192.168.0.100?
- DHCPが動いていればそちらからIPアドレスを取得する。telnetでログインしてカーネル、モジュールの展開をする。
但し、EMモードに移行せずに通常モードでフラッシュの書き込みが出来るとの情報もあり。取り敢えず通常モードで試してみて、ダメだったらEMモードに移行してみるか。
話は簡単で通常の起動モード、kernel2.6.25からフラッシュROMにu-bootのファームウエアを書き込むだけ。
用意したのは u-boot 対応の
- カーネルイメージ(kernelimage-2.6.20-kuroBOX-uImage.tgz)
- カーネルモジュール(modules-2.6.20-kuroBOX.tgz)
- そして u-boot(u-boot-hd.flash.bin)
これらを http://www.genbako.com/ から入手しておく。U-Boot Loaderはmd5も忘れずに。
# wget http://www.genbako.com/uImage/kernelimage-2.6.20-kuroBOX-uImage.tgz
# wget http://www.genbako.com/uImage/modules-2.6.20-kuroBOX.tgz
# wget http://www.genbako.com/u-boot_loader/u-boot-hd.flash.bin
# wget http://www.genbako.com/u-boot_loader/u-boot-hd.flash.md5
md5の確認。
カーネルは /boot に展開し、カーネルモジュールは /lib/modules に展開。最後に(念のため) EM モードに移行して書き換えを実行する。
/devに「mtdblock1」があるのを確認。なければ以下のコマンドでデバイスを作っておく。
# cd /dev
# ./MAKEDEV mtd
/bootのシステムマップを退避(念のため)
# cd /boot
# cp -p System.map System.map.orig
EMモードへの移行
# echo -n "NGNG" > /dev/fl3
デバイスファイル名は起動しているカーネルのバージョンによって異なるので注意。
- kernel 2.4系 /dev/fl3
- kernel 2.6系 /dev/mtdblock2
#/usr/bin/write_ng > /dev/fl3
このコマンドでも良いらしい。 中身はshell scriptで"NG"を繰り返しエコーしているだけ。
rebootして再起動することでEMモードに入る。u-boot を書き換え。
# cat u-boot-hd.flash.bin > /dev/fl2
EMモードでのターゲットのフラッシュメモリーは /dev/fl2
どうやらEM移行しなくても直接通常モードでフラッシュメモリーに書き込む方法、
# cat ./u-boot-hd.flash.bin > /dev/mtdblock1
※EMモードの場合とデバイス名が違うので注意
でもイケるらしい。ならばEMモードにわざわざ移行しなくても良いかも。
# dd if=./u-boot-hd.flash.bin of=/dev/mtdblock1 bs=1k
フラッシュとU-Boot Loaderのファイルが同一かを確認しておく。
# cmp u-boot-hd.flash.bin /dev/mtdblock1
EM モードを抜ける。
# echo -n "OKOK" > /dev/fl3
EMモードはkernel 2.4であることに注意。
/usr/sbin/write_okコマンドはうちの環境にはなかった。
"OKOK"の書き込みの確認。
# dd if=/dev/fl3 bs=4 count=1
OKOK1+0 records in
1+0 records out
4 bytes transferred in 0.006583 seconds (608 bytes/sec)
EMモードを抜けてノーマルモードに戻る。
# echo -n "OKOK" > /dev/mtdblock2 これ良いのか?
# echo -n "OKOK" > /dev/fl3
# /usr/bin/write_ok > /dev/fl3 でも良いらしい。