このページはアドバンテックのワンボードコンピューターBiscuit PCでLinuxをDisklessで使う方法を紹介します。具体的な設定や、Netbootを使用する実例を示しますので、このボードでなくても、Diskless Linux Machineに興味があれば参考にしていただけると思います。
このページは 私 が個人的に作成したもので、 株式会社リサーチ、アドバンテック社とは何等関わりありません。 また書いている内容は、利用者に良い結果を与えることを期待して書いたものですが、 間違いを含んでいたり期待しない結果を招く危険があります。私はそれら一切について何も保証できませんし、 質問にお答えする用意もないことをあらかじめご了承の上、すべてご自身の責任において実施するようお願いします。なお、PCM-5862E (100Base-Tx)は、NICにRealTek RTL8139を使っているので、ここに書いた方法をそのまま使えません。Packet-Driverは付属すると思われるし、Linux driverはサポートされているようなので、機会があればこのボードも実験してみたいと思いますが、今のところは未確認です。
基板の表面(53KB)、裏面(36KB)、斜め上から (66KB)の写真を示します。
Pentiumの大きさを考えていただくと大きさが想像できるでしょう。
Biscuit PCは、ワンボードコンピュータですから、普通にFDD, HDD, VDT, Keyboard, Mouseをつけて使うことはもちろんできます。
でも、HDDを使わず、X端末にしたり、Router, Terminal Server, 専用機の組み込みコントローラとして使うと、そのちいささが活きてきます。
LinuxはすべてのファイルシステムをNFSにして使うことができるし、Kernel Imageも、NetworkからDown Loadして、Bootするように設定できます。
BIOSにNetwork Boot Programを組み込んでしまえば、Floppy diskもHard diskも使わず、完全にシングルボードのみでNetworkにつなぎ電源を入れればLinuxが動作するようにできるわけです。
Filesystemは、すべてNFSですから気まぐれにshutdownしないでいきなり電源を落としても壊れることもありません。
# メモリー上のデーターは消えますが...
小さくたって、立派なLinuxシステムです。突然画面が真っ青になって死んでしまう窓印の不良OSモドキとは根本的に信頼性も性能もちがいます。
RS-232C I/Fの測定機等をEthernetにつなぐ市売のTerminal Server専用機にも、長期実験途中にHung upされたつらい思い出があります。
# 恨みともいう (-_-#
Programを変えられれば、警報を出すことも、自動復帰させることもできたのに...
# 恨み言ともいう。
LinuxならSource Codeも付いているし、開発環境も完備してます。ServerでProgramを開発したらbiscuitにexportしている適当な場所にコピーするだけでInstall完了ですから簡単です。Cが面倒なら、Perlでも、shell scriptでも使えます。当たり前かもしれないけれど、組み込み用(embedded)のシングルボードでそれができるって、かなり感動的で使わない手はないと思うのは私だけでしょうか?
入手に困ることは多分ありませんね :)
すでに、持っているかも知れません。
Gero Kuhlmann <gero@gkminix.han.deが提供している、Network Boot Kitです。
http://www.han.de/~gero/netboot からDown Loadできるほか、たくさんのftp siteにmirrorされてます。
このキット以外にも、Diskless Linuxを構成するには、etherbootを使う方法や、FDからKernel ImageをLoadする方法もあります。
でも、Netbootを使う方法は、ROMから立ち上げればもちろん、FDを使うにしても、Boot時間が短く、Version upが楽で、なれてしまうと大変手軽です。
動作確認したのは、Netboot-0.8.1です。最新ベータテスト版の0.9.0dも試みましたが、tftp終了後rebootしてしまいうまく動作しませんでした。
0.9.0eについてはdownloadしただけで、試していません (_o_)
Network Bootするには、NFS, TFTP, RARP, BOOTPをサービスするServerが必要です。Linuxでなくても、これらをサポートしていれば、使用できますが、Linuxなら、Serverが持っている多くのバイナリーをShareできるので、Disk spaceを相当節約できます。また、diskless machineのためにシステムを作成する開発機としてそのまま使用できます。
私は、Red Hat Linux 4.2をベースにしたLinux Boxを使っています。以下の記述はこのマシンを基準に書きますので、その他のパッケージでは、異なる場合があると思います。
私は、 (株)ミスミ の通信販売で買いました。CPU, Memoryなしで57,000円でした。
ミスミ殿よりBiscuit PCを購入する場合 注意事項 をご了承の上、ご使用くださるようお願いします。
電源は外付けHDDのジャンクからとりました。その他周辺機器は、一時的にほかのPCから外してきたものです。
PCM-5862には複数のリビジョンがあり今後も増える可能性があります。私が動作を確認したのはRev.B101-1です。
netbootのsourceを適当な場所にtarで展開した後そこへ移動し、
% ./configure
% make
% su
# make install
で、問題なくいけると思います。ついでに、boot用のFDも作っておきましょう。
% make bootrom
すると、いろいろ尋ねてきますので、返事します。
私の log を置いておきます。
% dd if=image.flo of=/dev/fd0
でFDに書き込みます。わずか13178 byteです。
DisklessのRootに使う、file systemをserver側に準備するため、
# mkdir -p /tftpboot/192.168.1.100
します。ここではbiscuitのIP addressが192.168.1.100であることを仮定し、/tftpboot/192.168.1.100/にtftpでloadすべきイメージ、disklessのroot (/) が、置かれることを想定しています。
# tar cCf / - var etc sbin bin dev lib | tar xCfp /tftpboot/192.168.1.100 -
を実行し、serverにある、"/"以下の必要ファイルをコピーします。
また、nfsfsで使うmount point等も用意します。
# cd /tftpboot/192.168.1.100
# mkdir usr home proc tmp a
ついで、serverとは設定を変更する必要があるファイルを編集します。
etc/rc.d/の、
rc.sysinit , rc.serial
etc/sysconfig/の、
network , network-scripts/incfg-eth0
etc/fstab , etc/conf.modules(とりあえず空)
などです。
etc/rc.d/init.d/の中の多くも、起動する必要がないものを含んでいると思いますので、とりあえずファイルの先頭に、
exit 0
を書いてとめましょう。
確実に作業できるなら、「とりあえず」でなくって、ちゃんとetc/rc.d/rc?.dの中身を設定すればよいのですが、いつもの癖が出て、かなりの確率で、
/tftboot/192.168.1.100/etcでなく、
/etcそのものを変更したりします (^^;
とりあえずdisklessが立ち上がるように設定し、後はdisklessにloginしたほうが安全に作業できます。
Network bootしdisklessで稼動するマシンのkernelは、NFS Rootの設定をしRoot deviceを、/dev/nfsrootにします。
/dev/nfsrootがなければ先ず作りましょう。
# cd /dev
# mknod nfsroot b 0 255
kernel sourceは、/usr/src/linuxに展開されるので、現行のsource treeを、
# cd /usr/src
# mv linux server-linux
としたのち展開し、
# mv linux diskless-linux
# ln -s diskless-linux linux
としてから作業すればよいと思います。
私が構築したconfig fileを ここ に示します。また、/usr/src/diskless-linuxにあるMakefileの$TOPDIR,NFS_ROOT 他をいじっています。全文を ここ に置いておきます。
準備ができたら、
# cd /usr/src/linux
# make mrproper
して、私の、.config , Makefileをコピーし、
# make oldconfig
# make zImage
# make modules
# make modules_install
すると楽だと思います。
make installや、make zliloは、やらないでください。
その代わりに、
# cp System.map /tftpboot/192.168.1.100/boot
# cd arch/i386/boot
# mknbi-linux -d rom --i rom -k zImage -o bootImage
# cp bootImage /tftpboot/192.168.1.100
をします。
mknbi-linuxはnetbootによりinstallされたコマンドです。
ServerのKernelは、rarpをサポートする必要があります。
Serverのkernelを構築したときの、.configに、
CONFIG_INET_RARP=y
があるのを確認してください。
もし、そのように設定されていない場合、Kernelを再構築します。
/etc/bootptabを設定します。私の場合は こう です。
ha=の後ろは、biscuitのEthernet MAC addressですが、起動しないとわかりませんね。
後で設定しなおす事にしてこのままにしておいて結構です。
diskless machineに使用させるdisk spaceをexportします。
設定は、/etc/exportsで行います。 設定例を ここ に示します。
/etc/exportsを変更したら、 rpc.mountd, rpc.nfsd を再起動します。
/etc/inetd.confにtftpd, bootpdを起動できるよう設定します。
記述自体はされていて、コメントアウトしてあると思います。
tftp dgram udp wait root /usr/sbin/tcpd in.tftpd
bootps dgram udp wait root /usr/sbin/tcpd bootpd
/usr/sbin/にin.tftpd ,bootpd があることも念のため確認します。
/etc/servicesに次の記述があることを確認し、万一なければ書き加えます。
bootps 67/udp
tftp 69/udp
/etc/hosts.allow, /etc/host.denyを設定しbiscuitからのアクセスを許可します。
これらを確認したら、inetdを初期化します。
# kill -HUP `cat /var/run/inetd.pid`
ここまでくれば、とりあえず起動できると思います。
BiscuitにFDD, Keyboard, mouse, CRT, 電源をつなぎ、LANに接続します。
先に作ったNetboot FDを挿入して、電源を入れると、BIOS check, FDのアクセスがあって、netbootが、走るはずです。
MAC addressが表示されるので、すかさずメモして、/etc/bootptabを修正します。
Resetして、もう一度起動すれば(運がいいと)Linuxがbootします。
正常にbiscuitが、bootしたときのlogを ここ に示します。ただし、後述するようにbootpd -d4のoptionを付けた場合です。
運が悪い場合は、/usr/doc/JFのdiskless-mini-howto, NFS-ROOTを読んで再挑戦しましょう。
JLUG のWWWからたどれるさまざまなリンクも参考になるし、linux-users MLで質問すれば答えてくれる人がいるかもしれません。
FDで起動しないようでは、ここから先に進むのは無理です。
一般的なトラブルシューティングは他の文書などを参考にしていただくことにして、ここでは、tftp, bootpに関する試験を簡単にまとめておきます。
Bootp serverが正しいを応答を返すかどうか試験します。まず/etc/bootptabに試験用のエントリーを追加します。
test:hd=/tftpboot/192.168.1.100:tc=.default:ha=00C06C738964:ip=192.168.1.29:
試験用エントリーに使用するIP addressはすでに動作しているほかのマシンまたはサーバ自身で構いません。ha(MAC address)は使用しないので何を書いても関係ありません。
エントリーを追加したら、このIP addressを持つマシンから次のcommandを入力します。
# /usr/sbin/bootptest bootp-server
正常な応答例を ここ にしめします。
inetd.confでbootpdを起動する設定で、-d4などデバッグオプションをつけておくと/var/log/messagesに詳しいlogがでます。
bootps dgram udp wait root /usr/sbin/tcpd bootpd -d4
inetd.confを変更したら、再初期化します。
# kill -HUP `cat /var/run/inetd.pid`
正常なlogの例を ここ に示します。
TFTPの試験はServer自身またServerにアクセスを許可されている別のマシンから、実際にtftpコマンドを使いファイルを取り出してみればよいでしょう。
実際には次のコマンドを入力します。
# cd /tmp
# tftp tftp-server
get /tftpboot/192.168.1.100/bootImage
/etc/hosts, /etc/ethersまたは、bind等で、biscuitを名前で参照できるようにする設定は、disklessに限った話でもないし割愛します (^^)
さっそくFDDをはずしROMだけで立ち上げる方法に移りましょう。
ところでROM Writerをお持ちですか?持ってなくても On Board書き込みできるので大丈夫です。でも、もし失敗すると、最悪の場合Biosが破壊され起動がまったくできない状態になるため、再書き込みが不能になり、自力で復旧できなくなります。
# 実は私もやりました (^^;
具体的危険は、cbromに与えるパラメータを間違える、awdflashで書き込む際に間違ったfileを指定する、awdflashが書き込みを行っている最中に電源を落としたりresetする等です。
手順どおり操作が行われたとすれば、リスクはメーカーから提供されたBIOSをUpdateする場合より高くなることはないと思いますが、実施される場合ご自分の責任で行うようお願いします。
ROM Writerがあれば、先ずバックアップをとってから作業しましょう。なしでやる方は、それなりの覚悟を決めてください。私になきつかれても、どうにもなりません。ディーラーによっては、供給FDまたは、自ら認めたデーター以外をBIOSに組み込むと保証規定を除外するところもあります。
ただしNetboot自身が本質的危険を持っているわけではありません。AdvantechでもBIOSにNetbootを組み込む方法があることはTechnical Notes で公開しています。
まず、Biosにnetbootを組み込んだイメージを作ります。
これには、biscuitに付属するUtility DiskのCBROMを使います。これは、BIOSメーカーのAwardのソフトウエアです。私の使ったものは、Utility disk Rev.1.30 (CBROM v1.06)です。
以下はDOS窓での作業になります。file以外のI/O操作はないので、DOSEMUでも多分大丈夫ですが試していません。
Utility Diskを作業ホルダーにコピーし、ここにnetbootのROM imageも持ってきます。先にFD imageを作ったときに同時にimage.romとして同時にできたはずです。
まず、オリジナルをコピーします。
copy 5862_crt.bin net.bin
中身をチェックします。
cbrom net.bin /d
CBROM v1.06
Copyright (c) Award Software, Inc. 1995-1996 All Rights Reserved.
net.bin include :
1. VGA driver (7000:0000) -- ..\DRIVER\186CRT.DAT
2. Other driver (1800:0000) -- e:\mbios\5862\driver\RBOOT16K.ROM
RBOOT16K.ROMを削除します。
cbrom net.bin /other 1800:0 Release
CBROM v1.06
Copyright (c) Award Software, Inc. 1995-1996 All Rights Reserved.
[Other] driver is released
代わりにnetboot imageを書き込みます。
cbrom net.bin /other 1800:0 image.rom
CBROM v1.06
Copyright (c) Award Software, Inc. 1995-1996 All Rights Reserved.
Adding image.rom .. 77.1%
念のため再チェックしましょう。
cbrom net.bin /d
CBROM v1.06
Copyright (c) Award Software, Inc. 1995-1996 All Rights Reserved.
net.bin include :
1. VGA driver (7000:0000) -- ..\DRIVER\186CRT.DAT
2. Other driver (1800:0000) -- image.rom
こうしてできたnet.binをawdflash.exeと共にMS-DOS起動用にFormatしたFDにcopyします。
これをbiscuitにつないだFDDに入れ、Bootします。
DOSが立ったら、awdflashを使いnet.binを書き込みます。
FDを抜いてResetし、Biosの設定で、Integrated Peripheralsにある、
Ethernet Boot Rom: Enable
を設定し、Save & Exitします。
さて、緊張の一瞬です。うまくbootしましたか?
さきに、「動作確認したのは、Netboot-0.8.1です。最新ベータテスト版の0.9.0dも試みましたが、tftp終了後rebootしてしまいうまく動作しませんでした。」とかきました。
詳しく書き足しますと、0.8.1のmknbi-linuxで作成した、bootImageを0.9.0dのimage.floでloadして立ち上げることには成功しています。0.9.xでは、tftpのブロックサイズをtftpdとネゴして大きくする機能があるため、そうした機能に対応するtftpd (netbootのdownload pageで提供されている)を使うと大変高速にloadできます。
できれば、mknbi-linuxのbugfixに貢献したいのですが、技が足りないのでerror reportを送っただけになっています (;_;)
# times reloaded.
(to be continued ?)