4. ブートファイルの準備

これでサーバーの設定はできました。 次はクライアントをブートさせるファイルを準備する必要があります。 これには二つのファイルが必要になります。 それは、カーネルと初期 RAM ディスク(initrd) です。 後者は、カーネルがルートファイルシステムとしてマウントするものです。 本文書では、本節と次節で概説した手順は、 クライアント機で作成したものとしています。 ディスクイメージの保存/リストアの際は、 普通ローカルのハードディスクに Linux をインストールする必要はありません。 でも、数多くのマシンにディスクイメージを配置する場合は、 各マシンのモデルとなる、 一台のマシンに Linux をインストールすることから始めて下さい。 DHCP を使い、前節で設定したことを TFTP クライアントでテストして下さい。 特に指定しない限り、コマンドは 現在のディレクトリ内で、 ユーザー rootbash シェルで実行します。

4.1. カーネル

圧縮されたカーネルのファイルを特定します。

# cd /boot
# ls vmlinuz-$(uname -r)
vmlinuz-2.4.18-3
			

このバージョンは、システムによって様々です。 このファイルを TFTP サーバーにアップロードし、 名前を vmlinuz に変えます。

# tftp 10.0.0.1
tftp> binary
tftp> put vmlinuz-2.4.18-3 vmlinuz
Sent 1030147 bytes in 2.3 seconds
tftp> quit
			

カーネルのファイル名は、ハードウェアが異なったり、 カーネルのバージョンによっては、 そのままにしておく必要があるかも知れないし、 別の名前にする必要があるかも知れません。 ここでは、カーネルと initrd に関して、 同じ名前を用います。 こうすれば、カーネルや initrd イメージを変更しても、 別のブートフロッピーディスクを作成する必要がなくなります。

4.2. initrd 上のファイル

次に、クライアント用にルートファイルシステムのイメージを作成します。 このファイルの完全なリストは、Appendix A にあります。

このファイルは、強力なシェル(bash)を用意するための、 最低限の設定として、動作中のシステムから持ってきました。 クライアント用のネットワークユーティリティ (dhcpcdtftp)、 やコピー・圧縮ユーティリティ (dd, gzip)、 管理用コマンド (mknodmount, fdisk それに insmod) もあります。

現在のディレクトリで、 initrd.lst という名前のディレクトリを作成し、 これらのファイルをそこに置いて下さい。 自分のシステムでこれらのファイルが存在するかどうかを確かめるには、 次のコマンドを実行して下さい。

# ls -d $(<initrd.lst) > /dev/null
			

以下のようなエラーが出力されるはずです。

ls: /bin/clone: No such file or directory
ls: /bin/tftp: No such file or directory
ls: /lib/3c59x.o: No such file or directory
			

最初のエラーは、 現在のディレクトリに作ることになっているスクリプトです。 二番目のエラーは、 /bin ではなく、 /usr/bin ディレクトリで見つかった tftp プログラムです。 三番目はネットワークインタフェースカードのモジュール (たぶん自分のではないでしょう)で、 /lib/modules/$(uname -r)/kernel/drivers/net で見つかったものです。

この三つのファイルについては、以降の節で個別にすぐ論じます。 他にも無いファイルがあれば、 インストールのし忘れとか、バージョンの違い、 ディストリビューションやハードウェアの違いを調べて下さい。 そして、このリストは自分のシステムの合うように調整して下さい。

4.3. initrd の作成

次はイメージを作成する段階です。 本文書での設定だと、 4 メガバイトの大きさがあれば、充分ファイルが保持できます。 必要ならサイズを大きくしてもかまいません。

# dd if=/dev/zero of=initrd bs=1024 count=4096
4096+0 records in
4096+0 records out
# yes | mkfs initrd
mke2fs 1.27 (8-Mar-2002)
initrd is not a block special device.
Proceed anyway? (y,n) Filesystem label=
blah blah blah...
# mkdir mnt
# mount -o loop initrd mnt/
# egrep -v "clone|3c59x|tftp" initrd.lst | cpio -pdm mnt
4876 blocks
			

さて、egrep コマンドで、 ファイルが三つ除外されました。 そこで、tftp プログラムを、 /usr/bin から イメージディレクトリにコピーします。

# cp -p /usr/bin/tftp mnt/bin/
			

ネットワークインタフェースカード用には、 正しいモジュールを特定して下さい。 そのファイルを特定するには、 lspci コマンドと、 lsmod コマンドの出力を用います。 そのモジュールは、 /lib/modules/$(uname -r)/kernel/drivers/net にあります。

# cp -p /lib/modules/$(uname -r)/kernel/drivers/net/3c59x.o mnt/lib/
			

Appendix B にあるクローンスクリプトを編集して、 Section 6 で説明した変数を変更します。 そのファイルを実行可能なパーミッションにして、 イメージディレクトリにコピーして下さい。

# chmod +x clone
# cp -p clone mnt/bin/
			

initrd イメージをアンマウントし、圧縮してから、 TFTP サーバーに送ります。

# umount mnt/
# gzip initrd
# tftp 10.0.0.1
tftp> binary
tftp> put initrd.gz
Sent 1155530 bytes in 2.8 seconds
tftp> quit