FreeBSD で NFS (4) 【NFSクライアントとマウントオプション】

FreeBSD

Seichan です.こんばんわ.
前回「FreeBSD で NFS (3)」までは NFS Server 側の説明を書いていましたが,今回はクライアント側の説明に移りたいと思います.

以前 FreeBSD 5.0-RELEASE あたりで Pukiwiki の「FreeBSD で NFS(Network File System) サーバ & クライアント」に纏めていましたが,時代も変わってきてますので再まとめしています.よろしければ Pukiwiki 側もご覧ください.

SPONSORED LINK




クライアント側設定

NFS クライアント側では,単純にマウントを行う場合は特に意識することも無い部分が多いのですが,いまどきの NFS として利用するにはいくつか覚えておくべき点があります.ここではそんなところを解説していきます.

デーモン

今まで「FreeBSD で NFS (2)」でもクライアントからのマウントを例として出していましたが,NFSv3 におけるファイルロックを利用するにはデーモンの起動が必要です.
NFS クライアント側で必要なデーモンは「FreeBSD で NFS (1)」で述べたとおり,rpc.lockdrpc.statd です.この2つは名前のとおり RPC を利用しますので rpcbind が依存的に必要となります.
これら3つのデーモンがシステム再起動後も自動的に起動するよう,/etc/rc.conf に次のように記述します.

rpc_lockd_enable="YES"
rpc_statd_enable="YES"
rpcbind_enable="YES"

NFSクライアントデーモンの起動

/etc/rc.conf ファイル記載後,再起動せずに NFS クライアントデーモン(実質的にはロックデーモン等ですが)を起動するには次の通りコマンドを実行します.
デーモン起動の順番は rpcbind, rpc.statd, rpc.lockd の順番となります.

# /etc/rc.d/rpcbind start
Starting rpcbind.
# /etc/rc.d/statd start
Starting statd.
# /etc/rc.d/lockd start
Starting lockd.

rpc.statd, rpc.lockd が起動したら,NFS ロックが利用出来る状態となります.
当然,NFS サーバ側でも rpc.statd, rpc.lockd が,FreeBSD 以外の場合は同等のデーモンが動作している必要があります

ファイルロックの確認

てっとりばやく,ファイルロックが有効に働いているかを確認するには,NFS サーバと NFS クライアントで同じファイルを編集するのが良いと思います.

NFS サーバ側の /pub/testfile を,rpc.statd, rpc.lockd が動作していない NFS クライアントで vi を使って編集しようとすると,下部に次のような表示が出ます.

testfile: unmodified, UNLOCKED

特定のホストからしか編集されない.という事がわかっている状況ではこれでも機能すると思いますが,危ない状況ですので,早急にロックを有効にしてください.その特定のホスト内で同時にファイルを操作する.なんてシチュエーションも考えられますので.

ファイルロックが有効な環境での同時編集が発生した場合は次のようになります.
この例は,NFS サーバ側で testfile を vi で開いている状態で,NFS クライアント側でも testfile を vi で開いた状況です.

testfile already locked, session is read-only.
testfile: unmodified, readonly: line 1
Press any key to continue:

testfile already locked」という表示で,既に開かれていてファイルがロックされていることがわかります.

マウント

FreeBSD で NFS マウントするには,2つの方法があります.mount-t nfs とファイルシステムタイプを nfs と指定する方法と,mount_nfs コマンドを使用する方法です.
mount -t nfs と指定した場合でも,最終的には mount_nfs が呼び出されますので結果は変わりません.その為,使いやすい方法で使って大丈夫です.

マウントする際の基本的な指定方法は次の通りになります.とりあえず2つの方法を併記します.

mount -t nfs nfsserver:[nfsshare] [mountpoint]
mount_nfs nfsserver:[nfsshare] [mountpoint]

nfsserver は NFS サーバの名前もしくは IP アドレスです.[nfsshare] は NFS サーバ側で共有設定をしているディレクトリになります.そして [mountpoint] は NFS クライアント側のマウント先ディレクトリとなります.

ここでは,NFS サーバ stglab1/pub を NFS クライアントの /mnt にマウントしてみます.以降は mount -t nfs の形式で記載します.

# mount -t nfs stglab1:/pub /mnt

マウントが成功したら,特になにも出力がなくプロンプトに戻ります.mount コマンドで NFS マウントしていることを確認してみましょう.

# mount
stglab1:/pub on /mnt (nfs)

この状態で NFS マウントが行われており,権限があれば /mnt 以下のファイルを読み書き可能です.

読み取り専用マウント

先に例示したマウントの場合,読み書き可能な状態でマウントしていますが,読み取り専用でマウントしたい.という場合は多いと思います.

明らかに読み取り専用でしか利用を想定していない場合は,NFS サーバ側で読み取り専用で共有設定をすべきですが,それが難しい場合もあります.そのようなシチュエーションの場合は NFS クライアント側で明示的に読み取り専用としてマウントする必要があります.

読み取り専用 (read-only) とする場合の方法も2通りあります.-r という専用のオプションか,-o ro とオプションの一覧の中の read-only オプションを選択する方法です.これも好き好きでどちらを利用しても構わないのですが,Seichan としては,色々オプションを書くことを想定して -o の中に纏める方法が好みです.

以下に,2つの読み取り専用オプションの指定を例示します.

# mount -t nfs -r stglab1:/pub /mnt
# mount -t nfs -o ro stglab1:/pub /mnt

いずれの場合も,mount コマンドで確認すると,このように read-only と表示されます.

# mount
stglab1:/pub on /mnt (nfs, read-only)

NFS バージョンの指定

NFS は v2, v3, v4 とありますが,mount のコマンドは1つだけです.なにも指定しない場合は NFSv3 での接続を最初に試み,失敗したら NFSv2 での接続に切り替える.という動作をします.
ですが,NFSv2 だと 2GB 以上のファイルが扱えない等の制限が色々あり,今の時代にはそぐわないことが多々あると思います.何より意図しない接続での想定していないトラブルが発生することも考えられますので,明示的にバージョンを指定してマウントすべきです.

NFS バージョンの指定は -o オプションに nfsv2, nfsv3, nfsv4 のいずれかを指定します.明示的にバージョンを指定した場合,そのバージョンでの接続が出来なかったときはすぐにマウント失敗となります.

次の例は,NFSv3 での接続を行う場合の例となります.

# mount -t nfs -o nfsv3 stglab1:/pub /mnt

TCP または UDP

NFSv2NFSv3TCPUDP の両方を利用することが出来ます.UDP の方がパフォーマンスが高いイメージがありますが,再送処理が発生するとファイルまるごと再送する必要がありますので,ちょっとでもパケットロスするととたんにパフォーマンスが落ちます.また,マニュアルにも「現在では UDP 接続は互換性の為に残してある」という記載がありますので,UDP を使用する利点はほぼほぼありません
mount_nfs コマンドはデフォルトで TCP を利用するのですが,ここも明示的に利用プロトコルを指定すべきです.これは,Seichan 的に Unix 系 OS の種別が変わった場合のデフォルトが違う可能性がありますので,こういった機種差を意識しなくても良くなるように明示すべきだという考えもあります

先の NFS バージョンと合わせて指定する例を書いてみます.

# mount -t nfs -o nfsv3,tcp stglab1:/pub /mnt

この NFS バージョンとプロトコルを指定したマウントを実際の業務では基本としてください.

と,相変わらず長くなってきましたので,オプションの続きは次回に引き続きます。

コメント

タイトルとURLをコピーしました