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版)の最新版は、 から入手できます。 ______________________________________________________________________ 目次 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 ( ), the author of this mini-HOWTO, or Greg Hankins, the Linux HOWTO coordinator, at via email, or at +1 404 853 9989. もしご質問があれば e-mail で、この mini-HOWTO の著者である Ofer Maor ( )、あるいは Linux HOWTO のコーディネーターの Greg Hankins までどうぞ。 If you have anything to add to this Mini-Howto, Please mail the author (Ofer Maor, ), with the information. Any new relevant information would be appreciated. この Mini-Howto に追加したいことがあれば、著者(Ofer Maor, )までメールしてください。どのような関連情報で あっても感謝します。 1.1. 謝辞 NFS-Root Howto の著者である Andreas Kostyrca ( ) に感謝します。彼の Mini-Howto は NFS Root マウントのクライアントの作成のための第一歩として役に立ちました。 私の Mini-Howto は彼の作業を無駄にしようとするものではなく、よりよいも のにするために私の経験を生かそうとするものです。 また Mark Kushinsky ( ) には私の英語と、この Howto のスペルを洗練して、より読みやすくしてくれた事に感謝します。 2. 序文 この Mini-Howto はクライアントのディレクトリを作成するために NFS Root マウントをしたい方を手助けするために書かれました。あなたのニーズ、ある いは意図により実現するための方法はたくさんあるということを忘れないでく ださい。 もしもクライアントマシンが複数あり、個々のクライアントにそれぞれユーザ ーと管理者がいる場合に必要なことは、クライアント毎のディレクトリを作成 して他のクライアントと共有しないことであり、これは非常に重要です。 逆にクライアントが複数のユーザー用で、管理者業務を同じ人間が行う場合 (たとえばコンピューター教室など)、できるだけ多くのファイルを共通にし て管理しやすくすることが必要となるでしょう。この Howto では後者の、 ファイルを共通して使用する方法について述べていきます。 2.1. 概略 クライアントのルートディレクトリを作成する場合にクライアントのサイズを 小さくするために、どのファイルを共有できるか、またはサーバーからマウン トすることができるかということについて、主に焦点を当てます。またこの Howto では私の経験から得たクライアントの設定をお勧めしていきます。 o この Mini-Howto では NFS ルートマウントを行う方法そのものについては 説明しません。必要な場合は NFS-Root Mini-Howto を参照してください。 (訳注: 翻訳版は JF プロジェクトの Web サイト にあります) 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) 各ホスト(クライアント)毎に別々に用意される1番目の行 /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 権限でマウントされる場合には、無効にしなければなりませ ん。私が推奨するのは、どのような場合であっても無効にすることです。 最後に、サーバー上でもクライアント上と同じユーザー情報を使用したいので あれば、次の2つを使うとよいでしょう。 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 上記5つのファイルは全てのクライアントで完全に同じファイルにすることが できますので、単にハードリンクかコピーするだけです。ただし 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....