22.7. ディスクレス稼働

更新: Dockès Jean-François [FAMILY Given].

訳: 鈴木 康修

FreeBSD マシンはネットワークを通じて起動でき、 そして NFS サーバからマウントしたファイルシステムを使用して、 ローカルディスクなしで動作することができます。 標準の設定ファイルを変更する以上の、システムの修正は必要ありません。 必要な要素のすべてが用意されているので、 このようなシステムを設定するのは簡単です。

ディスクレスワークステーションを設定する方法はいろいろあります。 多くの要素が関わっており、 その多くはローカルの状況に合わせてカスタマイズできます。下記は、 単純さと標準の FreeBSD 起動スクリプトとの互換性を強調した完全なシステムの設定を説明します。 記述されているシステムの特徴は次のとおりです。

注意:

記述されているとおり、 このシステムは安全ではありません。 ネットワークの保護された範囲で使用されるべきであり、 他のホストから信頼されてはいけません。

22.7.1. セットアップの手順

22.7.1.1. DHCP/BOOTP の設定

ネットワークを通じて設定を取得し、 ワークステーションを起動するために一般的に使用されるプロトコルには、 BOOTP と DHCP の 2 つがあります。 それらはワークステーションのブートストラップ時に何ヵ所かで使用されます。

  • etherboot はカーネルを見つけるために DHCP (デフォルト) または BOOTP (設定オプションが必要) を使用します (PXE は DHCP を使用します) 。

  • NFS ルートの場所を定めるためにカーネルは BOOTP を使用します。

BOOTP だけを使用するようにシステムを設定することもできます。 bootpd(8) サーバプログラムは FreeBSD のベースシステムに含まれています。

しかしながら、DHCP には BOOTP に勝る点が多々あります。 (よりよい設定ファイル、PXE が使えること、 そしてディスクレス稼働には直接関係しない多くの長所) ここでは BOOTP だけ利用する場合と、 BOOTP と DHCP を組み合わせた設定を扱います。特に ISC DHCP ソフトウェアパッケージを利用する後者の方法に重点をおきます。

22.7.1.1.1. ISC DHCP を使用する設定

isc-dhcp サーバは、 BOOTP および DHCP リクエストの両方に答えることができます。

4.4-RELEASE の時点で isc-dhcp 3.0 はベースシステムの一部では無くなりました。 まずはじめに net/isc-dhcp3-server port または対応する package をインストールする必要があるでしょう。 ports および package に関する一般的な情報については 5章アプリケーションのインストール - packages と ports を参照してください。

isc-dhcp がインストールされると、 動作するために設定ファイルを必要とします (通常 /usr/local/etc/dhcpd.conf が指定されます) 。 下記にコメントを含めた例を示します。

          default-lease-time 600;
          max-lease-time 7200;
          authoritative;

          option domain-name "example.com";
          option domain-name-servers 192.168.4.1;
          option routers 192.168.4.1;

          subnet 192.168.4.0 netmask 255.255.255.0 {
            use-host-decl-names on; 1
            option subnet-mask 255.255.255.0;
            option broadcast-address 192.168.4.255;

            host margaux {
              hardware ethernet 01:23:45:67:89:ab;
              fixed-address margaux.example.com;
              next-server 192.168.4.4;2
              filename "/tftpboot/kernel.diskless";3
              option root-path "192.168.4.4:/data/misc/diskless";4
            }
          }

1

このオプションは host 宣言の値を、 ディスクレスホストへのホスト名として送るように dhcpd に指示します。 別の方法として、ホスト宣言内に option host-name margaux を加えるものがあります。

2

TFTP サーバを next-server ディレクティブに指定します (デフォルトは DHCP サーバと同じホストを使います)。

3

カーネルとして etherboot が読み込むファイルを filename ディレクティブに指定します。

注記:

PXE は相対的なファイル名を好むようです。 また、カーネルではなく pxeboot を読み込みます (option filename "pxeboot")。

4

ルートファイルシステムへのパスを、 通常の NFS 書式で root-path オプションに指定します。

22.7.1.1.2. BOOTP を使用する設定

続けて、bootpd で同等のことをする設定です。 これは /etc/bootptab におきます。

