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

上に戻る

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

1FDディスクイメージ作成

わざわざ1FDイメージファイルを作成する理由

1FD用のカーネルを作成し、shをはじめとしたcrunchされたツールを準備したら、次は1FDのディスクイメージの作成です。
これは何故かと言うと、実体としてのフロッピーディスク上には、圧縮されたカーネルと1FDのイメージを用意し、ブートローダからカーネルをメモリに展開、そして圧縮された1FDのイメージをメモリ上に展開し、そのイメージをマウントして動作させるという動きになるからです。
勿論、カーネルやツールを圧縮することなく1FDに収められればそんな面倒なことは必要ないのですが、機能を削ったカーネルだけでも1.8MBほどあるため、こういった面倒な手法を使わざるを得ないのです。
さて、メモリ上に展開する1FDのイメージを作成します。

# cd /root/fd/
# dd if=/dev/zero of=mfsroot.img count=1440 bs=1024
これでひとまず1.44MBの空のファイルが出来ました。
# vnconfig -s labels -c /dev/rvn0 mfsroot.img
これで、作成したファイルを仮想的にマウントできるようになります。そして、ファイルシステムとしてマウント可能にするため、ディスクラベルを書き込みます。これは、「俺は1.44MBのフロッピーだよ?」と宣言するためのもので、これが無いと正常にマウントできないという具合。
# disklabel -w -B vn0 fd1440
そして、ファイルシステムを作成。
# newfs -i 4000 -o space -m 0 /dev/rvn0c
これでマウントして読み書きできるようになります。
# mount /dev/vn0c /mnt
以降、展開後のフロッピーイメージを/mntに対して構築していきます。その実体は/root/fd/mfsroot.imgにあり、作業終了後は/mntをアンマウント、そしてmfsroot.imgを圧縮してフロッピーにコピーしてやるわけです。

1FD ディスクイメージ上にディレクトリを作成

1FDイメージ上にディレクトリを作成します。

# cd /mnt
# mkdir dev etc fd
この中でfdというのは、圧縮されたFDイメージが展開された後、元の物理的なフロッピーは切り離されてしまう(マウントされない)ため、改めて物理的なフロッピーディスクをマウントし直すために作ってあります。
起動シーケンスの中で元のフロッピーディスクをマウントし、そこに記述した起動スクリプトを実行することで、設定を柔軟に変更することが出来るわけです。
(1FDイメージファイルの構成を変えるためには、一旦vnデバイスに結び付けてマウントし、マウントした上で作業して、それを再度圧縮してフロッピーに書き戻すという非常に面倒な作業になるので、1FDイメージファイルは、一旦出来上がってしまえば、あとは極力いじりたくないわけです)
それから、/binと/sbinを作成します。といっても、/に対するシンボリックリンクですが。
# ln -s . bin
# ln -s . sbin

デバイスファイル作成

# cd /mnt/dev
# cp /dev/MAKEDEV .
# sh MAKEDEV std fd0 ad0
これで必要なデバイスファイルが作成されました。後はMAKEDEVは用済みなので消してしまって構いません。
# rm MAKEDEV

crunched binaryをコピー

既に作成済みのcrunched binaryを仮想FDイメージ上にコピーします。そして、中に織り込んだコマンドの数だけ、ハードリンクを作成します。

# cd /mnt
# cp /root/fd/crunch/execimg .
# ln execimg cat
# ln execimg dd
# ln execimg ls
# ln execimg sh
# ln execimg ifconfig
# ln execimg init
# ln execimg mount
# ln execimg shutdown
# ln execimg umount
# ln execimg bzip2
# ln execimg gzip
# ln execimg tcpclient
# ln execimg tcpserver

/etc/rcを作成

1FDイメージが展開された後実行される/etc/rcを作ります。
といっても、ネットワークの設定その他は、1FDイメージからマウントした物理フロッピーの中に書くので、ここでは単に物理フロッピーのマウントを行うだけでOKです。
以下、/mnt/etc/rcの内容です。

#!/bin/sh
/sbin/mount -r /dev/fd0c /fd
/bin/sh -c '/fd/rc' &
/bin/sh
というわけで、物理フロッピーをマウントし、そこに書いたrcを実行し、shを立ち上げるだけです。

無駄領域をゼロパッド

作成した1FDイメージを圧縮する際、圧縮率を上げるために空き領域をゼロで埋めると良いらしいのですが、実際に処理前と処理後でサイズを比較したところ、むしろ処理前の方が圧縮率が良かったりしました。多分たまたまだと思いますが、それほど劇的な効果がある訳でもなさそうです。(場合にもよるでしょうが)
ギリギリまでコマンドを詰め込んだ場合などは、空き領域をゼロパッドするよりも、一旦dumpして新しく作成したイメージにrestoreしてやると良いみたいです。私はそこまでするほど容量がカツカツでもないので、その効果がどれほどかは良く分かりません。
一応、ゼロパッドの方法は、

# dd if=/dev/zero of=/mnt/a
# rm /mnt/a
といった具合です。
余談ですが、Windowsのシステムディスクなどは、defragした後空き容量をゼロパッドすることにより、物理ディスクイメージファイルの圧縮後サイズが劇的に小さくなったりします。

アンマウント

最後はアンマウントして終わりです。

# cd /root/fd
# umount /mnt
これで、編集作業が反映したmfsroot.imgファイルが出来上がりました。