まずカーネルに 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 が実行されていないのが原因です。
ファイルシステムを切り離すには以下のようにします。
umount /mnt
システムの起動時に NFS ファイルシステムをマウントさせるためには、
/etc/fstab
ファイルを通常のように編集します。我々の例に従えば、
以下のような行が必要になります。
# device mountpoint fs-type options dump fsckorder … eris:/mn/eris/local /mnt nfs rsize=1024,wsize=1024 0 0 …
これでほとんど終わりですが、この先も読んで下さいね。
他にも一緒につけておくと良さそうなオプションがあります。 NFS サーバ がクラッシュしたときやネットワークが切断されたときにクライアントでどう するかを指定するものです。この状態を優雅に扱うことができるのが NFS の 良いところの一つです。サーバの障害に当たっては二つのモードがあります。
NFS クライアントは NFS マウントされたファイルシステムにアクセスしてい るプロセスにエラーを通知します。このエラーを正しく扱えるプログラムはほ とんどありませんので、この設定はお勧めできません。
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 …
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 ペー
ジを参照して下さい。なお、これによってデータを失う危険性は高まることは
知っておいて下さい。