BOOTP を使用するために、デフォルトではない NO_DHCP_SUPPORT オプション付きで etherboot をコンパイルしなければならないことと、PXE は DHCP を 必要 とすることに注意してください。 bootpd の唯一明白な利点は、 これがベースシステムに存在するということです。

          .def100:\
            :hn:ht=1:sa=192.168.4.4:vm=rfc1048:\
            :sm=255.255.255.0:\
            :ds=192.168.4.1:\
            :gw=192.168.4.1:\
            :hd="/tftpboot":\
            :bf="/kernel.diskless":\
            :rp="192.168.4.4:/data/misc/diskless":

          margaux:ha=0123456789ab:tc=.def100

22.7.1.2. Etherboot を用いるブートプログラムの準備

Etherboot のウェブサイト には主に Linux システムについて述べた 広範囲の文書 が含まれています。 しかし、それにもかかわらず有用な情報を含んでいます。 下記は FreeBSD システム上での etherboot の使用法についての概観を示します。

まずはじめに net/etherboot の package または port をインストールしなければなりません。 etherboot port は通常 /usr/ports/net/etherboot にあります。 ports ツリーがシステムにインストールされている場合、 このディレクトリ内で make を実行すれば、よきに計らってくれます。 ports および packages に関する情報は 5章アプリケーションのインストール - packages と ports を参照してください。

ここで説明している方法では、ブートフロッピーを使用します。 他の方法 (PROM または DOS プログラム) については etherboot の文書を参照してください。

ブートフロッピーを作成するためには、 etherboot をインストールしたマシンのドライブにフロッピーディスクを挿入します。 それからカレントディレクトリを etherboot ツリー内の src ディレクトリにして次のように入力します。

	  # gmake bin32/devicetype.fd0
	

devicetype は ディスクレスワークステーションのイーサネットカードタイプに依存します。 正しい devicetype を決定するために、 同じディレクトリ内の NIC ファイルを参照してください。

22.7.1.3. TFTP および NFS サーバの設定

TFTP サーバ上で tftpd を有効にする必要があります。

  1. tftpd が提供するファイルを置くディレクトリ (たとえば /tftpboot) を作成してください。

  2. /etc/inetd.conf ファイルに以下の行を追加してください。

    tftp    dgram   udp     wait    root  /usr/libexec/tftpd    tftpd -s /tftpboot

    注記:

    少なくとも PXE のいくつかのバージョンが TCP 版の TFTP を要求するようです。その場合 dgram udpstream tcp に置き換えた 2 番目の行を追加してください。

  3. inetd に設定ファイルを再読み込みさせてください。

    # kill -HUP `cat /var/run/inetd.pid`

tftpboot ディレクトリはサーバ上のどこにでも置けます。 その場所が inetd.conf および dhcpd.conf の両方に設定されていることを確かめてください。

さらに NFS を有効にして NFS サーバの適切なファイルシステムをエクスポートする必要があります。

  1. この行を /etc/rc.conf に追加してください。

    nfs_server_enable="YES"
  2. 下記を /etc/exports に加えることで、 ディスクレスマシンのルートディレクトリが位置するファイルシステムをエクスポートしてください (ボリュームのマウントポイントを適当に調節し、 margaux をディスクレスワークステーションの名前に置き換えてください)。

    /data/misc -alldirs -ro margaux
  3. mountd に設定ファイルを再読み込みさせてください。 /etc/rc.conf 内で NFS をはじめて有効にする必要があったのなら、 代わりに再起動した方がよいかもしれません。

    # kill -HUP `cat /var/run/mountd.pid`

22.7.1.4. ディスクレス用のカーネル構築

次のオプションを (通常のものに) 追加した、 ディスクレスクライアント用のカーネルコンフィグレーションファイルを作成してください。

          options     BOOTP          # Use BOOTP to obtain IP address/hostname
          options     BOOTP_NFSROOT  # NFS mount root filesystem using BOOTP info
          options     BOOTP_COMPAT   # Workaround for broken bootp daemons.

BOOTP_NFSV3 および BOOTP_WIRED_TO を利用してもよいかもしれません (LINT を参照してください)。

カーネルを構築して (9章FreeBSD カーネルのコンフィグレーション を参照)、 dhcpd.conf に記述した名称で tftp ディレクトリにコピーしてください。

