入場者数
kema's web TopWho is kema?電気・回路無線コンピュータ
バイク鉄道関係妙な写真・イラストkema's料理ゲーム関係

上に戻る

1:カーネル構築
2:Crunched Binary作成
3:1FDディスクイメージ作成
4:起動フロッピーディスク作成
2:Crunched Binary作成

Crunched Binary作成編

Crunched Binaryとは

1FD FreeBSDのカーネルを作成したら、次はcrunchされたバイナリを作成します。crunched binaryとは、引数の取り方によって挙動を変える、実体としては単一のバイナリファイルです。
例えば、"prog"という単一のバイナリに、cat,ls,cd,dd,pingという複数の機能を持たせて、

# prog cat /etc/services ←"cat /etc/services" と同じ動作をする
# prog ls /usr/local/ ←"ls /usr/local/" と同じ動作をする
# prog cd /etc/ ←"cd /etc/" と同じ動作をする
# prog dd if=/dev/ad0 of=/dev/ad4 ←"dd if=/dev/ad0 of=/dev/ad4" と同じ動作をする
# prog ping 192.168.0.5 ←"ping 192.168.0.5" と同じ動作をする
…と言った具合です。たくさんの機能を詰め込めばそれだけサイズは大きくなりますが、コマンドを厳選してやれば、十分にフロッピー1枚に詰め込むことができます。
それでは、crunched binaryの作り方を説明します。

必要なコマンドを挙げる

まず最初に、どのコマンドを詰め込むか取捨選択します。とりあえず私が選んだものは以下の通りです。

bzip2
cat
dd
gzip
ifconfig
init
ls
mount
ping
sh
shutdown
umount
ここまでが、FreeBSDのシステムで標準で用意されているコマンドです。
tcpclient
tcpserver
この二つは、ネットワーク経由でのHDイメージ送出・受取に用います。
tcpserverは、DJBのucspi-tcpに入っているものを使いました。入手元は、
http://cr.yp.to/ucspi-tcp/install.html
です。DJBは好き嫌いが分かれるとは思いますが(笑)。
システムに標準で用意されていない外部プログラムをcrunched binaryに取り込むテクニックはこの後で示します。

作業ディレクトリの作成

どのコマンドを取り込むかを決めたら、作業ディレクトリを作ります。私は、/root/fd/ に1FD FreeBSD作業用ディレクトリを作ったので、更にその下にcrunchディレクトリを作成し、そこで作業することにしました。フルパスは/root/fd/crunch/ になります。

実行バイナリ名の決定

crunche binaryの名前を決めます。これは別に何でもいいのですが、私は"execimg"にしてみました。

crunchgen設定ファイルの作成

いよいよ、crunched binaryの作成に入ります。まずは設定ファイルを作ります。
私は"execimg"というバイナリ名にしたので、/root/fd/crunch/execimg.conf という設定ファイルになります。
このファイルの内容は以下の通りです。

srcdirs /usr/src/bin
srcdirs /usr/src/sbin
srcdirs /usr/src/gnu/usr.bin
srcdirs /root/fd
srcdirs /usr/src/usr.bin
libs -lcrypt -ll -lm -lutil -lbz2 -lipx -ledit -ltermcap -lgnuregex

#/bin
progs cat dd ls sh
#/sbin
progs ifconfig init mount shutdown umount
#/usr/bin
progs bzip2 gzip
#others
progs tcpclient tcpserver
この内容で設定ファイルを保存しました。
さて、この段階で早速crunchgenを実行すると、
# crunchgen -f execimg.conf
crunchgen: warning: could not find source directory: execimg.conf: tcpclient
crunchgen: execimg.conf: tcpclient: warning: could not find any .o files
crunchgen: warning: could not find source directory: execimg.conf: tcpserver
crunchgen: execimg.conf: tcpserver: warning: could not find any .o files
crunchgen: execimg.conf: tcpclient: ignoring program because of errors
crunchgen: execimg.conf: tcpserver: ignoring program because of errors
Run "make -f execimg.mk" to build crunched binary.
と言われてしまいます。
要するに、標準でシステム内に用意されているプログラム以外は、ソースファイルのある場所が分からん!と言われてるわけです。
そこで、まずはそのソースディレクトリを用意します。

