Sirius

2007年2月23日(金) 18:14

tftp ブート

ブートローダの u-boot をコンパイルしてみましたが、元々の u-boot.buffalo のサイズとあまりにサイズの違うものが出来てしまいました。これをフラッシュに書き込む勇気はありません。

しばらくは、元々の u-boot を使っていくことにして、何とかネットワークブートさせたいと思います。シリアルコンソールをつければ大丈夫のようですが、まだ付けていません。シリアルコンソール無しで何とかできないかとだめもとでやってみます。

ネットワークブートするには、 tftp サーバが必要です。これは、玄箱で tftpd を動かすことにしました。次に、LS-GL の u-boot に 自分とサーバの IP アドレスを設定すれば何とかなるのではないかと考えました。
メンテナンスを考えると、内臓 HDD からのブート不可 -> ネットワークブートとなっていれば、HDD に障害があった場合に対応しやすいのではないか。そういった作りになっていることを期待してやって見ます。

まず、u-boot のパラメータを操作するコマンドを調べます。/usr/local/sbin に nvram というコマンドがあります。

# nvram -help
nvram Ver.1.00
nvram -c <printenv|del|set|get|eraseall|dump>
# nvram -c printenv
1: [bootargs=$(bootargs_base) $(bootargs_root)]
2: [baudrate=115200]
3: [loads_echo=0]
4: [ipaddr=192.168.11.150]
5: [serverip=192.168.11.1]
6: [rootpath=/nfs/arm]
7: [stdin=serial]
8: [stdout=serial]
9: [stderr=serial]
10: [cpuName=926]
11: [CASset=min]
12: [enaMonExt=no]
13: [enaFlashBuf=yes]
14: [enaCpuStream=no]
15: [MALLOC_len=4]
16: [ethprime=egiga0]
17: [bootargs_end=:::DB88FXX81:eth0:none]
18: [buffalo_ver=BOOTVER=1.01]
19: [build_time=10:35:38]
20: [initrd=initrd.buffalo]
21: [kernel=uImage.buffalo]
22: [bootargs_base=console=ttyS0,115200]
23: [bootargs_root=root=/dev/sda2 rw initrd=0x00800040,15M panic=5]
24: [bootcmd=ide reset; ext2load ide 1:1 0x00100000 /$(kernel);ext2load ide 1:1 0x00800000 /$(initrd);setenv bootargs $(bootargs_base) $(bootargs_root) $(buffalo_ver);bootm 0x00100000 0x00800000]
25: [def_tftp=tftp 0x00100000 $(kernel);tftp 0x00800000 $(initrd);setenv bootargs $(bootargs_base) $(bootargs_root) $(buffalo_ver);bootm 0x00100000 0x00800000]
26: [bootdelay=3]
27: [disaMvPnp=no]
28: [overEthAddr=no]
29: [usb0Mode=host]
30: [usb1Mode=host]
31: [ethact=egiga0]
32: [ethaddr=00:16:01:35:xx:xx]
# nvram -c get serverip
serverip=192.168.11.1

なるほど、set コマンドでデフォルトのパラメータを書き換えられそうです。
サーバと自分の IP アドレスを書き換えて見ます。
# nvram -c set serverip 192.168.1.200
>serverip=192.168.1.200
# nvram -c set ipaddr 192.168.1.16
>nvram_set:ipaddr = 192.168.1.16
# nvram -c printenv
1: [bootargs=$(bootargs_base) $(bootargs_root)]
2: [baudrate=115200]
3: [loads_echo=0]
4: [rootpath=/nfs/arm]
5: [stdin=serial]
6: [stdout=serial]
7: [stderr=serial]
8: [cpuName=926]
9: [CASset=min]
10: [enaMonExt=no]
11: [enaFlashBuf=yes]
12: [enaCpuStream=no]
13: [MALLOC_len=4]
14: [ethprime=egiga0]
15: [bootargs_end=:::DB88FXX81:eth0:none]
16: [buffalo_ver=BOOTVER=1.01]
17: [build_time=10:35:38]
18: [initrd=initrd.buffalo]
19: [kernel=uImage.buffalo]
20: [bootargs_base=console=ttyS0,115200]
21: [bootargs_root=root=/dev/sda2 rw initrd=0x00800040,15M panic=5]
22: [bootcmd=ide reset; ext2load ide 1:1 0x00100000 /$(kernel);ext2load ide 1:1 0x00800000 /$(initrd);setenv bootargs $(bootargs_base) $(bootargs_root) $(buffalo_ver);bootm 0x00100000 0x00800000]
23: [def_tftp=tftp 0x00100000 $(kernel);tftp 0x00800000 $(initrd);setenv bootargs $(bootargs_base) $(bootargs_root) $(buffalo_ver);bootm 0x00100000 0x00800000]
24: [bootdelay=3]
25: [disaMvPnp=no]
26: [overEthAddr=no]
27: [usb0Mode=host]
28: [usb1Mode=host]
29: [ethact=egiga0]
30: [ethaddr=00:16:01:35:xx:xx]
31: [serverip=192.168.1.200]
32: [ipaddr=192.168.1.16]

