これでサーバーの設定はできました。 次はクライアントをブートさせるファイルを準備する必要があります。 これには二つのファイルが必要になります。 それは、カーネルと初期 RAM ディスク(initrd) です。 後者は、カーネルがルートファイルシステムとしてマウントするものです。 本文書では、本節と次節で概説した手順は、 クライアント機で作成したものとしています。 ディスクイメージの保存/リストアの際は、 普通ローカルのハードディスクに Linux をインストールする必要はありません。 でも、数多くのマシンにディスクイメージを配置する場合は、 各マシンのモデルとなる、 一台のマシンに Linux をインストールすることから始めて下さい。 DHCP を使い、前節で設定したことを TFTP クライアントでテストして下さい。 特に指定しない限り、コマンドは 現在のディレクトリ内で、 ユーザー root が bash シェルで実行します。
圧縮されたカーネルのファイルを特定します。
# 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 イメージを変更しても、 別のブートフロッピーディスクを作成する必要がなくなります。
次に、クライアント用にルートファイルシステムのイメージを作成します。 このファイルの完全なリストは、Appendix A にあります。
このファイルは、強力なシェル(bash)を用意するための、 最低限の設定として、動作中のシステムから持ってきました。 クライアント用のネットワークユーティリティ (dhcpcd や tftp)、 やコピー・圧縮ユーティリティ (dd, gzip)、 管理用コマンド (mknod や mount, 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 メガバイトの大きさがあれば、充分ファイルが保持できます。 必要ならサイズを大きくしてもかまいません。
# 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 にあります。
Note: 3c59x という名前を使っているところがあれば、 すべて自分のケースに合ったモジュール名に読み変えて下さい。
# 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 |