tcpclientとtcpserverの展開、コンパイル、ソースディレクトリの準備

ucspi-tcp-0.88.tar.gzを、/tmpで展開しました。

# tar xvfz ucspi-tcp-0.88.tar.gz
すると、/tmp/ucspi-tcp-0.88/ にソースが展開されます。ここに移動してmake。
# cd ucspi-tcp-0.88
# make
これでオブジェクトが作成されます。次に、crunchgenの要求により、コマンド名に対応するディレクトリを作成し、そこに必要なファイルをコピーしてやります。
# mkdir /root/fd/tcpclient
# mkdir /root/fd/tcpserver
# cp * /root/fd/tcpclient/
# cp * /root/fd/tcpserver/
これでやっとcrunchgenが通・・・りません。試しにやってみると、
# crunchgen -f execimg.conf
crunchgen: execimg.conf: tcpclient: warning: could not find any .o files
crunchgen: execimg.conf: tcpserver: warning: could not find any .o files
Run "make -f execimg.mk" to build crunched binary.
と言われるはずです。
FreeBSD日本語マニュアルによると、
crunchgen ユーティリティは特殊な要件をパッケージの Makefile に課しており、このことが原因で Makefile が非 BSD ソース用に使えなくなっています。特に、 Makefile はターゲット depend を含むことが必要であり、全オブジェクトファイルを変数 OBJS で定義することが必要です。場合によっては、偽のMakefile を使えるでしょう。 crunchgen は、ソースディレクトリ foo 中のMakefile を見る前に、現在のディレクトリ中の Makefile.foo を見ます。
とあります。そこで、tcpclientとtcpserver用に、それぞれのディレクトリのMakefileを書き換えます。
/root/fd/tcpclient にあるMakefileは、
PROG = tcpserver
OBJS = tcpserver.o rules.o remoteinfo.o timeoutconn.o cdb.a dns.a time.a unix.a byte.a
と書き換えます。同様に、/root/tcpserver/Makefile は、
PROG = tcpclient
OBJS = tcpclient.o remoteinfo.o timeoutconn.o dns.a time.a unix.a byte.a
と書き換えました。これで、crunchgenを実行してみます。
# cd /root/fd/crunch/
# crunchgen -f execimg.conf
エラーが出なければOKです。さて、この段階でmakeを実行しても、まだエラーとなるはずです。
原因は、execimg.mkの中で、tcpserverとtcpclientの部分で、"make depend;make〜"の部分に対応するMakefileの記述が、それぞれのビルドディレクトリにあるMakefileに記述されていないためです。
しかし、tcpserverやtcpclientを作成するのに必要なオブジェクトファイルは既にあるので、execimg.mkの該当部分を単に削除してやるだけでmakeが通るはずです。

(この辺の実機の記述を記録し忘れたため、後日追ってこの部分記述する予定)
# make -f execimg.mk
(途中省略)
cc -static -o execimg execimg.o cat.lo dd.lo ls.lo sh.lo ifconfig.lo init.lo mount.lo shutdown.lo umount.lo bzip2.lo gzip.lo tcpclient.lo tcpserver.lo -lcrypt -ll -lm -lutil -lbz2 -lipx -ledit -ltermcap -lgnuregex
strip execimg
エラーが出なければ、無事crunched binary作成完了です。
エラーが出る場合のチェックポイントは、
  • execimg.confの中で、必要とするライブラリの列挙に漏れが無いか
  • システム標準で用意されているツール以外のものを取り込んだ場合、Makefileが要求仕様通りか
といった辺りをチェックしてみてください。
Makefileを書き換えたりと、少々敷居が高いですが、この方法で実際に問題なくコンパイルできていますので、大丈夫だと思います。
カーネル、クランチバイナリが作成できれば、次はいよいよフロッピーの作成です。