DISKLESS(8)

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

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

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

1.  ステージ 1 のブートストラップ、 典型的にはイーサネットカード組み込みの PXE が、 ブートプログラムを読み込みます。

2.  ステージ 2 ブートプログラム、 典型的には pxeboot(8) が、モジュールとカーネルを読み込み、 カーネルをブートします。

3.  カーネル NFS がルートディレクトリをマウントし、そこから処理を継続します。

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

最初に、ステージ 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 を使用するが diskless クライアント用にカスタムルートファイルシステムを持たない場合、 ステージ 2 ブートは、サーバのカーネルを diskless マシン用のカーネルとしてロードしますが、 これはあなたの期待する動作ではないかもしれません。

    cd /usr/src/sys/boot/i386
    make clean; make; make install
    cp /boot/pxeboot /tftpdir/

フェーズ 3 では、カーネルは以下の 2 つの方法のどちらかで IP ネットワーク設定を獲得し、ルートファイルシステムのマウントに進み、 動作を開始します。 フェーズ 2 のローダが、カーネル環境を使ってカーネルにネットワーク設定を 渡せるのなら、カーネルはその情報を使ってネットワークインタフェースを設定します。 そうでない場合、 DHCP や BOOTP を用いて設定情報を獲得しないとなりません。 ブートスクリプトは diskless 起動を認識し、 /etc/rc.d/initdiskless および /etc/rc.d/diskless 中の動作を実行します。 古いシステムでは、スクリプトは /etc/rc.diskless1 と /etc/rc.diskless2 です。

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

•   NFS サーバ。これは、適切なパーミッションを付けて ルートパーティションと /usr パーティションをエクスポートします。 いくつかのシステムファイルにアクセスできるようにするために、 ルートパーティションが -maproot=0 でエクスポートされている限り、 スクリプト diskless は読み込み専用パーミッションで動作します。 例として /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> の意味は明らかでしょう。

•   適切に初期化されたルートパーティション。 スクリプト /usr/share/examples/diskless/clone_root が、サーバのルートパーティションを参照として使用することで、 この作成の助けとなります。 作業を始めたばかりならば、サーバ自身のルートディレクトリ / を使用すべきであり、この複製を作成すべきではありません。

    普通は、ディスクレスブートにおいてはサーバの rc.conf や rc.local とは異なるものを使いたいでしょう。 diskless ブートスクリプトは、(ルートの他のサブディレクトリと同様) /etc 中の様々なファイルをオーバライドする機構を提供します。 スクリプトは 4 個のオーバライドディレクトリ /conf/base, /conf/default, /conf/<broadcast-ip>, /conf/<machine-ip> を提供します。 サーバの /etc を diskless マシン上で完全に置き換える /conf/base/etc を、常に作成すべきです。 ここで、サーバの /etc を複製することが可能ですし、サーバの /etc を /conf/base/etc へマウントすることを diskless ブートスクリプトに対して指示する 特殊ファイルを作成することも可能です。 これは、 diskless マシンの /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

    diskless スクリプトは、 オーバライドされたディレクトリを保持するために、 メモリファイルシステムを作成します。 わずか 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/<BROADCASTIP>/etc ディレクトリ中で提供可能です。 ここで、 <BROADCASTIP> は、 BOOTP にてディスクレスシステムに与えられる、 diskless システムのブロードキャストアドレスを示します。 diskless_remount および md_size の機構はこれらのディレクトリ中のいかなるものに対しても動作します。 コンフィギュレーション機能は /etc 以外のディレクトリに対して動作します。 置換やオーバライドしたいディレクトリを /conf/{base,default,<broadcast>,<ip>}/* 中に作成することで、 /etc と同様に動作します。

    通常は /conf/base/etc/diskless_remount を使用してサーバの /etc を複製しますので、 メモリファイルシステムから不要なファイルを削除したいかもしれません。 例えば、サーバはファイアウォールを持つがディスクレスではそうでない場合、 /etc/ipfw.conf を削除したいと思うでしょう。 /conf/base/<DIRECTORY>.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 を変更し、 diskless クライアント用のスタートアップオプションを 含むようにしたバージョンを用意する必要もあります。 /conf/default/etc/rc.local は空にできますが、サーバ自身の /etc/rc.local が diskless システムに使用されることを防げます。

    スタートアップコードで既に設定されているため、 rc.conf では hostname や ifconfig_* を指定する必要はまずないでしょう。 最後になりますが、 複数の diskless クライアントで同じ設定ファイルを共有する場合、 `hostname` の値をスイッチ変数に使う case 文を用いて、 マシン固有の設定を行なうようにすると良いかもしれません。

•   NFS または TFTP を使用されロードされる、 diskless クライアント用のカーネル。 これは NFS クライアントのサポートを含んでいなければなりません。

        options NFSCLIENT
        options NFS_ROOT

    カーネル環境を使ってカーネルにネットワーク設定を渡すことのできない ブート機構を使っているのなら、以下のオプションも含める必要があります。

        options BOOTP
        options BOOTP_NFSROOT
        options BOOTP_COMPAT

    注: PXE 環境では上記のオプションは必要ありません。

    diskless ブート環境は、ルートファイルシステムを読み取り専用でマウントする時に 一時的なローカルディスクを提供するメモリに裏打ちされたファイルシステムに 依存しています。 そのため、カーネル設定のデバイスセクションには以下を追加することが必要です。

        device md

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

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

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

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

関連項目
ethers(5), exports(5), bootpd(8), mountd(8), nfsd(8), pxeboot(8), reboot(8), tftpd(8)

ports/net/etherboot