これらの各フェーズについて、以降で詳しく記述します。
最初に、ステージ 1 ブートストラップがステージ 2 ブートプログラムを ネットワーク経由でロードします。 ステージ 1 ブートストラップは典型的には BOOTP か DHCP を使用して読み取るファイル名を取得し、 TFTP を使用してそのファイルをロードします。 このファイルは典型的には pxeboot と呼ばれ、 /boot/pxeboot からサーバの TFTP ディレクトリに、典型的には /tftpdir にコピーされるべきです。
それから、 ステージ 2 ブートプログラムが追加モジュールとカーネルをロードします。 これらのファイルは DHCP サーバや BOOTP サーバには存在しないかもしれません。 DHCP 設定で使用可能な next-server オプションを使用して、 ステージ 2 ブートファイルとカーネルを持つサーバを指定可能です。 ステージ 2 プログラムは、 NFS または TFTP を使用してこれらのファイルを取得します。 デフォルトでは NFS が使用されます。 pxeboot(8) を使用している場合、 /etc/make.conf に LOADER_TFTP_SUPPORT=YES を設定し、 下記の方法で pxeboot(8) を再コンパイルおよび再インストールすることで TFTP を使用するバージョンをインストール可能です。 しばしば TFTP を使用することが必要となりますので、 /tftpdir/ にカスタムカーネルを置くことができます。 NFS を使用するが クライアント用にカスタムルートファイルシステムを持たない場合、 ステージ 2 ブートは、サーバのカーネルを マシン用のカーネルとしてロードしますが、 これはあなたの期待する動作ではないかもしれません。
cd /usr/src/sys/boot/i386 make clean; make; make install cp /boot/pxeboot /tftpdir/
フェーズ 3 では、カーネルは以下の 2 つの方法のどちらかで IP ネットワーク設定を獲得し、ルートファイルシステムのマウントに進み、 動作を開始します。 フェーズ 2 のローダが、カーネル環境を使ってカーネルにネットワーク設定を 渡せるのなら、カーネルはその情報を使ってネットワークインタフェースを設定します。 そうでない場合、 DHCP や BOOTP を用いて設定情報を獲得しないとなりません。 ブートスクリプトは 起動を認識し、 /etc/rc.d/initdiskless および /etc/rc.d/diskless 中の動作を実行します。 古いシステムでは、スクリプトは /etc/rc.diskless1 と /etc/rc.diskless2 です。
<ROOT> -ro -maproot=0 -alldirs <list of diskless clients> /usr -ro -alldirs <list of diskless clients>
ここで Aq ROOT は、ルートパーティションのサーバ上でのマウントポイントです。 スクリプト /usr/share/examples/diskless/clone_root を使い、共用可能な読み込み専用ルートパーティションを 生成することができます。 しかし、多くの場合、サーバ自身が使用するルートディレクトリを (読み込み専用で) エクスポートさせると決めることもできます。
.default:\ hn:ht=1:vm=rfc1048:\ :sm=255.255.255.0:\ :sa=<SERVER>:\ :gw=<GATEWAY>:\ :rp="<SERVER>:<ROOT>": <CLIENT>:ha=0123456789ab:tc=.default
Aq SERVER , Aq GATEWAY , Aq CLIENT , Aq ROOT の意味は明らかでしょう。
普通は、ディスクレスブートにおいてはサーバの rc.conf や rc.local とは異なるものを使いたいでしょう。 ブートスクリプトは、(ルートの他のサブディレクトリと同様) /etc 中の様々なファイルをオーバライドする機構を提供します。 スクリプトは 4 個のオーバライドディレクトリ /conf/base /conf/default /conf/<broadcast-ip> /conf/<machine-ip> を提供します。 サーバの /etc を マシン上で完全に置き換える /conf/base/etc を、常に作成すべきです。 ここで、サーバの /etc を複製することが可能ですし、サーバの /etc を /conf/base/etc へマウントすることを ブートスクリプトに対して指示する 特殊ファイルを作成することも可能です。 これは、 マシンの /etc の元となるマウントポイントを含むファイル /conf/base/etc/diskless_remount を作成することで実現されます。 例えば、このファイルの中身は次のようになります:
10.0.0.1:/etc
代りに、サーバが独立したルートを複数持つ場合、 このファイルは次のようになります:
10.0.0.1:/usr/diskless/4.7-RELEASE/etc
これは動作しますが、 /usr/diskless/4.7-RELEASE を /usr/diskless/4.8-RELEASE へコピーしてインストールを更新すると、この移動を反映するように diskless_remount を変更する必要があるでしょう。 これを避けるために、 diskless_remount ファイル中のパスで / で開始するものの実際のパスは、 クライアントのルートをこれらの前に付けたものになります。 これにより、このファイルには次のように書けます:
/etc
スクリプトは、 オーバライドされたディレクトリを保持するために、 メモリファイルシステムを作成します。 わずか 2MB パーティションがデフォルトで作成されますが、 用途によっては足りないかもしれません。 この動作を変えるには、 このディレクトリ用のメモリディスクの大きさを 512 バイトセクタ数単位で示す、ファイル /conf/base/etc/md_size を作成します。
その次に、典型的には、ファイル毎のオーバライドを /conf/default/etc ディレクトリにて提供します。 最低でも、 /etc/fstab /etc/rc.conf /etc/rc.local のオーバライドを /conf/default/etc/fstab /conf/default/etc/rc.conf /conf/default/etc/rc.local で指定する必要があります。
オーバライドは階層的です。 ネットワーク固有のデフォルトを /conf/ Ao BROADCASTIP Ac /etc ディレクトリ中で提供可能です。 ここで、 Aq Ar BROADCASTIP は、 BOOTP にてディスクレスシステムに与えられる、 システムのブロードキャストアドレスを示します。 diskless_remount および md_size の機構はこれらのディレクトリ中のいかなるものに対しても動作します。 コンフィギュレーション機能は /etc 以外のディレクトリに対して動作します。 置換やオーバライドしたいディレクトリを /conf/{base,default,<broadcast>,<ip>}/* 中に作成することで、 /etc と同様に動作します。
通常は /conf/base/etc/diskless_remount を使用してサーバの /etc を複製しますので、 メモリファイルシステムから不要なファイルを削除したいかもしれません。 例えば、サーバはファイアウォールを持つがディスクレスではそうでない場合、 /etc/ipfw.conf を削除したいと思うでしょう。 /conf/base/ Ao DIRECTORY Ac .remove ファイルを作成することで、これは実現可能です。 例えば、 /conf/base/etc.remove に相対パスを列挙すると、 ブートスクリプトがこれらをメモリファイルシステムから削除します。
最低でも、 /conf/default/etc/fstab に次の内容を含める必要があります。
<SERVER>:<ROOT> / nfs ro 0 0 <SERVER>:/usr /usr nfs ro 0 0 proc /proc procfs rw 0 0
また、 /conf/default/etc/rc.conf を変更し、 クライアント用のスタートアップオプションを 含むようにしたバージョンを用意する必要もあります。 /conf/default/etc/rc.local は空にできますが、サーバ自身の /etc/rc.local が システムに使用されることを防げます。
スタートアップコードで既に設定されているため、 rc.conf では hostname や ifconfig_* を指定する必要はまずないでしょう。 最後になりますが、 複数の クライアントで同じ設定ファイルを共有する場合、 `hostname` の値をスイッチ変数に使う case 文を用いて、 マシン固有の設定を行なうようにすると良いかもしれません。
カーネル環境を使ってカーネルにネットワーク設定を渡すことのできない ブート機構を使っているのなら、以下のオプションも含める必要があります。
注 PXE 環境では上記のオプションは必要ありません。
ブート環境は、ルートファイルシステムを読み取り専用でマウントする時に 一時的なローカルディスクを提供するメモリに裏打ちされたファイルシステムに 依存しています。 そのため、カーネル設定のデバイスセクションには以下を追加することが必要です。
ファイアウォールを使用する場合、デフォルトを ``open'' にしておかねばならないことは覚えておいて下さい。 オープンにしておかないと、カーネルで BOOTP パケットの読み書きができなくなります。
Fx はときどきルートパーティションに書き込みを要求します。 ですから、スタートアップスクリプトでは、元の内容を保存する間、 MFS ファイルシステムをいくつかの位置 ( /etc や /var など) に マウントします。この処理はすべての場合を扱えないかもしれません。
ports/net/etherboot