Laser5 L-Router で NetBSD をネットワークブートする
NetBSD/hpcmips
は
Laser5
L-Router
をサポートしていますが、
私の調べた範囲ではフラッシュメモリにカーネルを書いておき、
そこからブートするという使い方のようです。
私は L-Router を diskless で使っていますが、
カーネルを再構築するたびにフラッシュメモリの書換えを行なうのが面倒なため、
ブートローダのコードを書くことにしました。
といってもほとんど既存のコードで、
たいしたコーディングは必要ありませんでした。
デバッグはちょっと大変でしたけど。
NetBSD/i386 上でクロスコンパイルにて作業していますので、
Makefile や README にそれに依存している部分があるかもしれません。
また、lrouter-netboot をコンパイルするためのベースとなる NetBSD のソースは
"Jan 13 00:00:00 UTC 2005" の -current (CVS HEAD)
を使いました。
(実際には、このあたりの NetBSD-current/hpcmips は init が panic するとか、
ハングするとかの問題があったので、
少なくとも Jan 17 2005 以降のものを使った方が良いと思います)
ブートローダ lrouter-netboot のソースは
ここ(lrouter-netboot.0.7.tar.gz)
です。boot の方法としては、
-
NFS
-
TFTP
-
ATA disk 上の ufs filesystem
の3通りに対応しています。コンパイルの手順はソースに
README が含
まれてますので、そちらを参照下さい。
なお、私はカーネルに
http://www.jp.netbsd.org/ja/JP/ml/port-hpcmips-ja/200202/msg00030.html
のパッチを当てていますので、
lrouter-netboot のソースもそれに合わせたものになっています。
もし上記パッチを当てていないカーネルを使う場合は、
lrouter-netboot/${BOOTTYPE}/Makefile の
-DFXP_EEPROM_SPEC_FORMAT
を消してコンパイルすればうまくいくのではないかと思います(未確認)。
また、カーネルコンフィグレーションファイルは LROUTER に
"options COMPAT_16" と "options COMPAT_20" を追加したものを用いて
make した netbsd を使ってテストしています。
root filesystem を nfs にしたい場合は、
カーネルに引数 -b=nfs を渡すようにしていますので、
nfsnetbsd を使わなくても大丈夫になりました(version 0.3 から)。
上記の簡単な説明で何をどうやれば良いのかわかる方には
いわずもがなではありますが、念の為に書いておくと、
誤操作やバグなどのためにフラッシュメモリを書き潰してしまうと、
L-Router が立ち上がらなくなってしまいます。
実際、私はこのブートローダをデバッグ中に1台ダメにしてしまいました。
それで懲りていろいろ調べた末、プログラムの最初で
(start.Sの最初で VR4122 の内部レジスタ BCUCNTREG1 に 0 を書き込むことで)
フラッシュメモリのライトイネーブル信号を無効にするようにしています。
この対策後は (何回かバグで暴走させつつも)
壊れるということはまだ経験していませんが、
たまたま助かっているだけかもしれませんし、
そもそも絶対安全な対策にはなり得ません。
フラッシュメモリの壊れた L-Router の ROM ソケットに、
lrouter-netboot.0.7.tar.gz
の中に含まれる initialize (リセット直後の初期化を行なうプログラム)
と burnflash (フラッシュメモリへの書き込みを行なうプログラム)
とを書き込んだ ROM を差し、
フラッシュメモリの中身を書き換えて復旧させることができました。
これらプログラムに関してはソースの
README.initialize
に記述がありますので、参考にして下さい。
なお、当方では ROM として、鈴木康司さんの
EAGLE
のページに掲載されている L-Router 用 Flash ROM ボードを
USB ROM Write+ と併せてありがたく使わせていただいております。
修正履歴
[2002/11/30]最初の version 0.1 を公開
[2002/12/2]そのままではコンパイルできなかったので、
改訂して version 0.2 にしました。
シリアルケーブル経由でダウンロード実行する手順を書きました。
[2002/12/19] 改訂して version 0.3 としました。
tftp のサポートと ufs on ATA disk のサポートを追加しました。
kernel に引数を渡せるようにしました。
[2002/12/29] 改訂して version 0.4 としました。
リセット直後から全てソースが公開されたコードのみで
NetBSD が boot するところまで動くようになりました。
また、ROM イメージを生成できるようにしました。
[2003/06/19」改訂して
version 0.5
としました。
機能追加等はありません。
最近の NetBSD-current でコンパイルすると
動かなくなってしまってたので、直しました。
原因はプロトタイプ宣言を忘れてた関数があったためです。
-Wmissing-prototypes -Werror でコンパイルするようにしました。
[2004/04/28] 改訂して
version 0.6
としました。機能追加等はありません。
久しぶりにコンパイルしてみたら通らなかったので修正しました。
[2005/01/14] 改訂して
version 0.7
としました。2004年4月下旬以降の NetBSD-current のソースを使ってコンパイルすると
ATA disk からブートできなくなくなってましたので修正しました。
それから、コマンドラインでブートするデバイスと引数を指定できるようにしたつもりです。
[2005/09/06] 最近の -current のカーネルを実行するのには lrouter-netboot では
初期化が充分には行なわれていないようなので、
パッチを作成しました。
この初期化をブートローダが行なうべきなのかカーネルが行なうべきなのか、
良くわからないのですが。
このパッチは
この議論 を読んで作成しました。