EN JA
DISKLESS(8)
DISKLESS(8) FreeBSD System Manager's Manual 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) を使用している場合、 make.conf(5)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/resolv, /etc/rc.d/tmp, /etc/rc.d/var/etc/rc.initdiskless 中の動作を実行します。

設定

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 が、サーバのルートパーティションを参照として使用することで、この作成の助けとなります。作業を始めたばかりならば、サーバ自身のルートディレクトリ / を使用すべきであり、この複製を作成すべきではありません。

    普通は、 diskless (ディスクレス) ブートにおいてはサーバの rc.confrc.local とは異なるものを使いたいでしょう。 diskless ブートスクリプトは、(ルートの他のサブディレクトリと同様) /etc 中の様々なファイルをオーバライドする機構を提供します。

    利用者が特別の注意を払うべきである 1 つの違いは、 /etc/defaults/rc.conflocal_startup の値です。 diskless ブートのための典型的な値は、 mountcritremote ですが、利用者の要求は、異なっているかもしれません。

    スクリプトは、4 個のオーバライドディレクトリ /conf/base, /conf/default, /conf/<broadcast-ip>, /conf/<machine-ip> を提供します。サーバの /etcdiskless マシン上で完全に置き換える /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

    また、 /conf/default/etc/rc.conf を変更し、 diskless クライアント用のスタートアップオプションを含むようにしたバージョンを用意する必要もあります。 /conf/default/etc/rc.local は、空にできますが、サーバ自身の /etc/rc.localdiskless システムに使用されることを防げます。

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

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

    options NFSCL
    options NFS_ROOT

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

    options BOOTP
    options BOOTP_NFSROOT
    options BOOTP_COMPAT

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

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

    device md

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

セキュリティ上の問題

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

バグ

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

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

August 7, 2011 FreeBSD