Linux Biscuitのおいしい食べ方


このページはアドバンテックのワンボードコンピューターBiscuit PCでLinuxをDisklessで使う方法を紹介します。具体的な設定や、Netbootを使用する実例を示しますので、このボードでなくても、Diskless Linux Machineに興味があれば参考にしていただけると思います。

このページは が個人的に作成したもので、 株式会社リサーチ、アドバンテック社とは何等関わりありません。 また書いている内容は、利用者に良い結果を与えることを期待して書いたものですが、 間違いを含んでいたり期待しない結果を招く危険があります。はそれら一切について何も保証できませんし、 質問にお答えする用意もないことをあらかじめご了承の上、すべてご自身の責任において実施するようお願いします。
追試、具体的改善案等はもちろん大歓迎です。ただしこちらの 注意書 を読んでからにしてください。記述内容は、主にが行ったことを元に書いているので、「必要がある」、「しなくてはならない」と表現されていても、別のやり方で行えば、必要なかったり、もっとよい方法があるかもしれません。このページの著作権はが所有します。非営利的な複製、利用はご連絡いただく必要ありません。営利的な使用については事前にご相談ください。Biscuit PCを、おいしく召し上がれるのは、Linuxのペンギン君です。 人間が食べたり、動物園のペンギンのエサにしたりしないよう十分注意してください。

Biscuit PCとは

アドバンテック(Advantech Co., Ltd.)が、作っている組み込み用のシングルボードコンピュータです。
なかでも、 PCM-5862 は、 16C550A互換serial 4 ports, SPP/EPP/ECP parallel 1 port, ESS1868 audio, NE2000互換 NIC (10Base-T), PCI Bus, P104 Bus, FDD port, E-IDE port, USB, Keyboard, PS/2 mouse I/F, C&T 65550 Videoが載っているSiS5571 chip set のテンコ盛りカードで、 これ一枚でPC/AT互換機の機能全部を持っていると言って良いでしょう。
は、このカードを linux-users ML で紹介された、 mp3mobileのページ で知って以来大変興味を持ちました。
以下がこのカードを使って試したこと、 具体的な設定方法を暇を見て書き足していきたいと思います。

なお、PCM-5862E (100Base-Tx)は、NICにRealTek RTL8139を使っているので、ここに書いた方法をそのまま使えません。Packet-Driverは付属すると思われるし、Linux driverはサポートされているようなので、機会があればこのボードも実験してみたいと思いますが、今のところは未確認です。


Biscuitの写真

 基板の表面(53KB)、裏面(36KB)、斜め上から (66KB)の写真を示します。
Pentiumの大きさを考えていただくと大きさが想像できるでしょう。


Network Boot

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)のシングルボードでそれができるって、かなり感動的で使わない手はないと思うのはだけでしょうか?


用意するもの

Linux kernel

入手に困ることは多分ありませんね :)
すでに、持っているかも知れません。

Netboot

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_)

Linux Server

Network Bootするには、NFS, TFTP, RARP, BOOTPをサービスするServerが必要です。Linuxでなくても、これらをサポートしていれば、使用できますが、Linuxなら、Serverが持っている多くのバイナリーをShareできるので、Disk spaceを相当節約できます。また、diskless machineのためにシステムを作成する開発機としてそのまま使用できます。

は、Red Hat Linux 4.2をベースにしたLinux Boxを使っています。以下の記述はこのマシンを基準に書きますので、その他のパッケージでは、異なる場合があると思います。

Biscuit PC

は、 (株)ミスミ の通信販売で買いました。CPU, Memoryなしで57,000円でした。
ミスミ殿よりBiscuit PCを購入する場合 注意事項 をご了承の上、ご使用くださるようお願いします。

株式会社フォークスプロサイド株式会社 でも入手可能です。

電源は外付けHDDのジャンクからとりました。その他周辺機器は、一時的にほかのPCから外してきたものです。

PCM-5862には複数のリビジョンがあり今後も増える可能性があります。が動作を確認したのはRev.B101-1です。


Netbootのinstall

netbootのsourceを適当な場所にtarで展開した後そこへ移動し、

% ./configure
% make
% su
# make install

で、問題なくいけると思います。ついでに、boot用のFDも作っておきましょう。

%  make bootrom
すると、いろいろ尋ねてきますので、返事します。
log を置いておきます。

% dd if=image.flo of=/dev/fd0

でFDに書き込みます。わずか13178 byteです。


Diskless Machine用のBoot Image

disklessのためのroot directoryの準備

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したほうが安全に作業できます。

diskless kernelの構築

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

ServerのKernelは、rarpをサポートする必要があります。
Serverのkernelを構築したときの、.configに、

CONFIG_INET_RARP=y

があるのを確認してください。
もし、そのように設定されていない場合、Kernelを再構築します。

bootpd

/etc/bootptabを設定します。の場合は こう です。
ha=の後ろは、biscuitのEthernet MAC addressですが、起動しないとわかりませんね。
後で設定しなおす事にしてこのままにしておいて結構です。

nfs

diskless machineに使用させるdisk spaceをexportします。
設定は、/etc/exportsで行います。 設定例を ここ に示します。
/etc/exportsを変更したら、 rpc.mountd, rpc.nfsd を再起動します。
 

inet

/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`


とりあえずFD起動

ここまでくれば、とりあえず起動できると思います。
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

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

TFTPの試験はServer自身またServerにアクセスを許可されている別のマシンから、実際にtftpコマンドを使いファイルを取り出してみればよいでしょう。
実際には次のコマンドを入力します。

# cd /tmp
# tftp tftp-server
get  /tftpboot/192.168.1.100/bootImage


ROMから起動させる

/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を組み込む

まず、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
 

BIOSを書き換える

こうしてできた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 ?)