22.7. ディスクレス稼働
戻る | 第22章 高度なネットワーク | 次へ

## 22.7. ディスクレス稼働

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

訳: 鈴木 康修 `<yasu@hike.te.chiba-u.ac.jp>`

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

- ネットワークを通じてカーネルを読み込む方法は、 少なくとも二つあります。

  - PXE: Intel® の Preboot Execution Environment システムは、 一部のネットワークカードまたはマザーボードに組み込まれた、 スマートなブート ROM の一形態です。 詳細については pxeboot(8) を参照してください。

  - port の etherboot (`net/etherboot`) は、 ネットワークを通じてカーネルを起動する ROM 化可能なコードを提供します。 コードはネットワークカード上のブート PROM に焼き付けるか、 あるいはローカルフロッピー (ハード) ディスクドライブ、 または動作している MS-DOS® システムから読み込むことができます。 多くのネットワークカードに対応しています。

- サンプルスクリプト (`/usr/share/examples/diskless/clone_root`) はサーバ上で、 ワークステーションのルートファイルシステムの作成と維持をやり易くします。 このスクリプトは少し書き換えないといけないでしょうが、 早く取り掛かれるようにします。

- ディスクレスシステム起動を検知しサポートする標準のシステム起動ファイルが `/etc` 内にあります。

- 必要なら、NFS ファイルまたはローカルディスクのどちらかにスワップできます。

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

- ディスクレスワークステーションは、 共有された読み取り専用の `ルート`ファイルシステムと、 共有された読み取り専用の `/usr` を使用します。

  `ルート` ファイルシステムは、 標準的な FreeBSD (典型的にはサーバの) のルートのコピーで、 一部の設定ファイルが、ディスクレス稼働、 また場合によってはそのワークステーションに特有のもので上書きされています。

  書き込み可能でなければならない `ルート` の部分は mfs(8) ファイルシステムで覆われます。 システムが再起動するときにはすべての変更が失われるでしょう。

- カーネルは DHCP (または BOOTP) および TFTP を用いて etherboot によって読み込まれます。

### 注意:

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

### 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; 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; filename "/tftpboot/kernel.diskless"; option root-path "192.168.4.4:/data/misc/diskless"; } }

| このオプションは `host` 宣言の値を、 ディスクレスホストへのホスト名として送るように `dhcpd` に指示します。 別の方法として、ホスト宣言内に `option host-name `margaux`` を加えるものがあります。
| TFTP サーバを `next-server` ディレクティブに指定します (デフォルトは DHCP サーバと同じホストを使います)。
| カーネルとして etherboot が読み込むファイルを `filename` ディレクティブに指定します。 ### 注記: PXE は相対的なファイル名を好むようです。 また、カーネルではなく `pxeboot` を読み込みます (`option filename "pxeboot"`)。
| ルートファイルシステムへのパスを、 通常の 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 udp` を `stream 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.conf` に `root-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` は必要ありません)。

戻る | 上に戻る | 次へ
22.6. NFS | ホーム | 22.8. ISDN

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

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