Appendix Bで示している、 clone スクリプトは必須ではありません。 init=/bin/bash をカーネルパラメータにして、 利用可能なコマンドやプログラムが実行できるシェルで終ってもかまいません。
このスクリプトをここに表したのは、 正式なやり方のコマンドを示し、 タイプミスから被害が生じる可能性を減らすためです。 tftp_server や nic_module、 major_a、 family_a それに image_a といった変数は、 自分の環境やアプリケーションの合わせて変更する必要があります。
注意して欲しいのは、配列 major_a と配列 family_a は対応しているということです。 所定のファミリー名に誤ったメジャー番号を与えると、 ユーザーに誤解を招くことになります。 重要なデバイス(ディスクとパーティションの全体) のメジャー番号とマイナー番号は、 /dev ディレクトリのリストでわかります。 メジャー番号とマイナー番号は、 ls -l コマンドの出力にある、カンマで区切られた、 通常のファイルだとファイルサイズがある場所にあります。
# ls -l /dev/fd0 /dev/hda /dev/hda1 /dev/hdc brw-rw---- 1 root disk 2, 0 Apr 11 11:25 /dev/fd0 brw-rw---- 1 root disk 3, 0 Apr 11 11:25 /dev/hda brw-rw---- 1 root disk 3, 1 Apr 11 11:25 /dev/hda1 brw-rw---- 1 root disk 22, 0 Apr 11 11:25 /dev/hdc |
set -e コマンドは、 シェルにスクリプトをアボートするよう指示するもので、 ゼロ以外のコードが返るはずです。 通常の終り方のように、 "Kernel panic: Attempted to kill init!" というメッセージがそれに続きます。 でも、うろたえないで!この環境では、これが普通なのです。 コンピュータを落とすだけでかまいません。 スクリプトを終らせてこの見苦しいメッセージを避ける前に、 Ctrl-Alt-Del を押して、きちんとリブートして下さい。
insmod コマンドは、 ネットワークインタフェースモジュールをロードするコマンドで、 dhcpcd コマンドは、 DHCP クライアントをスタートさせるコマンドです。 Grub がそのブート中に DHCP を使用したということと、 Linux が同じことをしたということが、 無関係なことに注意して下さい。
このスクリプトでは、各々繰り返しを行なうために、 大きなループ処理を行なっています。 まず、次の三種類の操作の中のどれを行なうかを訊いてきます。 ネットワークからデバイスへのコピー、 デバイスからネットワークへのコピー、 fdisk の実行。 次に、使用するブロックデバイスがどれかを訊いてきます。 major_a 配列は、 使用できるブロックデバイスのメジャー番号を持っています。 また、family_a には、 デバイスファミリー個々の名称が入っています。 その後、使用するブロックデバイスのマイナー番号を訊いてきます。
コピー操作の内の一つを選ぶと、 スクリプトは保存ないしはリストアするイメージの名前を訊いてきます。 イメージ名称は、image_a 配列の要素に限定されています。 その名前が存在しなければ、イメージと同じ名前の、 名前付きパイプを作ります。 最後に、dd と tftp を同時に起動し、 イメージを転送します。 いつもの ftp とは違い、 tftp は名前付きパイプを、 ちょうど普通のファイルのように put したり get したりします。
fdisk を選ぶと、ブロックデバイスに対して起動されます。 fdisk は普通、一つのパーティションではなく、 逆にディスク全体に対して実行されます。 注意して欲しいのは、 通常 /dev/hda と呼んでいるものが、 clone スクリプトでは /dev/hda0 となることです。 お望みなら、スクリプト中に fdisk を置いて、 パーティション生成を自動化することも可能です。