"bootcmd" を書き換えて tftp ブートするようにすればデフォルトでネットワークブートは出来そうです。しかし、失敗したら…。
…やめておこう。

では、玄箱に tftpd をインストールします。
ソースを持ってきてコンパイルし、インストールします。Debian のソースを利用しました。netkit-tftp_0.17.orig.tar.gz を使いました。
次に、inetd から tftpd が起動されるように /etc/inetd.conf の中の tftpd に関する部分のコメントを外します。
そして、カーネルイメージとラムディスクイメージを置くディレクトリ(デフォルトでは /tftpboot) へそれぞれをコピーします(uImage.buffalo, initrd.buffalo)。
最後に dhcp サーバの設定をします。bootp でも出来るようですが、dhcp サーバを立ててあるので。
dhcpd の設定ファイル /etc/dhcpd.conf に次の行を追加します。
allow booting;
allow bootp;
変更がおわったら、dhcpd と inetd を再起動。

LS-GL に戻って、カーネルイメージとラムディスクイメージをリネームし、再起動します。

# mv /boot/uImage.buffalo /boot/uImage.buffalo-
# mv /boot/initrd.buffalo /boot/initrd.buffalo-

再起動。
ディスクエラーの LED が点滅していますが起動しました。ssh でログインも出来るし、web の管理画面も開けました。

次に、IP アドレスを DHCP サーバから持ってこれないかを試してみました。ipaddr を削除します。
# nvram -c del ipaddr

再起動

…起動しませんでした。HDD を取り出して別マシンでファイル名を元に戻さないと。
Terastation へつなげてファイル名を戻しました。

起動してきたので、u-boot の ipaddr を設定しなおします。
# nvram -c set ipaddr 192.168.1.16
>nvram_set:ipaddr = 192.168.1.16

たとえば、シリアルコンソール無しでも新品のHDD をつなげてEMモードで起動して、ファームウェアの更新でファームのインストールが出来るかもしれません。今度試してみよう。
まあ、これでカーネルやラムディスクの実験がしやすくなったといえばいえるかな。HDD が壊れたときも手間が若干、省けそうです。
もっとも、一番やりたかった tftp ブートが出来てしまったし、wizd も動くし、さらにもうすぐ玄人志向から Kuro-Box/PRO が発売されるからどうなるかわかりません。

蛇足ですが、USB の外し方が悪かったのか、Terastation の調子が悪くなり、電源を切って(切れるまでにえらい時間がかかった)、再起動したら raid 修復が始まってしまいました。
ほって置いたらディスクが一台エラーを起こし、縮退モードになっていました。再起動してディスクを認識させなおして raid 修復。何とか終わりましたがそろそろ HDD が限界かな。予備を買っておこう。

written by sirius [/Linkstation] [この記事のURL] [コメントを書く] [コメント(1)] [TB(0)]

この記事へのトラックバックPingURL

Comments

『u-bootのコンパイル』

すみません、どうかu-bootのコンパイルの仕方を教えてください。

自力でコンパイルをしようとして、Interface4月号を購入してu-boot特集を参考にしても、やり方がよくわかりませんでした。
ちなみにこれです↓
http://www.cqpub.co.jp/interface/sample/200704/I0704132.pdf

お願いします。

written by fluesky

TrackBacks

Sirius

MySketch 2.7.2 written by 夕雨