まずカーネルに 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 …
これでほとんど終わりですが、この先も読んで下さいね。
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 を越えないようにするとよいでしょ
う。ブロックを大きくしすぎるとランダムアクセスの速度が落ちるからです。
mount
したらそのファイルシステムに cd
で入り、中味が正しく見
えるかをしばらく調べてみて下さい。 rsize
や wsize
を大きくし
すぎると、常にとは限りませんが妙な兆候が現われます。よくある例としては、
「"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 ペー
ジを参照して下さい。
他にも一緒につけておくと良さそうなオプションがあります。 NFS サーバ がクラッシュしたときにクライアントでどうするかを指定するものです。サー バの障害に当たっては二つのモードがあります。
NFS クライアントは NFS マウントされたファイルシステムにアクセスしてい るプロセスにエラーを通知します。このエラーを正しく扱えるプログラムはほ とんどありませんので、この設定はお勧めできません。
NFS マウントされたファイルシステム上のファイルにアクセスしているプログ
ラムはサーバがクラッシュすると宙ぶらりんになります。これらのプロセスは
intr
を一緒に指定していない場合は中断することも kill することもで
きなくなります。 NFS サーバが復活すると、プログラムはそれぞれ何もなかっ
たかのように再開します。おそらくこちらが望ましい場合が多いでしょう。私
は全ての NFS マウントに hard,intr
を用いることをお勧めします。
以前の例をまた用いることにします。 4096 バイトが読み書きに最適なこ とがわかったとしますと、 fstab のエントリは以下のようになります。
# device mountpoint fs-type options dump fsckorder … eris:/mn/eris/local /mnt nfs rsize=4096,wsize=4096,hard,intr 0 0 …