NFS HOWTO Nicolai Langfeldt janl@linpro.no Version 1.0, 1 October 1999 中野武雄 nakano@apm.seikei.ac.jp Version 1.0j1, 23 October 1999 NFS クライアントとサーバの設定方法。 ______________________________________________________________________ 目次 1. 前書き 1.1 法的なこと 1.2 免責 1.3 フィードバック 1.4 その他 2. README.first 3. NFS サーバの設定 3.1 設定の前に 3.2 はじめのいっぽ 3.3 ポートマッパ (portmapper) 3.4 mountd と nfsd 4. NFS クライアントの設定 4.1 mount のオプション 4.2 NFS を最適化する 5. 遅いラインを通しての NFS 6. セキュリティと NFS 6.1 クライアント側のセキュリティ 6.2 サーバ側のセキュリティ: nfsd 6.3 サーバ側のセキュリティ: ポートマッパ 6.4 NFS とファイアウォール 6.5 まとめ 7. マウントのチェックリスト 8. FAQ 9. ファイルシステムをエクスポートする 9.1 IRIX, HP-UX, Digital-UNIX, Ultrix, SunOS 4 (Solaris 1), AIX 9.2 Solaris 2 10. Linux 2.2 における NFS 10.1 クライアント 10.2 サーバ 11. フロッピー起動の NFS サーバ 11.1 はじめに 11.2 環境 11.3 必要条件 11.4 サーバのセットアップ 11.4.1 臨時 NFS サーバをブートする 11.4.2 フロッピーと CDROM をマウントする 11.4.3 臨時サーバのネットワークをセットアップする 11.4.4 NFS 共有のセットアップ 11.4.5 NFS サーバを実行する。 11.4.6 完了。インストール開始 11.5 トラブルシュート 11.5.1 今のところなし。 11.6 TODO 11.6.1 DOS ディスク 11.6.2 rpc コマンド 12. PC-NFS ______________________________________________________________________ 1. 前書き 1.1. 法的なこと (C)opyright 1997-1999 Nicolai Langfeldt and Ron Peters. Do not modify without amending copyright, distribute freely but retain this paragraph. The FAQ section is based on a NFS FAQ compiled by Alan Cox. The Checklist section is based on a mount problem checklist compiled by the IBM Corporation. The nfs-server-on-a-floppy section was written by Ron Peters. この文書の著作権は (C)opyright 1997-1999 Nicolai Langfeldt にありま す。この文書を修正する場合は著作権表示にもその旨明記して下さい。この段 落を残しておけば自由に再配布することができます。 FAQ セクションは Alan Cox によって編まれた NFS FAQ を基にしています。チェックリストの節は IBM Corporation によって編まれた mount problem checklist を基にしてい ます。「フロッピー起動の NFS サーバ」のセクションは Ron Peters が書い たものです。 訳注:翻訳は中野武雄が行いました。 (C)opyright 1997-1999 Takeo Nakano 1.2. 免責 Neither Nicolai Langfeldt, Ron Peters, nor their employers, or anyone else, take any responsebility for what might happen if you follow the instructions in this document. If you choose to follow the instructions in any case, good luck! Nicolai Langfeldt も Ron Peters も彼らの雇用者やその他どんな人も、この 文書に書いてある説明に従った結果あなたに何が起ころうと、一切責任をとり ません。これを踏まえたうえで説明に従うなら、どうぞ幸運を! 1.3. フィードバック この文書はまだ完成したものではありません。この HOWTO 文書をより良い物 にするために、問題点や成功例などについて筆者にメールを送って下さい。現 金、コメント、質問などは janl@math.uio.no まで。またフロッピー起動の NFS サーバに関しては rpeters@hevanet.com まで。メールを送り、返信を希 望する場合には、返信先のアドレスが正しく機能していることをくれぐれも確 認して下さるようにお願いします。どれだけたくさんのメールが不達で戻って くるか、きっと想像もつかないでしょう。 訳注:翻訳に関するコメントは中野武雄 nakano@apm.seikei.ac.jp までお願 いします。本文書の翻訳に当たっては、嶋崎さん、なかごめさん、岡本さんは じめ JF メーリングリストの皆さんに有益なご指摘をいただきました。また特 に武井さんには多くの校正コメントをいただきました。 1.4. その他 この HOWTO 文書を翻訳する場合も私に知らせて下さい。どの言語に私の名前 が載ったかを知りたいので :-) この文書を書くことを私に勧め、また多くの有益な助言をくれた Olaf Kirch に感謝 (とグチを少々 :-)。 この HOWTO 文書は Anne Line Norheim Langfeldt に捧げる。といっても彼女 がこの文書を読むことは無いだろうけど。そういった類の女の子じゃないから なあ - Nicolai 2. README.first NFS (Network File System) には三つの重要な特性があります。 o NFS を用いるとネットワークで接続されたホスト間でファイルを共有でき るようになります。 o たいていの場合はうまく動きます。 o NFS はシステムにセキュリティ上の問題をたくさん持ち込みます。これら の問題はみなクラッカーに良く知られているので、あなたのファイルに対 するアクセス権 (read、write そして delete) が侵される可能性がありま す。 この文書ではこれらの点それぞれについて述べるつもりです。この文書のセ キュリティに関する節は必ず読むようにして下さい。間抜けなセキュリティホ ールを残しておきたくはないでしょう?セキュリティに関する部分は技術的に 高度な内容を含むことがあるので、 IP ネットワーキングや関連用語に対する ある程度の知識を必要とします。もしわからない言葉が出てきたら、他のネッ トワーク関連の HOWTO 文書を読むか、ネットワーク管理に関する書籍を読ん で、 TCP/IP の用語に慣れるようにして下さい。これらはいずれにせよ UNIX や Linux マシンの管理をするには必要なことですから。この分野に関する非 常に良い本を紹介しておきましょう。 Craig Hunt による TCP/IP Network Administration で、出版社は O'Reilly & Associates, Inc. です。この本を 読んで内容を理解すれば、以降職探しに苦労することはなくなるでしょう :-)。 訳注:この本は日本語版がオーム社からでています。邦題は「TCP/IP ネット ワーク管理」です。 NFS のトラブルシュートの役に立つセクションを 2 つ設けました。 ``マウン トのチェックリスト'' と ``FAQ'' です。もし何かうまく動かない場合には、 これらの節を参照して下さい。 Linux 2.0 用 nfsd のホームサイトは ftp.mathematik.th- darmstadt.de:/pub/linux/okir です。 nfsd を自分でコンパイルする必要の ある人やそうしたい人はこちらへどうぞ。 Linux 2.2 における NFS の情報は ``Linux 2.2 の節'' を見てください。 3. NFS サーバの設定 3.1. 設定の前に この HOWTO を読み進める前に、まずサーバ及びクライアントとして使うマシ ンの間で、それぞれ互いに telnet 通信ができるように設定しておく必要があ ります。もしこの設定がなされていない場合は、 NET-3 HOWTO などを読んで 必要なネットワーク設定を行って下さい。 3.2. はじめのいっぽ 何はともあれ NFS サーバのセットアップがまず必要です。もし読者であるあ なたが大学のネットワークに参加している場合には、おそらく何台もの NFS サーバが既に存在していることでしょう。これらのサーバに対するアクセス権 があり、この HOWTO をその設定のために読んでいる場合には、この章を読む 必要はありません。 ``NFS クライアントの設定'' に進んで下さい。 また Linux 以外のマシンを NFS サーバにしたい場合は、システムのマニュア ルを探して、サーバ機能の立ち上げ方法と、ファイルシステムを NFS によっ て export する方法とを理解する必要があります。この HOWTO にも、他のい ろいろなシステムでサーバを立ち上げる方法について説明した節を設けてあり ます。サーバとしての設定をすべて行うことができたら、この HOWTO の次の 章に進んで下さい。あるいはこの章を読み進んでみても良いかもしれません。 この章で述べている内容には、サーバにするマシンの種類によらず役に立つこ とも一部含まれていますから。 急いでいる人は、 ``Linux 2.2 の節'' を見てからここを読んでください。 さて、ここまで読み進んできたあなたは、以下のようなたくさんのプログラム の設定をすることになります。 3.3. ポートマッパ (portmapper) ポートマッパは Linux では portmap か rpc.portmap というファイル名に なっています。私のシステムの man ページによると、これは「DARPA ポート を RPC プログラム番号にマップするプログラム」となっています。さて、こ のプログラムが本 HOWTO 文書における最初のセキュリティ・ホールとなりま す。この穴を塞ぐ方法については ``NFS のセキュリティ'' に書いてありま す。しつこいようですが、必ず読んでおくようにして下さい。 ではポートマッパを起動しましょう。おそらく /usr/sbin ディレクトリに portmap か rpc.portmap という名前で存在しているはずです (一部のシステ ムでは rpcbind となっていることもあります)。とりあえず今は手動で起動す れば良いですが、このプログラムはシステムをブートするたびに実行させるも のですから、 rc スクリプトに記述しておくとよいでしょう。 rc スクリプト に関しては init の man ページに詳しい記述があるでしょう。おそらく /etc/rc.d か /etc/init.d, /etc/rc.d/init.d あたりのディレクトリにある はずです。 inet のようなファイル名のものが、おそらく編集対象とすべきス クリプトです。しかし、どのように編集すればよいかというのはこの HOWTO の範囲を越えていますので触れません。さてポートマップを起動し、実行され ているかをまず ps aux で、次に rpcinfo -p で確認しましょう。動いてまし たか?よろしい。 おっと、一つ注意点があります。ポートマッパへのリモートからのアクセスは /etc/hosts.allow ファイルと /etc/hosts.deny ファイルの記述によって制限 されます。ポートマッパが動いているのに rpcinfo -p に失敗する場合は、こ れらのファイルをチェックしてください。記述に関する詳細は ``セキュリ ティの節'' を見てください。 3.4. mountd と nfsd 次に必要になるプログラムは mountd と nfsd です。しかしこれらを起動する 前に、まず別のファイルを編集しなければなりません。 /etc/exports です。 例えば eris というマシンにある /mn/eris/local というディレクトリ以下を apollon というマシンから利用できるようにしたい場合を考えましょう。この 場合は eris の /etc/export に以下のような行を挿入します。 ______________________________________________________________________ /mn/eris/local apollon(rw) ______________________________________________________________________ ここでは appllon に /mn/eris/local への読み書きの許可を与えています。 rw の代わりに ro とすることもでき、この場合は読み出しだけの許可になり ます (何も書かなければ読み出しだけの許可が与えられます)。他にもいくつ かオプションが ありますが、そのうちセキュリティに関連したものについて は後で触れるつもりです。これらオプションのすべては exports の man ペー ジに記述があります。少なくとも一生に一度は目を通しておくべきでしょう。 また exports には全てのホストを一つ一つ書く必要はなく、もう少し便利な 方法があります。例えば NIS や NYS (YP という方が馴染みがあるかもしれま せん) を使っている場合は、ネットグループによる指定が可能です。 NIS を 使っていなくても、マウント許可を与えるホストの指定にドメインのワイルド カードや IP のサブネットを用いることができます。ただしこのように一律な 許可属性を与えるときは、許可したくないユーザにまでアクセス許可を与えて いないかどうか注意する必要があります。 注意: この exports ファイルの書式は他の Unix で使われるものとは異なっ ています。他の Unix における exports ファイルに関しては、この HOWTO に も別の節を設けてあります。 では mountd (rpc.mountd というファイル名かもしれません) と nfsd (こち らも rpc.nfsd かも) を起動することにしましょう。これらのプログラムはい ずれも exports ファイルを参照します。 /etc/exports を編集したら、 mountd と nfsd にファイルが変更されたこと を知らせる必要があります。伝統的な方法は exportfs を実行することでした が、たいていの Linux 配布パッケージには exportfs プログラムは入ってい ません。このような場合は以下のスクリプトをお使いのホストに準備すると良 いでしょう。 ______________________________________________________________________ #!/bin/sh killall -HUP /usr/sbin/rpc.mountd killall -HUP /usr/sbin/rpc.nfsd echo re-exported file systems ______________________________________________________________________ このファイルを例えば /usr/sbin/exportfs という名前で保存し、忘れずに chmod a+rx します。以降は exports ファイルを編集するたびに root になっ てこの exportfs コマンドを実行して下さい。 では mountd と nfsd がちゃんと実行されているかを確認しましょう。まず rpcinfo -p を実行して下さい。以下のような表示が出ると思います。 ______________________________________________________________________ program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100005 1 udp 745 mountd 100005 1 tcp 747 mountd 100003 2 udp 2049 nfs 100003 2 tcp 2049 nfs ______________________________________________________________________ このようにポートマッパによって portmapper 自身と mountd、 nfsd がアナ ウンスされます。 rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused や RPC_PROG_NOT_REGISTERED というような表示が出た場 合には、ポートマッパが実行されていません。あるいは /etc/hosts.{allow.deny} の記述がポートマッパに作用して、返答をさせない ようにしているのかもしれません。これらのファイルに関する詳細は ``セ キュリティの節'' を見てください。 No remote programs registered. とい う表示が出た場合はポートマッパに問い合わせる許可が無いか、何かがおかし くなっています。 nfsd、 mountd とポートマッパを kill して、もう一度最 初から実行しなおしてみて下さい。 ポートマッパのサービスに関する表示を確認したら、 ps によっても確認して みて下さい。ポートマッパはサービスプログラムが終了した後でもサービスポ ートを報告してしまうので、何かおかしくなったら ps でチェックしてみる方 が賢い場合もあります。 ブートの度に mountd と nfsd を起動したい場合には、もちろんポートマッパ の場合と同じようにシステムの rc スクリプトを修正する必要があります。お そらくほとんどの場合には、あなたのマシンに既にスクリプトが存在している と思います。この場合は必要な部分をコメントアウトして、必要なデーモンが 適切な実行レベルで起動されるようにするだけです。 読んでおくべき man ページは、 portmap, mountd, nfsd, exports です。 さて、ここまで私の言ってきたことがすべて実行されたら、 NFS クライアン トを起動するための準備が整ったことになります。 4. NFS クライアントの設定 まずカーネルに NFS ファイルシステムの機能を持たせる必要があります。直 に組み込むか、モジュールとして利用できるようにするかしておいて下さい。 これらはカーネルをコンパイルする前に指定します。まだ一度もカーネルのコ ンパイルをしたことのない人は kernel HOWTO などを読んでがんばって下さ い。また良くできた配布パッケージ (Red Hat など) を使っていて、これまで カーネルやモジュールをいじっていない (つまり台無しにしていない :-) の なら、おそらく NFS はすでに利用できるようになっているでしょう。 続いて root のプロンプトで適切な mount コマンドを実行すればファイルシ ステムを利用できるようになります。前の章からの例を続けることにして、 eris の /mn/eris/local をマウントする場合を考えます。この場合は以下の ようなコマンドになります。 ______________________________________________________________________ mount -o rsize=1024,wsize=1024 eris:/mn/eris/local /mnt ______________________________________________________________________ rsize と wsize オプションについては後で説明します。この時点で /mnt 以 下でファイルシステムが利用できるようになっているはずです。 cd や ls し たり、それぞれのファイルを見ることもできます。このファイルシステムはロ ーカルなものよりは遅いかもしれませんが、でも ftp よりはずっと便利で しょう? もしマウントがうまく行かなくて、 mount: eris:/mn/eris/local failed, reason give by server: Permission denied というようなエラーメッセージ が出る場合には、サーバの exports ファイルが間違っていないか、修正後に exportfs の実行を行ったかを確認して下さい。また mount clntudp_create: RPC: Program not registered というエラーだった場合は、サーバで mountd か nfsd が実行されていないのが原因です。あるいは先に紹介した hosts.{allow.deny} の問題かもしれません。 ファイルシステムを切り離すには以下のようにします。 ______________________________________________________________________ umount /mnt ______________________________________________________________________ システムの起動時に NFS ファイルシステムをマウントさせるためには、 /etc/fstab ファイルを通常のように編集します。我々の例に従えば、以下の ような行が必要になります。 ______________________________________________________________________ # device mountpoint fs-type options dump fsckorder ... eris:/mn/eris/local /mnt nfs rsize=1024,wsize=1024 0 0 ... ______________________________________________________________________ これでほとんど終わりですが、この先も読んで下さいね。 4.1. mount のオプション 他にも一緒につけておくと良さそうなオプションがあります。 NFS サーバが クラッシュしたときやネットワークが切断されたときにクライアントでどうす るかを指定するものです。この状態を美しく扱うことができるのが NFS の良 いところの一つです。サーバの障害にあたっては二つのモードがあります。 soft NFS クライアントは NFS マウントされたファイルシステムにアクセス しているプロセスにエラーを通知します。このエラーを正しく扱えるプ ログラムはほとんどありません。この設定はお勧めできません。これは ファイルを破壊したりデータをロストするための手段です。特にメール のディスクには使うべきではありません -- メールに価値を認めている ならば。 hard NFS マウントされたファイルシステム上のファイルにアクセスしている プログラムはサーバがクラッシュすると宙ぶらりんになります。これら のプロセスは intr を一緒に指定していない場合は中断することも kill することもできなくなります。 NFS サーバが復活すると、プログ ラムはそれぞれ何もなかったかのように再開します。おそらくこちらが 望ましい場合が多いでしょう。私は全ての NFS マウントに hard,intr を用いることをお勧めします。 以前の例をまた用いることにします。 fstab のエントリは以下のようになり ます。 ______________________________________________________________________ # device mountpoint fs-type options dump fsckorder ... eris:/mn/eris/local /mnt nfs rsize=1024,wsize=1024,hard,intr 0 0 ... ______________________________________________________________________ 4.2. NFS を最適化する rsize や wsize といったオプションがない場合、通常 NFS は 4096 か 8192 バイトを単位に読み書きを行います。しかし Linux のカーネルとネットワー クカードの組み合わせによっては、この設定では動かなかったり、あるいは遅 くなってしまったりする場合があります。ですからここでは実験を行って、最 速になるような rsize や wsize を決定するやり方を述べることにします。転 送速度は簡単なコマンドの組み合わせで調べることができます。先ほど示した mount コマンドで書き込み可能にしたディスクに以下のようなコマンドを用い ると、シーケンシャルな書き込みの性能をテストすることができます。 ______________________________________________________________________ time dd if=/dev/zero of=/mnt/testfile bs=16k count=4096 ______________________________________________________________________ このコマンドによって中身がすべて 0 のバイト列で埋め尽くされた 64Mb の ファイルができます (おそらくこれだけのサイズがあれば、パフォーマンスに 対するキャッシュの影響を小さくできるでしょう。もしたくさんメモリを積ん でいる場合にはもっとファイルを大きくして下さい)。何度か (5〜10 回くら い) 行って平均時間を求めて下さい。この場合最も大事なのは `elapsed' あ るいは `wall clock' で表示される時間です。次にこのファイルを再読み込み することで、読み込み性能のテストを行います。 ______________________________________________________________________ time dd if=/mnt/testfile of=/dev/null bs=16k ______________________________________________________________________ こちらも数回行って平均しましょう。その後 umount し、 rsize と wsize に大きな値を入れて再び mount して下さい。値は 1024 の倍数になるように し、 16384 バイトは越えないようにしましょう (これは NFS バージョン 2 の制限です)。 mount したらそのファイルシステムに cd で入り、ファイルシ ステムの中味が正しく見えるかをしばらく調べてみて下さい。 rsize や wsize が大きく過ぎると、妙な兆候が現われ、ファイルの信頼性が 100% でな くなります。よくある例としては、「エラーメッセージは出ないのに "ls" の 結果が不完全になる」「エラーメッセージは出ないのにファイルの読み込みが 失敗する」などがあります。さて、与えた rsize と wsize でシステムが正し く動作していることがわかったら、もう一度速度のテストをしてみましょう。 サーバの OS が違うと最適なサイズも異なる場合が多いです。 SunOS や Solaris の場合は 4096 が他に比べてずっと速かったりするそうです。 最近の Linux カーネル (1.3 のどれか以降) では rsize をマシンのページサ イズと同じかそれ以上にすると先読みが行われます。 Intel の CPU ではペー ジのサイズは 4096 バイトです。先読みは NFS の読み込み速度をはっきり体 感できるほど高速化します。ですから Intel のマシンでは、可能ならば rsize を 4096 バイトにすると良いでしょう。もちろんあくまで可能ならば、 です。 rsize と wsize を反映させるためには /etc/fstab の編集が必要になること をお忘れなく。 NFS の書き込み速度を上げる技として、サーバの同期書き込みを禁止する方法 があります。 NFS の仕様によると、データが不揮発性のメディア (普通は ディスク) に書き込まれるまで、NFS の書き込み要求は終了されたとは見なさ れません。この仕様のため書き込み性能に制限が生じます。また非同期書き込 みによって NFS の書き込み速度が上昇するのはこのためです。これまで Linux の nfsd で同期書き込みが実装されたことはありません。なぜなら Linux のファイルシステムの実装においては同期書き込みが重要視されていな いからです。しかし Linux 以外のサーバでは exports ファイルに以下のよう な記述をすることによって性能を上げることが可能です。 ______________________________________________________________________ /dir -async,access=linuxbox ______________________________________________________________________ 書式は異なるかもしれませんので、そのマシンの exports の man ページを参 照して下さい。なお、これによってデータを失う危険性が高まることは知って おいて下さい。 5. 遅いラインを通しての NFS 「遅いライン」としてはモデムや ISDN、あるいは遠く離れたコネクションな どを想定しています (ありがちなのは最後でしょう)。 この節はプロトコルの知識に基づいて書いたたもので、実際の実験は行ってい ません。うまくいったら教えてくださいね :-) まず覚えておいて欲しいことは、 NFS は遅いプロトコルである、ということ です。 NFS はオーバーヘッドが大きいのです。 NFS を用いるのはファイル転 送に kermit を用いるようなもので、遅いのです。ほとんどのプロトコルは NFS より速く、 FTP, HTTP, rcp, ssh 全部そうです。 でも試してみたい、ですか?わかりました。 NFS のデフォルトのパラメータは、極めて高速かつ遅延の少ないラインに向い たものになっています。デフォルトのパラメータを遅延の大きいラインに用い ると、「NFS からエラーがレポートされる」、「オペレーションが中断す る」、「ファイルが実際より小さくなる」などなど、様々な不思議な現象に見 舞われることになります。 まず最初に行うべきは、マウントオプション soft の使用を中止することで す。これを用いるとタイムアウトがおこり、ソフトウェアにエラーが返されま す。たいていのソフトではこのエラーを正しく扱えるようになっていません。 これが不可思議なエラーの主な理由です。代わりにマウントオプションとして hard を用いて下さい。 hard を有効にすると、無限にリトライを繰り返すよ うになり、ソフトウェアの都合を考えずに勝手に中断したりすることがなくな ります。こちらの方が良いんです。本当です。 次にすべきことは、マウントオプションの timeo と retrans をチューンする ことです。これらは nfs(5) のマニュアルページに記述されていますが、ここ にもコピーを書きます。 timeo=n RPC タイムアウトの後、最初の再送を行うまでの時間を 1/10 秒単位で 指定する。デフォルトは 7 (つまり 0.7 秒)。最初のタイムアウトの後 は、タイムアウトの時間は倍々される。これはタイムアウトが最大値の 60 秒になるか、あるいは再送の回数が指定した値よりも大きくなって メジャータイムアウトとなるまで続く。メジャータイムアウトになる と、ファイルシステムがハードマウントされている場合には、新たなタ イムアウト列が初期値を 2 倍にして再び試みられる (列の内部ではタ イムアウトは倍々)。タイムアウトの最大値は常に 60 秒である。ネッ トワークが混雑している、サーバが遅い、経路に複数のルータまたはゲ ートウェイがある、などの場合にはこのタイムアウトを増やすことに よって全体の性能を向上させることができる。 retrans=n マイナータイムアウトと再送の合計数がこの値を超えるとメジャータイ ムアウトとなる。デフォルトは 3 回。メジャータイムアウトが起こる と、ファイル操作は中断されるか、あるいは "server not responding" のメッセージがコンソールに表示される。 もうちょっとわかりやすく言いましょう。もし返事がタイムアウトである 0.7 秒 (700ms) のうちに返ってこないと、 NFS クライアントはリクエストを再送 してタイムアウトを倍の 1.4 秒にします。さらに返事が 1.4 秒以内に返って こない場合には、再度リクエストを送り、タイムアウトも倍の 2.8 秒にする わけです。 ラインの速度は ping で測定することができます。パケットのサイズは rsize/wsize オプションで与えた値と同じにします。 ______________________________________________________________________ $ ping -s 8192 lugulbanda PING lugulbanda.uio.no (129.240.222.99): 8192 data bytes 8200 bytes from 129.240.222.99: icmp_seq=0 ttl=64 time=15.2 ms 8200 bytes from 129.240.222.99: icmp_seq=1 ttl=64 time=15.9 ms 8200 bytes from 129.240.222.99: icmp_seq=2 ttl=64 time=14.9 ms 8200 bytes from 129.240.222.99: icmp_seq=3 ttl=64 time=14.9 ms 8200 bytes from 129.240.222.99: icmp_seq=4 ttl=64 time=15.0 ms --- lugulbanda.uio.no ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max = 14.9/15.1/15.9 ms ______________________________________________________________________ ここでの時間は ping のパケットが lugulbanda まで往復する時間を測ってい ます。 15ms はきわめて高速と言えます。 28000 bps のラインでは、 4000-5000ms 程度の値となるでしょう。もしラインに他の負荷がかかっている 場合にはこの時間はさらに長くなり、倍になることも珍しくありません。この 時間が長いことを「遅延が大きい」と言っているのです。一般的に、パケット が大きくなるほど、またラインの負荷が高くなるほど遅延は大きくなります。 timeo をあなたのラインと負荷にあわせて大きくして下さい。ラインを他の用 途に使っている場合は、その分遅延が大きくなることも考慮して下さい。例え ば FTP と NFS を同時に使いたいような場合には、 FTP でファイル転送を 行っている間に ping の時間を計測し、ラインの遅延にあった timeo を設定 すべきでしょう。 6. セキュリティと NFS 断っておきますが、私はコンピュータセキュリティの専門家ではありません。 しかしセキュリティに関して多少は役に立つアドバイスをすることができると 思います。でも注意して下さい。ここに書いてあることは NFS の問題をすべ てリストアップしたものではないのです。もしここに書いてあることを実行し ただけで「もう安心だ」と思った方は、とんだお人好しというものです。「幸 運を呼ぶツボ」とかを売りつけられないように気を付けた方が良いですよ :-)。 以下のような状況なら、この章の内容は必要ありません:あなたのホストが所 属しているのが閉じたネットワークで、そこにいる全てのユーザは信用がお け、そうでない人はネットワーク上のマシンにアクセスできないようになって いる場合です。つまりネットワークに対するダイアルアップ接続は禁止、他の ネットワークにへの接続も禁止 (そのネットのユーザが全員信頼できて、同様 のセキュリティを確保している場合は別) です。偏執に過ぎると思いますか? 全然そんなことはないんですよ。これはセキュリティに関するごく基本的な考 え方に過ぎません。それに、覚えておいて下さい、私がこれから述べることは ごく基本的なことなのです。安全なサイトを構築するには、熱心で知識が深 く、潜在的なセキュリティ上の問題点に関する最新情報の入手先を知っている ような管理者が不可欠です。 NFS の基本的な問題点は、特に指定をしなければクライアントとサーバがお互 いを信頼しあってしまうところにあります。これはまずいわけで、例えばサー バの root アカウントが破られたら、クライアントの root アカウントを破る のも非常に簡単になってしまうわけです (逆もまたしかり)。この問題を避け る方法はいくつかあり、後で説明する予定です。 CERT のセキュリティに関する勧告を読んでおくようにしましょう。この文書 の以下のほとんども、CERT が勧告した内容を扱っています。最新の勧告のリ ストは ftp.cert.org:/01-README で見ることができます。 NFS 関連の勧告を 以下にいくつか挙げておきます。 ______________________________________________________________________ CA-91:21.SunOS.NFS.Jumbo.and.fsirand 12/06/91 Vulnerabilities concerning Sun Microsystems, Inc. (Sun) Network File System (NFS) and the fsirand program. These vulnerabilities affect SunOS versions 4.1.1, 4.1, and 4.0.3 on all architectures. Patches are available for SunOS 4.1.1. An initial patch for SunOS 4.1 NFS is also available. Sun will be providing complete patches for SunOS 4.1 and SunOS 4.0.3 at a later date. CA-94:15.NFS.Vulnerabilities 12/19/94 This advisory describes security measures to guard against several vulnerabilities in the Network File System (NFS). The advisory was prompted by an increase in root compromises by intruders using tools to exploit the vulnerabilities. CA-96.08.pcnfsd 04/18/96 This advisory describes a vulnerability in the pcnfsd program (also known as rpc.pcnfsd). A patch is included. ______________________________________________________________________ 6.1. クライアント側のセキュリティ クライアント側では、サーバを信頼しすぎないように設定することが可能で、 これはマウント時のオプションで指定します。例えば NFS ファイルシステム にある suid されたプログラムを動作させないようにするには nosuid オプ ションを使います。これは良い設定で、NFS マウントする全てのディスクに導 入を考えるべきだと思います。これを用いないと、サーバの root ユーザがク ライアントでも root 権限を奪うことができてしまいます。 suid プログラム をサーバのファイルシステムに作り、クライアントに一般ユーザでログインし て先ほどの suid プログラムを実行すれば... おわかりですね?マウントした ファイルシステム上のファイルの実行をすべて禁止することもできます。これ には noexec オプションを用います。ただ、これは実際には nosuid に比べて だいぶ不便になってしまうでしょう。どんなファイルシステムにも実行しなけ ればならないスクリプトやプログラムの類がいくつかは入っているでしょうか ら。これらのオプションは /etc/fstab のオプションの列に、 rsize や wsize などと一緒にコンマで区切って記述します。 6.2. サーバ側のセキュリティ: nfsd サーバ側では、クライアントの root アカウントを信頼しないように設定する ことができます。これには exports に記述する際、 root_squash オプション を用います。 ______________________________________________________________________ /mn/eris/local apollon(rw,root_squash) ______________________________________________________________________ こうすると、クライアントで UID 0 のユーザがファイルにアクセス (read, write, delete) しようとすると、サーバは UID をサーバにおける "nobody" アカウントのものと置き換えます。つまりサーバの root だけにアクセスや変 更が許されているファイルに対して、クライアントの root がアクセスや変更 を行うことができなくなるのです。これも良い設定で、 export する全ての ファイルシステムに root_squash を用いるべきだと思います。「でもクライ アントの root ユーザは `su' を使って他のユーザになって、そのユーザの ファイルを変更できちゃうじゃないですか!」と言う意見があるかもしれませ ん。その通り、それが Unix や NFS の流儀なのです。この意見には重要な側 面があります。重要なバイナリやファイルなどは root によって保有されるべ きで、 bin などの root 以外のアカウントにするべきではありません。なぜ ならクライアントの root ユーザがアクセスできないのはサーバの root アカ ウントのファイルだけだからです。 nfsd の man ページには他にも何種類か の排他オプションが記述されています。これらを用いれば、好きな (あるいは 嫌いな) クライアントユーザを信頼しないように設定できます。また UID や GID の範囲によって排他機能を設定することもオプションで指定できます。こ れは Linux の nfsd の man ページに記述されています。 root_squash は実は Linux の NFSd ではデフォルトになっています。ファイ ルシステムへの root のアクセスを許可するには no_root_squash を指定して 下さい。 もう一つ重要なことは、 nfsd に対する特権ポートからの接続要求がチェック されているかどうかを確認しておくことです。もしクライアントからの要求を どんなポートからでも受け入れてしまうと、 NFS プロトコルを話す適当なプ ログラムを用いて、特権を持たないクライアントユーザが他のユーザに成りす ますことができてしまいます (このようなプログラムはインターネットで容易 に入手できます)。 Linux の nfsd はデフォルトでこのチェックをするように なっていますが、他の OS では手動でこのチェックを指定しなければならない かもしれません。この作業はその OS の nfsd の man ページに記述されてい るはずです。 最後にもう一つ。ファイルシステムを `localhost' や 127.0.0.1 に対して export してはなりません。私を信じて下さい。 6.3. サーバ側のセキュリティ: ポートマッパ ベーシックなポートマッパと nfsd の組み合わせには設計上の問題があり、 NFS サーバのファイルへのアクセスが特権無しに可能になってしまっていまし た。幸いなことに、ほとんどの Linux ディストリビューションが用いている ポートマッパは、この攻撃に対して比較的安全になっています。また二つの ファイルを用いたアクセスリストを設定することによって、さらに安全にでき ます。 Linux ディストリビューションは、すべて同じではありません。最近更新され たように見えるディストリビューションでも、安全なポートマッパを使ってい ないことがあります。この危険性が指摘されたのは何年も前のことで、既に常 識となっているはずなんですけど。少なくとも一つのディストリビューション では、安全なポートマッパの man ページが入っているにもかかわらず、実際 のポートマッパは安全なものではありませんでした。ポートマッパが安全なも のかどうかをチェックするためには、 strings(1) コマンドを実行し、その出 力に関連するファイル名が含まれているか、具体的には /etc/hosts.deny と /etc/hosts.allow が含まれているかを調べるのが簡単です。お使いのポート マッパが /usr/sbin/portmap でしたら、これを行うには strings /usr/sbin/portmap | grep hosts というコマンドを実行します。私のマシン では結果は以下のようになります。 ______________________________________________________________________ /etc/hosts.allow /etc/hosts.deny @(#) hosts_ctl.c 1.4 94/12/28 17:42:27 @(#) hosts_access.c 1.20 96/02/11 17:01:27 ______________________________________________________________________ さて、設定を行うには、まず /etc/hosts.deny を編集します。以下の行を書 き込みます。 ______________________________________________________________________ portmap: ALL ______________________________________________________________________ こうすると全てのアクセスを受け付けなくなります。このようにして閉じてい るあいだ、 rpcinfo -p を実行し、ポートマッパが実際にこのファイルを読ん で、その記述に従っているかをチェックしてみましょう。 rpcinfo はなんの 出力も出さないか、あるいはエラーメッセージを出すでしょう。ポートマッパ の再起動は必要ないはずです。 ポートマッパを誰からも閉じてしまうのはちょっと極端にすぎるので、 /etc/hosts.allow を編集してポートを再び開けることになります。まずどの クライアントに開けるかを決める必要があります。サーバのポートマッパにア クセスする必要のあるマシンをリストアップします。しっかりと設定されたシ ステムでは、ポートマッパのあらゆるポートにアクセスが必要なマシンという のは非常に少ないはずです。ポートマッパは nfsd と mountd、 ypbind/ypserv, pcnfsd, そして ruptime や rusers などの 'r' コマンド群 を管理します。このうち nfsd と mountd, ypbind/ypserv そして pcnfsd の みが問題の対象となるものです。ホストマシンのサービスにアクセスが必要な マシンには許可を与えなければなりません。例えばサーバのアドレスが 129.240.223.254 で、サブネット 129.240.223.0 にあるクライアントホスト にアクセス許可を与えるとします (これは networking HOWTO と同じ例です。 必要があったら networking HOWTO をもう一度見に行って、あなたの脳のメモ リをリフレッシュして下さい)。この場合は hosts.allow に以下のように書き ます。 ______________________________________________________________________ portmap: 129.240.223.0/255.255.255.0 ______________________________________________________________________ これは route コマンドで用いたネットワークアドレス及び ifconfig で用い たサブネットマスクと同じです。この場合 eth0 デバイスに対する ifconfig の結果は以下のようになっているはずです。 ______________________________________________________________________ ... eth0 Link encap:10Mbps Ethernet HWaddr 00:60:8C:96:D5:56 inet addr:129.240.223.254 Bcast:129.240.223.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:360315 errors:0 dropped:0 overruns:0 TX packets:179274 errors:0 dropped:0 overruns:0 Interrupt:10 Base address:0x320 ... ______________________________________________________________________ 同様に netstat -rn とすると以下のようになるはずです。 ______________________________________________________________________ Kernel routing table Destination Gateway Genmask Flags Metric Ref Use Iface ... 129.240.223.0 0.0.0.0 255.255.255.0 U 0 0 174412 eth0 ... ______________________________________________________________________ (先頭の列はネットワークアドレスになります) hosts.deny と hosts.allow ファイルに関しては同名の man ページに記述が あります。 訳注: 訳者のところでは "man 5 hosts_access" でした。 重要: portmap の行には IP 番号以外のものは書かないで下さい。ホストネー ムの問い合わせは間接的にポートマッパを呼び出すことがあり、するとまたホ ストネームの問い合わせが生じてポートマッパが呼び出されホストネームの問 い合わせが... 以上であなたのサーバは随分しっかりしたはずです。最後の問題は (そう、最 後の!)、信頼しているマシンで root が破られた場合(あるいは MS-DOS がブ ートされた場合) くらいです。このとき root 権限を利用すると信頼したポー トを通して他のユーザに成りすますような要求を出すことが可能になってしま います。 6.4. NFS とファイアウォール ルータやファイアウォールを用いて NFS やポートマッパのポートを塞ぐのは 非常に良い考えです。 nfsd は通常ポート 2049 の tcp/udp を用います。ポ ートマッパはポート 111 の tcp/udp、 mountd は 745 と 747 の tcp/udp を 使います。これらのポートは rpcinfo -p で調べる事ができます。 逆に NFS にファイアウォールを越えさせたい場合は、最近の nfsd や mountd にあるオプションを使って特定の (非標準な) ポートを用いるようにし、その ポートをファイアウォールで開ければ良いでしょう。 6.5. まとめ hosts.allow/deny, root_squash, nosuid そして portmapper/nfs ソフトの特 権ポート関連の機能を用いれば、現在知られているポートマッパと NFS に関 連したほとんどの問題に対処することができ、少なくとも多少は安心すること ができます。しかし /home や /var/spool/mail が NFS マウントされている と、あなたのネットワークへの侵入者は .forward やメールボックスのファイ ルに特殊なコマンドを埋め込んでしまうことができます。同じ理由から、 PGP の秘密鍵を NFS アクセスできるようにするべきではありません。あるいは少 なくとも危険性を知っていなければなりません (今や知ったわけですが)。 NFS とポートマッパは複雑なシステムの組み合わせからなっているので、将来 にわたって基本設計や実装にバグが発見されないとは限りません。あるいは現 時点においても穴が存在していて、誰かが悪用しているかもしれないのです。 まあそれが人生と言うものです。このように物事に遅れないためには、少なく とも comp.os.linux.announce や comp.security.announce などには目を通し ておく必要があるでしょう。 7. マウントのチェックリスト この節は IBM 社の「NFS mount problem checklist」をもとにしています。こ れを本 HOWTO へ引用することを許可してくれた彼らに感謝します。もし NFS ファイルシステムをマウントする際に問題が生じたら、是非ポストする前にこ のリストを参照して下さい。各々の項目で障害の様子と修正方法を記述してい ます。 1. mount が RPC: Program not registered と言い続けます。 ポートマッパは起動しているか? 解決法: 起動する。 mountd は起動しているか? 解決法: 起動する。 nfsd は起動しているか? 解決法: 起動する。 ポートマッパが /etc/hosts.deny によって反応を禁止されていないか? 解決法: hosts.deny のルールを削除するか、 hosts.allow にルールを加 え、ポートマッパが応えてくれるようにする。 2. ファイルシステムが export されていない。あるいは問題となっているク ライアントに対して export されていない。 解決法: export する。 3. export リストと name resolution が一致しない。 つまり、 export リストでは johnmad に export することになっているの に、 johnmad が johnmad.austin.ibm.com と resolve されてしま い、"permission is denied" になってしまう場合などです。 解決法:両方の名前に export する。 さらに、クライアントが 2 つのインターフェースを持っていて、それぞれ に違う名前が付いているのに、片方にしか export していない、というよ うなこともありがちです。 解決法:両方のインターフェースに export する。 またサーバがクライアントを lookuphostbyname または lookuphostbyaddr (これらはライブラリ関数です) できない場合もあるかもしれません。クラ イアントに対して host と host を行うことができ、両 者が同じマシンを示すことを確認して下さい。 解決法:name resolution をちゃんと設定する。 4. NFS がスタートした後で、サーバのファイルシステムがマウントされた。 このような場合には、サーバはマウントポイント以下に隠れた部分を export してしまい、マウントされたファイルシステムは export されませ ん。 解決法: NFSd をシャットダウンして再起動する。 注意: マウントポイント以下の隠れた部分をマウントしてしまったクライ アントは、サーバのリスタート後にアクセスできなくなります。 5. 日付がサーバかクライアント、あるいはその両方で大きくずれている。こ のような場合には、make がめちゃくちゃになります。 解決法: 日付を正しくセットする。 筆者は日付の同期に NTP を用いることを薦めます。 NTP には米国におい て輸出規制があるので、debian や redhat、 slackware 用の NTP は またはこのミラーから入 手する必要があります。 6. 8 つ以上のグループに属しているユーザからのマウント要求を受け付けな い。 解決法: そのユーザの所属するグループ数を減らすか、他のユーザでマウ ントする。 8. FAQ FAQ セクションです。この節の一部は Alan Cox によって書かれた昔の NFS FAQ をもとにしています。 ファイルシステムのマウントの際に問題が生じたら、その問題が ``マウント のチェックリスト'' の節に記述されていないか見てください。 1. Linux を nfs サーバにすると ``stale nfs handle'' というエラーが頻発 します。 これは古い版の nfsd にあるバグが原因です。 nfs-server2.2beta16 以降 では修正されています。 2. ファイルシステムをマウントしようとすると、以下のようなメッセージが 出てしまいます。 can't register with portmap: system error on send Caldera のシステムをお使いではありませんか?このシステムには rc スクリ プトにバグがあります。 Caldera に連絡して修正版を手に入れて下さい。 3. NFS サーバにコピーしたプログラムが実行できないのはなぜ? 効率上の理由で、 nfsd が open ファイルハンドラをキャッシュするから です (nfsd がユーザ領域で実行されていることを思い出して下さい)。 nfsd がファイルをオープンしている間 (つまりそのファイルに書き込みを 行った後) には、カーネルはそのファイルに実行許可を与えません。 95 年の春以降の nfsd では、このファイルハンドラのリリースは数秒で終了 しますが、古いものでは数日もキャッシュしたままのこともあります。 4. NFS ファイルが全部リードオンリーなのですが。 Linux の NFS サーバはデフォルトではリードオンリーです。この HOWTO の ``mountd と nfsd'' および ``ファイルシステムをエクスポートする'' の節を読んでください。 exports と nfsd の man ページを参照してくだ さい。 /etc/exports を修正する必要があるでしょう。 5. Linux の NFS サーバからマウントすると、 ls が動作している間にファイ ルの読み書きができなくなります。 古いバージョンでは rsize=1024,wsize=1024 をつけてマウントする必要が あります。 6. ブロックサイズを 3500 から 4000 の間にしてマウントすると、 Linux ホ ストがクラッシュすることがあります。 基本的には、その範囲以外のブロックサイズを使って下さい。これは 2.0 と 2.2 カーネルでは起こらないはずです。私が覚えている限りでは、 1.2 でも起こりませんでした。 7. Linux では TCP を用いた NFS は可能ですか? 今のところできません。 8. Linux マシンから NFS マウントをしようとすると不思議なエラーが続けざ まに表示されます。 NFS を使うユーザの所属するグループが 8 つ以内に収まっていることを確 認して下さい。古いサーバではこの条件が必要なことがあります。 9. クライアントマシンをリブートするとき、ハングした NFS サーバを umount するとクライアントがハングしてしまうことがあります。 リブートや停止するときには NFS サーバを umount せず、単に無視して下 さい。 umount しなければ何も問題を起こすことはありません。コマンド は umount -avt nonfs となります。 10. Linux の NFS クライアントから Sun や BSD のシステムに書き込むと非常 に遅いのですが。 NFS の書き込みは通常同期的に行われます (もしデータを失う危険性を気 にしなければこれを無効にすることもできます)。悪いことに、BSD から由 来したカーネルにおいては、小さなブロックにおいてこれがうまく機能し ない場合があるのです。例えば Linux から 4K のデータを 1K のパケット に分けて書き込もうとすると、 BSD は以下のような動作を行います。 read 4K page alter 1K write 4K back to physical disk read 4K page alter 1K write 4K page back to physical disk etc.. 11. たくさんのクライアントを Linux の NFS サーバに接続すると、突然性能 が落ちてしまいます。 NFS プロトコルはフラグメント化された UDP パケットを用います。カーネ ルには、不完全なパケットのフラグメントを、送出前にいくつまで持てる かという制限値があります。 2.2 では、これは /proc ファイルシステム の /proc/sys/net/ipv4/ipfrag_high_thresh と ipfrag_low_thresh を通 して実行時に変更可能です。 2.0 では、これらはコンパイル時の定数で、 .../linux/net/ipv4/ip_fragment.c で定義されている IPFRAG_HIGH_THRESH と IPFRAG_LOW_THRESH が該当します。これらの値の 意味は、一緒にされる前の UDP フラグメントによるメモリ消費が ``ipfrag_high_thresh'' バイトに達したら (2.2.3 と 2.0.36 でのデフォ ルトは 256K)、一度 ``ipfrag_low_tresh'' の大きさに切り捨ててしま う、ということなのです。これがフラグメントを投げる前に行われます。 これはほとんどパケットロスと同じように見え、したがって高いほうの閾 値に達すると、サーバの性能が非常に落ちるのです。 30 クライアントまでなら 256K で充分でしょう。 60 クライアントなら二 倍にしましょう。低いほうの閾値も二倍にしましょう。 12. 私は Linux 2.2 (以降) で knfsd を使っているんですが、私の AIX, IRIX, Solaris, DEC-Unix, ... マシンからマウントできません。 knfsd は、自分が NFS version 3 を実装しているとアナウンスします。 が、実際にはしていません。このアナウンスを止めるオプションがあるの で、これを用いてください。あるいはクライアントのマウントオプション リストに "vers=2" を追加してもいいでしょう。 13. AIX 4 マシンが Linux NFS サーバからマウントできません。代わりに以下 のようなメッセージが出ます。 mount: 1831-011 access denied for server:/dir mount: 1831-008 giving up on: server:/dir The file access permissions do not allow the specified action. AIX 4.2 は NFS に特権ポート (<1024) を使います。 AIX 4.2.1 と 4.3 はこ れ以外のポートでも使えます。また AIX 4.2.1 と 4.3 ではまず NFS3 でマウ ントしようとし、続いて NFS/TCP で、そして最後に NFS/UDP を試します。 rc.tcpip の最後に ______________________________________________________________________ nfso -o nfs_use_reserved_ports=1 ______________________________________________________________________ を追加すれば、特権ポートを使うように強制できます。 (この技は Braian Gorka より寄せられました) 9. ファイルシステムをエクスポートする NFS でファイルシステムを export するやり方は、プラットフォームが異なる と必ずしも同じとは限りません。ここでは Linux と Slaris 2 が仲間はずれ です。この節では多くのシステムにおける export の方法を簡単にリストした いと思います。もしお使いのシステムがこの中に入っていない場合には、使っ ている OS の man ページを見て下さい。キーワードとしては、 nfsd, system administration tool, rc scripts, boot scripts, boot sequence, /etc/exports, exportfs などを使うと良いでしょう。この節では 「/mn/eris/local を apollon で read/write 可能なように export する」例 について示すことにします。 9.1. IRIX, HP-UX, Digital-UNIX, Ultrix, SunOS 4 (Solaris 1), AIX これらの OS では伝統的な Sun の export フォーマットを用いています。 /etc/exports に以下のように書いて下さい。 ______________________________________________________________________ /mn/eris/local -rw=apollon ______________________________________________________________________ 詳細な解説は exports の man ページにあります。ファイルを編集したら exportfs -av を実行してファイルシステムを export して下さい。 exportfs コマンドの文法に対する厳格さはシステムによって変ります。 OS によっては先ほど入力した行が ______________________________________________________________________ /mn/eris/local apollon ______________________________________________________________________ で良いこともありますし、以下のように省略できることもあります。 ______________________________________________________________________ /mn/eris/local rw=apollon ______________________________________________________________________ が、私は正式な書式を守ることをお勧めします。次のバージョンの exportfs が急に文法に厳しくなれば、動いていたもの全てが突然止まってしまう危険性 があるのですから。 9.2. Solaris 2 Sun は Solaris 2 を開発したときに、車輪を完全に最初から再開発したよう ですね。従ってこれは他の OS とは完全に異なっています。 Solaris 2 では 編集するファイルは /etc/dfs/dfstab になっています。ここに share コマン ドを share(1M) の man ページに書かれているように記述します。以下に例を 挙げます。 ______________________________________________________________________ share -o rw=apollon -d "Eris Local" /mn/eris/local ______________________________________________________________________ 編集が終わったら、プログラム shareall を実行してファイルシステムを export します。 10. Linux 2.2 における NFS 私がこれを書いている時点では、 Linux 2.2.12 が最新のカーネルバージョン です。 NFS をこのカーネルで使うのは、ちょっと面倒な作業になるかもしれ ません (ならないかもしれません)。 Linux 2.4 の NFS がどんなふうになるのかは、私は知りません。 Linux 2.2 における大きな更新点は、カーネル内部に置かれる nfs サーバデ ーモンのサポートです。これは 2.2 では knfsd と呼ばれています。このよう な nfsd の実装には、速度をはじめとするメリットがあります。 knfsd を用 いた Linux 2.2 マシンは、悪くない nfs サーバになります。一方では、 Linux 2.2 で以前からの nfsd を使い続けることもできます。こちらの方に も、設定の簡単さなどのメリットがあります。 お使いのカーネルソース (またはバイナリ) パッケージが、 RedHat (6.0 以 降) や SuSE (6.1 以降、のはず) などのプロフェッショナルなシステムイン テグレータによって作られたものなら、そのカーネルには "knfsd" の機構は ちゃんと入っているでしょうから、心配する必要はありません。ちゃんと動く でしょう。ほとんどの場合は。あなたが自分自身のカーネルをコンパイルした くなるまでは。手を加えない、そのままの Linux 2.2 カーネルを使う場合 は、 (少なくとも 2.2.12 までは) knfsd はうまく動きません。 これを自分でなんとかしたい場合は、 H.J. Lu の knfsd パッケージを入手す る必要があります。これはパッチと 2.2 に必要なユーティリティとを集めた もので、 Lu が空き時間にメンテナンスしています。これはお近くのカーネル ミラーから入手できます。マスターサイトは ftp.kernel.org:/pub/linux/devel/gcc/ です。これは一般向けのものではあ りません。このパッケージの内容に理解できない部分があったら、自分で使お うとは思わないことです。お好みのシステムインテグレータ (つまり Red Hat や SuSE, ...) によるカーネルパッケージが登場するまで待ちましょう。 また、これに関する質問は私には送らないでください。お助けできません。私 は knfsd ベースのサーバは 1 台も使っていません。この文書に間違いや遺漏 がある場合は、お知らせください。この HOWTO を改版して再リリースします から。 まだ読んでますか? 了解。 H.J. Lu はこのパッケージの新しいバージョンの 情報を linux-kernel メーリングリストにポストします。 2.2 の NFS に関す るその他の話題もここにポストされます。講読すること。 knfsd パッケージには、書いておきたい興味深い点がひとつあります。 knfsd は、自分が NFS version 3 をサポートしているとアナウンスするのですが、 実際にはサポートしていないんです。オプションを与えれば、 NFS3 のアナウ ンスを止めることができます。あるいはクライアントでのマウントオプション リストに "vers=2" と指定するのでも OK です。 10.1. クライアント クライアントはほぼ簡単です。適切なロック動作をさせるには、 statd (knfsd パッケージのもの) をコンパイル・インストールし、ブートスクリプ トから起動する必要があります。さーどうぞ。 statd が機能するには、 /var/lib/nfs というディレクトリが必要です。これがないと statd はエラー メッセージを出さずに単に停止します。ですから statd を起動する前にこの ディレクトリを作っておくようにしてください。 statd が起動したら、 testlk プログラム (/tools/locktest にあります) を 使い、 NFS マウントされたファイルシステム上で、ファイルシステムのロッ ク動作が正しく動作しているかテストしてみましょう。しているはずです。 No locks available が表示されるようなら、 statd は動作していません。 実際にはロックをまるっきり行わないことも可能です (お薦めはしません)。 これには mount のオプションリストに "nolock" を指定します。 私の知るかぎりでは、クライアントを動作させるために必要なことはこれです べてです。 おっと、 Sparc や Alpha の NFS サーバを使っている場合には、 Linux 2.2 の nfs クライアントはまるっきりダメかもです。サーバへの/サーバからの転 送速度が無茶苦茶悪くて... きっと想像もできないでしょう。 Linux 2.0 よ りもずっと悪いんです。ずっとです。しかしもちろん修正方法はあります。 Alan Cox 系の 2.2 カーネル (これは Linus のノーマルな 2.2 カーネルより 少々実験的なものです) にはパッチが含まれており、これを用いれば Linux 2.2 を Alpha や Sparc サーバと一緒に使ったときの性能が向上します。 Alan Cox の 2.2 カーネルを使いたい場合は linux-kernel メーリングリスト を読むべきです。そうすればパッチの場所もわかるでしょう。このパッチを素 の Linux カーネルに当てたい人向けのホームサイトは です。このパッチはおそらく Linux 2.4 に当てることはできないでしょう。現在の開発サイクルから見ると多すぎる変 更を必要とするからです。 Linux 2.5 を待ちましょう。 trondmy にも Linux に NFS version 3 の利用を可能にさせるパッチがありま す。これは転送機構を UDP の代わりに tcp にすることもできます。 NFSv3 は長く引っ張られたネットワークや、パケットロスがあるネットワーク、遅延 の大きいネットワークなどに非常に適しています。 これらのパッチを使う人は、 linux-kernel メーリングリストを読むべきで す。これらにはときどきひどいバグが見付かることがあるんです。バグはあな たのファイルを食べてしまいます。どうか気をつけて。 10.2. サーバ Linux 2.2 以降での nfs サーバデーモンは "knfsd" と呼ばれます。設定には 技がいります。これはご自分で解決していただくか、 SuSE, Red Hat などが リリースしようとしている 2.2 カーネルパッケージを使ってください。ごめ んなさい。でも Linux 2.2 でも古い nfsd を使いつづけることは可能です。 遅いですが設定は簡単です。 11. フロッピー起動の NFS サーバ この節は Ron Peters rpeters@hevanet.com によって書かれたものです。フ ロッピーからブートして、 NFS サーバを設定する方法を解説しています。こ の方法は、 CDROM のないマシンに Linux をインストールする場合に、他の非 Linux/UNIX マシンに CDROM を NFS エクスポートさせることを目的として考 案されました。 11.1. はじめに この文書は、私が最近出会ったものと同じ問題に突き当たった人のために作成 しています。私は CDROM ドライブがないマシンを Linux サーバにしようとし ていました。また CDROM を追加することもできませんでした。外付けの SCSI CDROM などは可能だったかもしれませんが。今ではこんなマシンはどんどん少 なくなっているでしょうから、この文書の価値もそれほどたいしたものではな いかもしれません。でも、サーバを作ろうとしていた当時の私は、この文書が あればきっとありがたいと思ったでしょう。 私のマシンには CDROM ドライブがなかったので、私はまず Win95 用の NFS サーバを探し、インストールしてネットワークにつなぐまでの間だけ CDROM を共有させようとしました。そのような製品は二つありました ( 名前は紹介 しませんが、一つはフリーウェアで、もう一つは 14 日間の試用ができるライ センス付きのものでした)。一つは私のマシンでは動作せず、もう一つは Linux 向けのファイル名をうまく扱えなかったので、インストールを完了させ ることができませんでした。 そこで私は自分の Win95 マシンを boot/root フロッピーでブートさせ、追加 ディスクでもって、こいつを NFS サーバにセットアップしてみることにしま した。 これは実に単純で、手順もおそらくこの文書を読むより楽なくらいかもしれま せんが、手続き全体を一つのところにまとめておくことによって、また別の価 値が生じるのではないかと信じます。 11.2. 環境 この文書のもとになった作業で用いた boot/root ディスクは、 InfoMagic に よる Slackware の最近の developer distributions のものです。 boot/root ディスクのカーネルとしては 2.0.34 を用いました。しかし NFS プログラム は 2.0.30 サーバのものから持ってきました。私はインストールにはいつも Slackware を使っていますが、これは Slackware が簡単だとか良いとか悪い とかではなく、単に私が Slackware を快適に使えていて、他の方法を試す時 間がなかったからです。 この文書の方法を別のバージョンの Linux で使っても、それほど多くの問題 が出るとは思えません。個人的にはできるだけ新しいものを使うことをお薦め します。最新の boot/root セットでは、こちらがインストールに用いられて いることが多いだろうからです。 選択はあなたのお好きなように。 11.3. 必要条件 o ネットワークの使えるシステムとブートディスク。 NFS サーバにしようと しているシステムにはネットワークカードが付属していなければならず、 またそれはブートプロセスで認識されなければなりません。これに関する より詳しい情報はネットワーク関連の HOWTO にあるでしょう。 o 交換用フロッピー。 rpc.portmap, rpc.mountd, rpc.nfsd が入っていなけ ればなりません。これらは web の ftpsearch などで簡単に見付かるはず です。 o Slackware (あるいはお好みの) ソースメディア (CD を仮定します)。 11.4. サーバのセットアップ 11.4.1. 臨時 NFS サーバをブートする NFS サーバシステムをブートフロッピーからブートし、ネットワークカードが 認識されていることを確認します。 CDROM ドライブも認識されている必要が あります。以下ではネットワークカードの例として eth0 を用います。 11.4.2. フロッピーと CDROM をマウントする システムが立ち上がったら、 boot/root フロッピーは必要ありません。シス テムは全て RAM に含まれています。 root フロッピーを追加ディスクに入れ換え、フロッピーをマウントします。 mount /dev/fd0 /floppy ここではフロッピーは ext2 ファイルシステムだとしています。ファイルを入 れておく追加ディスクは DOS フロッピーでも良いかもしれませんが、私は試 したことがありません。ディスクを作るの時にはこちらの方が簡単なのかもし れませんね。この場合は mount -t msdos ... のように入力することになるで しょう。この内容は TODO の節に入れておきますね。 さて、 CDROM をマウントします。 mount -t iso9660 /dev/hdc /cdrom フロッピーと CDROM デバイスは私の環境のものです。場合によって異なるで しょう。 /floppy や /cdrom などのマウントポイントは root フロッピーの ディスクイメージにありますので、これを使います。もしこれらがなければ、 適宜作ったり既存のものを利用したりしてください。 11.4.3. 臨時サーバのネットワークをセットアップする ここで臨時 NFS サーバがネットワークで会話できるようにします。必要なコ マンドはわずかですが、コマンドを実行する前に知っておかなければならない 情報がいくつかあります (値は例です)。 IPADDR:172.16.5.100 臨時サーバのアドレスです。 NETMASK:255.255.255.0 ネットマスクです。 BROADCAST:172.16.5.255 最後の番号 (255) が IPADDR と異なります。 ETHNETWORK:172.16.5.0 同じく、 IPADDR とちょっとだけ異なります。 GATEWAY:172.16.5.251 ゲートウェイがなければ不要です。値は知っているでしょう。家庭の ネットワークにはゲートウェイのない場合も多いでしょう。 ネットワークを利用できるようにするためのコマンド群です。上記の値を代入 してください。 ifconfig eth0 inet IPADDR arp netmask NETMASK broadcast BROADCAST route add -net ETHNETWORK netmask NETMASK eth0 ゲートウェイがない場合や、あっても必要ない場合には、次のコマンドは不要 です。 route add default gw GATEWAY netmask 0.0.0.0 eth0 全てうまくいけば、ネットワークに接続しているはずです。他のノードとの ping のやりとりもできるはずです。 11.4.4. NFS 共有のセットアップ NFS で共有させるディレクトリを決めます。この例の場合は、 /cdrom/slackware ディレクトリになります。このディレクトリを /etc/exports ファイルに書きます。 echo "/cdrom/slakware" > /etc/exports 11.4.5. NFS サーバを実行する。 /floppy/urs/sbin に移動して以下を実行します。 ./rpc.portmap ./rpc.mountd ./rpc.nfsd 11.4.6. 完了。インストール開始 これで /etc/exports ファイルに書いた "/cdrom/slakware" ディレクトリは 共有可能になったはずです。以上がすんだら、インストールを行いたいマシン を boot/root フロッピーで起動して (私は NFS サーバに使ったのと同じもの を使いました)、インストールを開始しましょう。 メディアソースの場所を選ぶところで、 NFS サーバの選択肢を選びます。サ ーバのアドレスを尋ねられるでしょうから、サーバの IPADDR に指定した IP アドレスを入力しましょう。続いてマウントするディレクトリを聞かれるで しょうから、 NFS サーバの /etc/exports に書いたディレクトリを答えてく ださい。 するとインストールシステムはサーバから NFS マウントできるはずです。エ ラーメッセージが出ないかよく見てください。問題なくいったら、インストー ルを続けましょう。 11.5. トラブルシュート 11.5.1. 今のところなし。 トラブルシュートの情報は今のところありません。おそらくこの手続きを使う 人が増えれば、たくさんの技やヒントが集まってくるでしょう。 11.6. TODO 11.6.1. DOS ディスク 追加ディスクに DOS のディスクを使う方法を調べる。 11.6.2. rpc コマンド rpc.* コマンドの実行順序と、これら全てを実行する必要があるのか、一部で 良いのかどうかを調べる。 12. PC-NFS PC-NFS を使わずに samba を使いましょう。 samba は PC-NFS よりずっと良いものです。 Windows for Workgroups 以降の Windows で動作します。より高速ですし、より安全です。 samba を使いま しょう。いやほんとに。