DISKLESS(8)

名称
diskless - ネットワークを介してシステムをブートする

解説
ネットワークを介してマシンをブートする能力は、 diskless もしくは dataless マシンのためや、ローカルのファイルシステムの再インストールまたは 修復中に一時的に利用するために有用です。 このファイルは、クライアントがネットワークを介してブートする時に、 クライアントとサーバとの間で行われる通信の一般的な解説を提供します。

操作
ネットワークを介してシステムをブートする時に、 クライアントとサーバの間で 3 フェーズのやりとりがあります:

1.  ステージ 1 のブートストラップがブートプログラムを 読み込みます。
2.  ブートプログラムがカーネルを読み込みます。
3.  カーネルがルートを NFS マウントします。

これらの各フェーズについて、以降で詳しく記述します。

フェーズ 1 では、ステージ 1 のブートストラップコードが ブートプログラムを読み込みます。このブートプログラムは、 普通ネットワークカードを制御できます。 ブートプログラムを、BIOS や、ネットワークカード上の BOOT ROM (PXE, etherboot, netboot) に格納することもできます。また、 ディスクユニット (etherboot, netboot 等) からロードさせることもできます。

フェーズ 2 では、ブートプログラムがカーネルを読み込みます。 このフェーズの操作はブートプログラムの設計に依存します。 普通、ブートプログラムは BOOTP プロトコルまたは DHCP プロトコルを用い、クライアントの IP アドレスと その他のブート情報を取得します。ブート情報は、 NFS サーバ、ルータ、ネームサーバの IP アドレス、 ロードするカーネル名を含みます (これに限らず他の情報が含まれる こともあります)。 その後、カーネルがロードされます。これには、 (etherboot や netboot の場合のように) NFS を使って直接ロードされる場合と、 pxeboot と呼ばれる中間ローダを通じて、TFTP や NFS を使ってロードされる 場合とがあります。

フェーズ 3 では、カーネルが DHCP や BOOTP を用いて設定情報を獲得し、 ルートファイルシステムのマウントに進み、動作を開始します。 ディスクレスシステムの開始処理中に行なわれるいくつかの動作は、 /etc/rc.diskless1 と /etc/rc.diskless2 とに列挙されています。

設定
ディスクレスクライアントを実行させるためには、次に示すものが必要です。

•   NFS サーバ。これは、適切なパーミッションを付けて ルートパーティションと /usr パーティションをエクスポートします。 いくつかのシステムファイルにアクセスできるようにするために、 ルートパーティションが -maproot=0 でエクスポートされている限り、 スクリプト rc.diskless{1,2} は読み込み専用パーミッションで動作します。 例として /etc/exports は次に示す行を含みます。

        <ROOT> -ro -maproot=0 -alldirs <list of diskless clients>
        /usr -ro -alldirs <list of diskless clients>

    ここで <ROOT> は、ルートパーティションのサーバ上でのマウントポイントです。 スクリプト /usr/share/examples/diskless/clone_root を使い、共用可能な読み込み専用ルートパーティションを 生成することができます。 しかし、同様に、サーバ自身が使用するルートディレクトリを (読み込み専用で) エクスポートさせると決めることもできます。

•   BOOTP または DHCP サーバ。 bootpd(8) は /etc/inetd.conf の bootps 行のコメントを外すことで使用可能にすることができます。 /etc/bootptab の例は次のようになります。

         .default:\
            hn:ht=1:vm=rfc1048:\
            :sm=255.255.255.0:\
            :sa=<SERVER>:\
            :gw=<GATEWAY>:\
            :rp="<SERVER>:<ROOT>":
        <CLIENT>:ha=0123456789ab:tc=.default

    <SERVER>, <GATEWAY>, <CLIENT>, <ROOT> の意味は明らかでしょう。

•   ルートとしてエクスポートされるパーティション上にディレクトリ /conf/default/etc を作成し、ここに /etc の内容のコピーを置きます。 /conf/default/etc 中のファイルとサブディレクトリが、ディスクレス環境の /etc メモリファイルシステムのブートストラップとして使用されます。 上書き設定するものだけでなく、 /etc 全体をコピーしてください。

•   更に、 /etc 中のファイルに対するネットワーク毎またはホスト毎の上書き設定は、 /conf/${i}/etc ディレクトリを作成することにより、可能となります。 ここで、 i は、 クライアントの サブネットブロードキャストアドレス、またはクライアントの IP アドレスです。

    /etc/rc の主要な部分の実行 (これには、 rc.conf の読み込みも含まれます) の前に、 /etc/rc.diskless.1 によって、ファイルが 上に記したディレクトリから /etc にコピーされ ( /etc にあったそれ以前の内容は上書きされます)、 最も汎用のものから開始されます。

    最低でも、 /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 を変更し、ディスクレスクライアント用のスタートアップオプションを 含むようにしたバージョンを用意する必要もあります。

    スタートアップコードで既に設定されているため、 hostname や ifconfig_* を 指定する必要はまずないでしょう。 一方、サーバのローカルスタートアップファイルを使用しないようにするため、 local_startup="" を設定する必要があるでしょう。

    スタートアップスクリプトが md(4) のファイルシステムの /var をマウントしますが、サイトによっては /etc/defaults/rc.conf に entropy_dir="NO" を設定することによりエントリピの保存を無効化したいかもしれません。

    最後になりますが、 複数のディスクレスクライアントで同じ設定ファイルを共有する場合、 `hostname` の値をスイッチ変数に使う case 文を用いて、 マシン固有の設定を行なうようにすると良いかもしれません。

•   コンフィグファイル (例 /sys/i386/conf/DISKLESS) に少なくとも以下が含まれるカーネルを構築します。

        device md
        options BOOTP
        options BOOTP_NFSROOT
        options BOOTP_COMPAT

    ファイアウォールを使用する場合、デフォルトをオープンにしておかねば ならないことは覚えておいて下さい。オープンにしておかないと、 カーネルで bootp パケットの読み書きができなくなります。

セキュリティ上の問題
暗号化されない NFS を使用してルートパーティションと ユーザパーティションをマウントすると、暗号化キーなどの 情報が洩れるかもしれないことに注意して下さい。

バグ
このマニュアルページはおそらく不完全です。

FreeBSD はときどきルートパーティションに書き込みを要求します。 ですから、スタートアップスクリプトでは、元の内容を保存する間、 md(4) のファイルシステムをいくつかの位置 ( /etc や /var など) に マウントします。この処理はすべての場合を扱えないかもしれません。

関連項目
md(4), ethers(5), exports(5), bootpd(8), mountd(8), nfsd(8), pxeboot(8), reboot(8), tftpd(8), ports/net/etherboot