22.7.1.5. ルートファイルシステムの準備

dhcpd.confroot-path として記載された ディスクレスワークステーションのためのルートファイルシステムを作成する必要があります。

これを行う最も簡単な方法は /usr/share/examples/diskless/clone_root シェルスクリプトを使用することです。 このスクリプトは、少なくともファイルシステムが作成される場所 (DEST 変数) を調節するために変更する必要があります。

説明についてはスクリプトの一番上にあるコメントを参照してください。 ベースシステムをどのように構築するか、 またファイルがどのようにディスクレス稼働、サブネット、 または個々のワークステーションに固有のバージョンによって、 選択的にオーバライドできるかを説明します。 また、ディスクレスな場合の /etc/fstab ファイルおよび /etc/rc.conf ファイルの例を示します。

/usr/share/examples/diskless 内の README ファイルには、多くの興味深い背景情報が書かれています。 しかし diskless ディレクトリ内の他の例と同じく、 clone_root/etc/rc.diskless[12] で実際に使われているものとは異なる設定方法が説明されています。 ここに書かれている方法は rc スクリプトの変更が必要になりますが、 こちらの方が気に入ったというのでなければ、 参照にとどめてください。

22.7.1.6. スワップの設定

必要なら、サーバに置かれたスワップファイルに NFS 経由でアクセスできます。 bootptab または dhcpd.conf の正確なオプションは、 現時点では明確には文書化されていません。 下記の設定例は isc-dhcp 3.0rc11 を使用して動作したと報告されているものです。

  1. dhcpd.conf に下記の行を追加してください。

                  # Global section
                  option swap-path code 128 = string;
                  option swap-size code 129 = integer 32;
    
                  host margaux {
                    ... # Standard lines, see above
                    option swap-path "192.168.4.4:/netswapvolume/netswap";
                    option swap-size 64000;
                  }

    これは、少なくとも FreeBSD クライアントにおいては、 DHCP/BOOTP オプションコードの 128 は NFS スワップファイルへのパスで、オプションコード 129 は KB 単位のスワップサイズだということです。 もっと古いバージョンの dhcpd では option option-128 "... という書式が受け付けられましたが、 もはや対応していません。

    代わりに、/etc/bootptab では次の書式を使います。

    T128="192.168.4.4:/netswapvolume/netswap":T129=0000fa00

    注記:

    /etc/bootptab では、スワップの大きさは 16 進数で表さなければなりません。

  2. NFS スワップファイルサーバ側でスワップファイルを作成します。

                  # mkdir /netswapvolume/netswap
                  # cd /netswapvolume/netswap
                  # dd if=/dev/zero bs=1024 count=64000 of=swap.192.168.4.6
                  # chmod 0600 swap.192.168.4.6

    192.168.4.6 はディスクレスクライアントの IP アドレスです。

  3. NFS スワップファイルサーバ上で /etc/exports に下記の行を追加してください。

    	      /netswapvolume  -maproot=0:10 -alldirs margaux

    それから、上述したように mountd にエクスポートファイルを再読み込みさせてください。

22.7.1.7. 雑多な問題

22.7.1.7.1. 読み取り専用の /usr で動作させる

ディスクレスワークステーションが X を起動するように設定されている場合、 xdm 設定ファイルを調整しなければならないでしょう。 これはデフォルトでエラーファイルを /usr に置きます。

22.7.1.7.2. FreeBSD ではないサーバを使用する

ルートファイルシステムを提供するサーバが FreeBSD で動作していない場合、 FreeBSD マシン上でルートファイルシステムを作成し、 tar または cpio を利用して置きたい場所にコピーしなければならないでしょう。

この状況では、major/minor 整数サイズが異なっていることにより /dev 内のスペシャルファイルに関する問題が時々おこります。 この問題を解決するには、非 FreeBSD サーバからディレクトリをエクスポートして、 そのディレクトリを FreeBSD マシンでマウントし、 FreeBSD マシン上で MAKEDEV を実行して正しいデバイスエントリを作成します (FreeBSD 5.0 およびそれ以降では、devfs(5) を使用してユーザに意識させずにデバイスノードを割り当てるので、 これらのバージョンでは MAKEDEV は必要ありません)。

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、 ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。

本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。