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

上に戻る

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

起動フロッピーディスク作成

物理メディア作成

いよいよ、物理的な起動フロッピーディスクを準備します。ここに、ブートローダと、圧縮したカーネルと、圧縮した1FDイメージファイルを書き込んで終わりです。
下手なメディアを使うと、一見正常に見えて起動時に読み込みエラーになるとか、とかくトラブルの元になるので、絶対に信頼のおけるメーカーの新品のメディアを用意してください。

# fdformat /dev/fd0.1440
# disklabel -wB fd0 fd1440
# newfs -c 1 -i 131072 -o space -m 0 /dev/rfd0.1440 fd1440
# mount /dev/fd0c /mnt
# mkdir /mnt/boot
これで物理フロッピーを/mntにマウントして、bootディレクトリを作成しました。

bzip2対応ローダの作成とコピー

物理フロッピー上に/boot/loaderを作るわけですが、圧縮率向上のため、bzip2したカーネルを展開できるようにします。
loaderのソースは、/usr/src/sys/boot/i386/loader にあります。
forth無効、gzip無効、bzip2有効のloaderを作るには、

# cd /usr/src/sys/boot/i386/loader
# make -DNOFORTH -DLOADER_NO_GZIP_SUPPORT -DLOADER_BZIP2_SUPPORT
とやって作ります。ファイルが足りん!と言われてmakeが途中で終了した場合は、/usr/srcに移動し、makeを実行することにより、必要なオブジェクトファイルが作成され、今度はちゃんとloaderのコンパイルが出来るはずです。
ちなみに、手元で実験してみた結果、
  • デフォルトのローダ(forth・gzip有効):155648バイト
  • forth無効・gzip有効:114688バイト
  • forth無効・gzip有効・bzip2有効:135168バイト
  • forth無効・gzip無効・bzip2有効:114688バイト
と言った感じでした。出来上がったloaderをkgzipしてフロッピーにコピーします。
# mkdir /mnt/boot
# kgzip -o /mnt/boot/loader loader
loaderは、/boot/loader.rcを読み込むので、これを作成します。
/mnt/boot/loader.rcの内容は、以下のとおり。
load /kernel
load -t mfs_root /mfsroot
autoboot 1

カーネルと1FDイメージファイルの圧縮とコピー

あとは、作成したカーネルと、メモリ上に展開される1FDイメージファイルを圧縮してフロッピーに入れるだけです。
ところで、bzip2対応のloaderを作ったわけですが、これが圧縮率の高いbz2ファイルは展開できないようです。
bzip2 -1で圧縮すれば展開できるので、これで圧縮してコピーします。

# bzip2 -1c /usr/src/sys/compile/1FD_FreeBSD/kernel >/mnt/kernel.bz2
# bzip2 -1c /root/fd/mfsroot.img >/mnt/mfsroot.bz2

設定ファイルの作成

柔軟な設定を可能にするため、物理フロッピーディスク上に作成したrcファイルを実行する設定にしました。必要に応じて、これを設定します。
以下、/mnt/rcの設定例です。

#!/bin/sh
/bin/ifconfig de0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig em0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig txp0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig vx0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig dc0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig fxp0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig pcn0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig rl0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig sf0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig sis0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig ste0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig tl0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig tx0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig vr0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig wb0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig xl0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig bge0 inet 10.123.234.1 netmask 255.255.255.0
/bin/ifconfig ed0 inet 10.123.234.1 netmask 255.255.255.0

tcpserver -RHl0 -c250 0 10000 sh -c "dd if=/dev/ad0 bs=16384|bzip2 -1vvc" &
#tcpclient -RHl0 10.123.234.1 10000 sh -c "/bin/cat<&6"|bzip2 -dvvvc|dd of=/dev/ad0 &
見れば分かると思いますが、まずifconfigでインターフェースの設定をします。もし、複数のNICが刺さっていて、しかも同一のアドレス空間に接続されている場合は問題が起きますが、普通はそんなことは無いでしょうから…。
一番下の二行は、今回の1FDディスクデュプリケータのメイン部分です。

tcpserverの行は、コピー元となるマシンの場合有効にしてください。
tcpclientの行は、コピー先となるマシンの場合有効にしてください。

これを間違えると死にますので御注意を。
なお、サーバ側の同時接続数は -cオプションで設定します。とりあえず250台にしてありますので、同時に250台まで並列処理できます。もっとも、ネットワーク的/サーバのディスク読み取り速度的に、どれだけ時間が掛かるか分かりませんが…笑。
例として、コピー先マシンの設定例を挙げておきます。
#!/bin/sh
/bin/ifconfig de0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig em0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig txp0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig vx0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig dc0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig fxp0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig pcn0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig rl0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig sf0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig sis0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig ste0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig tl0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig tx0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig vr0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig wb0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig xl0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig bge0 inet 10.123.234.2 netmask 255.255.255.0
/bin/ifconfig ed0 inet 10.123.234.2 netmask 255.255.255.0

#tcpserver -RHl0 -c250 0 10000 sh -c "dd if=/dev/ad0 bs=16384|bzip2 -1vvc" &
tcpclient -RHl0 10.123.234.1 10000 sh -c "/bin/cat<&6"|bzip2 -dvvvc|dd of=/dev/ad0 &
IPアドレスは、コピー元と同じアドレス空間で適当に設定します。
設定後は、xビットを立てておきましょう。
# chmod +x /mnt/rc
後は、フロッピーをアンマウントすればおしまい。
試しに、フロッピーから起動させてみましょう。ちゃんと起動しましたか?送出元/送出先のメディアを突っ込んだ二台のPC間で、データ転送が行われましたか?くれぐれも、ディスクが消えては困るパソコンで、間違えてデータ書き込みをしないように。その辺は自己責任でどうぞ。

応用、など

今回、フロッピーから起動させた二台のPC間でのディスクコピーツールを作成しましたが、別に集中的なデータサーバを置いておき、正常起動時のディスクイメージをネットワーク経由で保存しておき、障害時にそこからデータを取得して書き戻す、なんてシステムもちょっと工夫すれば簡単に出来上がります。
「瞬快」等の専門ツールに比べれば手間も時間も掛かりますが、なんと言っても原材料費無料で作れるのが嬉しいところ。
専門学校などで、学生にLinuxなどの実習をさせる場合、学生に自由に使わせた後、予め作成しておいた標準環境に書き戻す、なんて場合が一番威力を発揮しそうな気がします(ライセンス的にも。) Windowsの場合、基本的にはこのような方法で複製を作るのはまずいですが、ディスクのスナップショットを保存する集中サーバを用意し、個別に書き戻すのであれば問題ない気がします。
復元に一晩掛かるのが欠点ですが、学校などの場合、一日の終わりや一週間の終わり等のタイミングで環境を元に戻す、なんて場合には有効かもしれません。
何か質問等ありましたらメールください。