  NFS-Root-Client Mini-Howto
  Ofer Maor, oferm@hcs.co.il
  V4.1, 02 February 1999
  早川 仁, cz8cb01@linux.or.jp
  V4.1j, 1999年10月 3日

  この Mini-Howto では、クライアントのルートディレクトリを NFS サーバー
  上で作成して、Root をマウントする方法について説明しています。 この
  howto（HTML もしくは Text版）の最新版は、
  <http://www.hcs.co.il/oferm/NFS-Root-Client/> から入手できます。
  ______________________________________________________________________

  目次

  1. Copyright
     1.1 謝辞

  2. 序文
     2.1 概略

  3. クライアントのルートディレクトリの作成
     3.1 ディレクトリツリーの作成
     3.2 ブートに必要な最小限のファイルシステムを作成
        3.2.1 dev ディレクトリの作成
        3.2.2 必要なバイナリーファイルをコピー
        3.2.3 var ディレクトリ
        3.2.4 残りのディレクトリ
     3.3 etc ディレクトリの作成とクライアントの設定
        3.3.1 各クライアントで共有する etc ディレクトリの作成
        3.3.2 クライアント毎の etc ディレクトリの作成
     3.4 起動

  4. クライアントの追加

  ______________________________________________________________________

  1.  Copyright

  （訳注：読者の利便を考え日本語訳をしますが、原文の Copyright が優先し
  ます）

  (c) 1996 Ofer Maor (oferm@hcs.co.il)

  Unless otherwise stated, Linux HOWTO documents are copyrighted by
  their respective authors. Linux HOWTO documents may be reproduced and
  distributed in whole or in part, in any medium physical or electronic,
  as long as this copyright notice is retained on all copies. Commercial
  redistribution is allowed and encouraged; however, the author would
  like to be notified of any such distributions.

  特に断らない限り、Linux HOWTO ドキュメントはそれぞれの著者の著作物で
  す。Linux HOWTO ドキュメントは、全てのコピーにおいて copyright が保持
  されている限り、どのような物理的あるいは電子的なメディアによっても、全
  部あるいはその一部を複製し、配布することができます。商用の再配布につい
  ても許可や奨励をされていますが、そのようないかなる配布に関しても、著者
  は通知されることを望んでいます。

  All translations, derivative works, or aggregate works incorporating
  any Linux HOWTO documents must be covered under this copyright notice.
  That is, you may not produce a derivative work from a HOWTO and impose
  additional restrictions on its distribution. Exceptions to these rules
  may be granted under certain conditions; please contact the Linux
  HOWTO coordinator at the address given below.

  全ての翻訳、派生的な著作物、あるいはいずれかの Linux HOWTO 文書の内容
  を取り入れて集合的な著作物はこの copyright の下で保護される必要があり
  ます。つまり、いずれかの HOWTO をもとにした著作物を作ってもその配布に
  制限を追加してはいけません。ある条件の下では、これらの規則に対する例外
  が認められる場合があります。下記のアドレスの Linux HOWTO のコーディネ
  ーターに連絡を取ってください。

  In short, we wish to promote dissemination of this information through
  as many channels as possible. However, we do wish to retain copyright
  on the HOWTO documents, and would like to be notified of any plans to
  redistribute the HOWTOs.

  要するに、私たちは可能な限り多くの経路を通じてこの情報の普及を促進する
  ことを望んでいます。しかし、私たちは HOWTO の文書の著作権を保持するこ
  とも強く望んでいますし、またそれら HOWTO の文書を再配布するどんな計画
  も私たちに知らせていただければ幸甚に思います。

  If you have questions, please contact Ofer Maor (
  <mailto:oferm@hcs.co.il>), the author of this mini-HOWTO, or Greg
  Hankins, the Linux HOWTO coordinator, at
  <mailto:gregh@sunsite.unc.edu> via email, or at +1 404 853 9989.

  もしご質問があれば e-mail で、この mini-HOWTO の著者である Ofer Maor (
  <mailto:oferm@hcs.co.il>)、あるいは Linux HOWTO のコーディネーターの
  Greg Hankins  <mailto:gregh@sunsite.unc.edu> までどうぞ。

  If you have anything to add to this Mini-Howto, Please mail the author
  (Ofer Maor,  <mailto:oferm@hcs.co.il>), with the information. Any new
  relevant information would be appreciated.

  この Mini-Howto に追加したいことがあれば、著者（Ofer Maor,
  <mailto:oferm@hcs.co.il>）までメールしてください。どのような関連情報で
  あっても感謝します。

  1.1.  謝辞

  NFS-Root Howto の著者である Andreas Kostyrca (
  <mailto:andreas@medman.ag.or.at>) に感謝します。彼の Mini-Howto は NFS
  Root マウントのクライアントの作成のための第一歩として役に立ちました。
  私の Mini-Howto は彼の作業を無駄にしようとするものではなく、よりよいも
  のにするために私の経験を生かそうとするものです。

  また Mark Kushinsky ( <mailto:mark026@ibm.net>) には私の英語と、この
  Howto のスペルを洗練して、より読みやすくしてくれた事に感謝します。

  2.  序文

  この Mini-Howto はクライアントのディレクトリを作成するために NFS Root
  マウントをしたい方を手助けするために書かれました。あなたのニーズ、ある
  いは意図により実現するための方法はたくさんあるということを忘れないでく
  ださい。

  もしもクライアントマシンが複数あり、個々のクライアントにそれぞれユーザ
  ーと管理者がいる場合に必要なことは、クライアント毎のディレクトリを作成
  して他のクライアントと共有しないことであり、これは非常に重要です。

  逆にクライアントが複数のユーザー用で、管理者業務を同じ人間が行う場合
  （たとえばコンピューター教室など）、できるだけ多くのファイルを共通にし
  て管理しやすくすることが必要となるでしょう。この Howto では後者の、
  ファイルを共通して使用する方法について述べていきます。

  2.1.  概略

  クライアントのルートディレクトリを作成する場合にクライアントのサイズを
  小さくするために、どのファイルを共有できるか、またはサーバーからマウン
  トすることができるかということについて、主に焦点を当てます。またこの
  Howto では私の経験から得たクライアントの設定をお勧めしていきます。

  o  この Mini-Howto では NFS ルートマウントを行う方法そのものについては
     説明しません。必要な場合は NFS-Root Mini-Howto を参照してください。
     （訳注： 翻訳版は JF プロジェクトの Web サイト
     <http://jf.linux.or.jp> にあります）

  o  私のクライアントの大部分の設定はマウントとシンボリックリンクをベー
     スにしています。シンボリックリンクの多くはハードリンクと置き換える
     ことができます。個人の好みにより、好きな方を選べばよいでしょう。マ
     ウントしたディレクトリでハードリンクを使う場合とシンボリックリンク
     を使う場合にはそれぞれの利点がありますが、混乱するかもしれません
     ね。ハードリンクは全てのリンクが消されるまでリンク元のファイルは削
     除されません。つまりあるファイルを置き換えたりする場合でも、ハード
     リンクは依然として以前のファイルを指していますから、作成したリンク
     を見失わないよう特に気を付ける必要があるでしょう。

  o  ディレクトリなどをサーバーからマウントする場合に二つの方法がありま
     す。一つ目の（非常に一般的な）方法はサーバーのルートディレクトリ全
     体をローカルのディレクトリにマウントして、単にパスを変更したり、そ
     こに関連するディレクトリをリンクすることです。個人的にはサーバーの
     ルートパーティションをクライアントすることは嫌いなので、この Howto
     ではサーバーの関連ディレクトリをシステムの適切な場所にマウントする
     事をお勧めします。

  o  この Howto は私が Slackware 3.1 ベースのディストリビューション上で
     クライアントのディレクトリを構築した経験を元にしています。他のディ
     ストリビューションでは（特に rc.* ファイルが）違うところがあるかも
     知れませんが、基本的な概念は同じです。

  3.  クライアントのルートディレクトリの作成

  3.1.  ディレクトリツリーの作成

  はじめにディレクトリ構造自体を作成する必要があります。私は全てのクライ
  アントを /clients/ホスト名 の下に作成しました。下記ではこれを例として
  使用しますが、他の場所にすることももちろん可能です。まずルートディレク
  トリに、次のような関連するディレクトリを作成します。（訳注：各クライア
  ントで共通するファイル／ディレクトリは、/clients の下に置きます。例え
  ば /clients/etc には全クライアントで共通の、etc 配下のファイルを格納し
  ます）

      bin, dev, etc, home, lib, mnt, proc, sbin, server, tmp, usr, var

  それ以外に必要だと思うディレクトリを作成します。

  local, proc, dev ディレクトリは各マシン上で別々に使われますが、その他
  のディレクトリは部分的に、あるいは完全に他のクライアントと共有されま
  す。

  3.2.  ブートに必要な最小限のファイルシステムを作成

  3.2.1.  dev ディレクトリの作成

  dev ディレクトリを共有することは可能ですが、クライアント毎に別々にして
  おいた方がよいでしょう。クライアントの dev ディレクトリは適切な
  MAKEDEV スクリプトで作成することができますが、多くの場合は単にサーバー
  からコピーするだけです。

      cp -a /dev /clients/ホスト名

  /dev/mouse, /dev/cdrom, /dev/modem は実際のデバイスへのシンボリックリ
  ンクだということを覚えておいた方が良いでしょう。ですからクライアントの
  ハードウェアにあったデバイスに正しくリンクされていることを確認すべきで
  す。

  3.2.2.  必要なバイナリーファイルをコピー

  すべてをサーバーからマウントするわけですが、各クライアントに最小限コピ
  ーしなければならない物があります。かならず必要なものは "init" で
  す。init の実行をせずに他のプロセスを実行することはできません(著者はこ
  の事実に気が付くのに苦労しました ;-)。ですからはじめに、/sbin/init を
  クライアントの sbin ディレクトリにコピーし、rc.S を走らせられるように
  します。

  （訳注：rc.S は slackware や Plamo Linux の場合です。Redhat 系の dist
  では init は /etc/inittab に記述されているように、/etc/rc.d/rc.sysinit
  を実行します）

  また、/bin/sh をクライアントの bin ディレクトリにコピーしたほうがよい
  でしょう。次にマウントを実行できるようにするために、/sbin/mount をクラ
  イアントの sbin ディレクトリにコピーします。これが rc.S に書かれている
  mount -av を実行するために必要な最小限のものですが、もう少しファイルを
  コピーしておいた方が良いでしょう。update, ls, rm, cp, umount があれば
  マウントの際に問題が発生した場合、基本的な作業が行えるでしょう。マウン
  トの前に swap を有効にするのであれば、swapon ファイルも必要になりま
  す。

  上記のバイナリーファイルの多くはデフォルトでダイナミックリンクされてい
  ますから、/lib のいくつかのファイルをコピーする必要があるでしょう。

      cp -a /lib/ld* /lib/libc.* /lib/libcursses.* /client/ホスト名/lib

  バイナリーファイルをコピーする代わりにハードリンクすることは考慮に値し
  ます。この Howto の ``概略'' にある私の意見を参照してください。

  上記の全ての記述は、起動時にカーネルに対してネットワークパラメータが渡
  されていると仮定していることに注意してください。rarp や bootp を使おう
  としているのであれば、関連するバイナリーファイルがおそらく同じように必
  要になるでしょう。

  普通はネットワークを設定し、rc.S を実行して残りのファイルシステムをマ
  ウントするための最小限のファイルが必要になります。/etc/inittab や rc.S
  ファイルを調べてみて、マウント作業が始まる前にその他にファイルが必要と
  なるような "予想もしていない"ことが起きないように確認しておいてくださ
  い。もしも他に必要なファイルを見つけた場合、同じようにコピーをしておく
  か、もしくは inittab や rc.S からそのファイルに関連する箇所を削りま
  しょう。

  3.2.3.  var ディレクトリ

  多くの場合 var ディレクトリは各クライアント毎に用意したほうがよいです
  が、ディレクトリ中の多くのファイルは共有することができます。サーバーの
  ディレクトリに、var というディレクトリを作成してください。サーバー自身
  の var ディレクトリをそこにマウントします。var ディレクトリを作るには
  次のように入力するだけです。

      cp -a /var /clients/ホスト名/

  さて。別々に用意するか、共有するかのどちらにしたいでしょうか。ディレク
  トリ／ファイルを共有したいのであれば、単にクライアントの var ディレク
  トリから取り除いて /server/var/ ディレクトリへのシンボリックリンクを作
  成するだけですが、注意してほしいのは作成するシンボリックリンクは
  /server/var か ../server/var であって /clients/ホスト名/server/var で
  はありません。これは root が変更されたときに動作しなくなります。

  私は /var/run, /var/lock, /var/spool, /var/log はクライアント毎に別々
  にすることをお勧めします。

  3.2.4.  残りのディレクトリ

  o  etc は次のセクションで詳細に説明します。

  o  mnt と proc は local で使うための物です。（訳注：ですから中身は空で
     構いません）

  o  usr と home は単なるマウントポイントです。

  o  tmp はあなた自身の用途によります。クライアント毎に tmp ディレクトリ
     を作ることも、/clients/tmp ディレクトリを作って各クライアントの
     /tmp をそこにマウントすることもできます。私がお勧めするのはクライア
     ント毎に tmp ディレクトリの用意をすることです。

  3.3.  etc ディレクトリの作成とクライアントの設定

  このセクションでは、各クライアントで多くを共有する etc ディレクトリの
  構築について述べています。作成するディスクレスクライアントそれぞれに管
  理者がいる場合は etc ディレクトリを共有せずに、クライアント毎に別々に
  用意した方が良いでしょう。

  3.3.1.  各クライアントで共有する etc ディレクトリの作成

  各クライアント毎に etc ディレクトリを用意するわけですが、全てを別々に
  用意するのではなく各クライアントで共通する多くの部分は共有したい事で
  しょう。通常は etc ファイルとしてサーバーの /etc を共有することはよく
  ないと思いますから、/clietns/etc ディレクトリを作成してクライアント間
  で共有できるファイルをそこに置いておくことをお勧めします。まず始めに、
  サーバーの /etc の中身を /clients/etc ディレクトリに単純にコピーしま
  す。

  このディレクトリに、端末に依存しない設定ファイル（例えば motd, issue
  など）全てを格納します。クライアント環境に依存しないファイル（inittab
  や fstab）もです。

  最重要の変更点は rc.d ディレクトリ内のファイルです。はじめに rc.inet1
  をローカルの設定に応じて変更する必要があるでしょう。私はネットワークの
  設定全てを LILO/Loadlin を使用してカーネルに渡しますので、rc.inet1 の
  中はほとんど全て削除しました。削除していない項目は ifconfig と
  localhost の route 設定だけです。rarp や bootp を使う場合、同様にしか
  るべき設定をする必要があるでしょう。

  次に rc.S を編集する必要があります。サーバー起動時に行う fsck のチェッ
  クに関係する全ての部分を取り除き、次に fstab をマウントする行を探しま
  す。次のような行のはずです。

      mount -avt nonfs

  -t nonfs により、（普通の）クライアントは始めに rc.S を実行し、その後
  に rc.inet1 で Ethernet の設定を行います。NFS パーティションをマウント
  するわけではないので、この行は消した方が良いでしょう。つまり mount -av
  にします。ネットワークの設定に rarp/bootp を走らせる必要があるときはマ
  ウントの前に rc.S を実行して（または rc.S から適切なスクリプトを呼び出
  して）、マウントされた後の bin と sbin ディレクトリに必要なファイルが
  あることを確認してください。

  （訳注：mount -av のオプションの v は verbose（詳細表示）を行い、a は
  /etc/fstab に指定されているファイルシステムを (指定されたタイプで) す
  べてマウントします）

  mount -av が実行されると（訳注：fstab の全ファイルシステムをマウントす
  るため）、ファイルシステムを使えるようになります。fstab を編集し、各ク
  ライアントへコピーする雛形を作成します。作成する fstab はこのようにな
  るでしょう。

      server:/clients/hostname    /               nfs     default  1 1
      server:/bin                 /bin            nfs     default  1 1
      server:/usr                 /usr            nfs     default  1 1
      server:/sbin                /sbin           nfs     default  1 1
      server:/home                /home           nfs     default  1 1
      server:/lib                 /lib            nfs     default  1 1
      server:/clients/etc         /server/etc     nfs     default  1 1
      server:/clients/var         /server/var     nfs     default  1 1
      none                        /proc           proc    default  1 1

  default キーワードはすべての mount コマンドで動作しないかもしれないた
  め、default 1 1 の部分を全て取り除くか、または rw や ro に変更したほう
  が良いかもしれません。

  サーバーの /etc/exports がこのようになっているのを確認してください。

      /clients/hostname   hostname.domainname(rw,no_root_squash)
      /clients/etc        hostname.domainname(ro,no_root_squash)
      /clients/var        hostname.domainname(ro,no_root_squash)
      /usr                hostname.domainname(ro,no_root_squash)
      /sbin               hostname.domainname(ro,no_root_squash)
      /bin                hostname.domainname(ro,no_root_squash)
      /lib                hostname.domainname(ro,no_root_squash)
      /home               hostname.domainname(rw,no_root_squash)

  各ホスト（クライアント）毎に別々に用意される１番目の行
  /clients/hostname ディレクトリを除いて、残りの行は hostmask によって全
  てのホスト（pc*.domain のような形です。ただし注意して欲しいのは、* が
  表現するのは文字列だけで、. は含まれないということです）に合うように置
  き換えることができます。

  私自身は出来るだけディレクトリを read only にするようにお勧めします
  が、そうするかどうかはお任せします。no_root_squash は、root ユーザーが
  nfsd で動作しているクライアント上であっても root 権限を同じように持つ
  ことができることを指定します。man exports(5) も参照してください。ユー
  ザーに passwd をクライアント上でも実行できるようにしたい場合、/etc が
  ro 権限ではなく rw であることを確認してください。rw 権限を与えることは
  賢明ではないでしょうが。

  次に関係あるのは rc.S ファイルです。Slackware ではデフォルトで
  /etc/issue と /etc/motd を起動時に新しく作成します。これらのファイルが
  サーバーから ro 権限でマウントされる場合には、無効にしなければなりませ
  ん。私が推奨するのは、どのような場合であっても無効にすることです。

  最後に、サーバー上でもクライアント上と同じユーザー情報を使用したいので
  あれば、次の２つを使うとよいでしょう。 1) NIS （イエローページで
  す。yp-howto を参照してください）を使用して、各クライアントで使用する
  /etc/passwd と /etc/group は NIS サーバーから取得します。2) 多くの場
  合、単なるシンボリックリンクで充分です。すなわち /clients/etc/passwd
  を /etc/passwd にハードリンクするか、（シンボリックリンクが好みな
  ら）/etc/passwd を /clients/etc/passwd へリンクします（逆にしないでく
  ださい。クライアントはサーバーの etc ディレクトリをマウントしませんか
  ら）。/etc/group も同様です。

  3.3.2.  クライアント毎の etc ディレクトリの作成

  通常は、クライアントの etc のほとんどのファイルは /server/etc ディレク
  トリへのシンボリックリンクですが、クライアント毎に別々のファイルもあ
  り、またカーネルが読み込まれる時に必要なファイルもあります。etc ディレ
  クトリに必要な最小限のものは次のファイルです。

      resolv.conf
      hosts
      inittab
      rc.d/rc.S
      fstab

  上記５つのファイルは全てのクライアントで完全に同じファイルにすることが
  できますので、単にハードリンクかコピーするだけです。ただし rc.S と
  fstab ファイルに関しては各クライアント毎に用意するほうがよいです。また
  各クライアント用に etc/ホスト名 も必要になるでしょう。ハードウェアの設
  定が違うかもしれないので、個人的には rc.d の全てのファイルをクライアン
  ト毎に用意することを勧めます。
  各クライアント用に、fstab に適切な swap 指定の行を追加します。

      /dev/swap_partition                 swap    swap    default  1 1

  残りの、クライアントの /etc ファイルに関しては /clients/etc/* へハード
  リンクするか、/server/etc（/clietns/etc/ のマウントポイント）へシンボ
  リックリンクすることができます。

  端末が named もしくは etc/hosts 経由により名前解決を正常にできることを
  確認してください。名前解決のためにサーバーの IP を etc/hosts に記述す
  ることは悪いアイデアではありません。named での解決のみをする場合 named
  で問題が発生すると、クライアントの起動をすることができませんから。

  3.4.  起動

  さあ、あと必要なことはマシンを起動することです。モニターの前で正座して
  正常に動作することを祈りましょう :-)

  4.  クライアントの追加

  今まで指示した方法に従っていれば簡単です。cd /clients/ して次のように
  入力するだけです。

      cp -a hostname1 hostname2

  次の点について確認してください。

  rc.d/* ファイルがハードウェアにあった設定になっていること、etc/ホスト
  名 の必要なソフトの設定、fstab の swap 行が正しいこと、dev/mouse,
  dev/modem, dev/cdrom のシンボリックリンクが正常なこと。

  Good Luck....

