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

2. 序文

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

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 では私の経験から得たクライアントの設定をお勧めしていきます。


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 ブートに必要な最小限のファイルシステムを作成

dev ディレクトリの作成

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

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

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

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

すべてをサーバーからマウントするわけですが、各クライアントに最小限コピーしなければならない物があります。かならず必要なものは "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 からそのファイルに関連する箇所を削りましょう。

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.3 etc ディレクトリの作成とクライアントの設定

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

各クライアントで共有する 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 の部分を全て取り除くか、または rwro に変更したほうが良いかもしれません。

サーバーの /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 も同様です。

クライアント毎の 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....


sgml21html conversion date: Mon Jan 17 11:51:50 JST 2011