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

NFS

FreeBSD の NFS について以前 Pukiwiki の「FreeBSD で NFS(Network File System) サーバ & クライアント」に纏めていましたが,当時 5.0 RELEASE の頃に纏めてましたのでだいぶ状況が変わってしまいました.
ですので今のバージョン 9.2-RELEASE をターゲットに改めて解説します.

前回「FreeBSD で NFS – (NFSサーバ設定と /etc/exports 詳解②)」までは NFS サーバー側の説明を書いていましたが,今回からはクライアント側の説明に移ります.

クライアント側設定

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

デーモン

NFSv3 におけるファイルロックを利用するには,NFS クライアント側で特定のデーモンの起動が必要です.それは、「FreeBSD で NFS – (NFSの概要 / NFS とは)」で述べたとおり,rpc.lockd と rpc.statd です.
これらのデーモンは,名前の通り RPC を利用しますので,rpcbind が依存的に必要となります.
これらのデーモンがシステム再起動後も自動的に起動するようにするには,/etc/rc.conf ファイルに次のように記述します.

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

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

/etc/rc.conf ファイルに設定を記述した後,再起動せずに NFS クライアントデーモン(実質的にはロックデーモンなど)を起動するには,以下のコマンドを実行します.
これにより,NFS クライアントデーモンが順序通りに起動されます.デーモンの起動順序は rpcbindrpc.statdrpc.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クライアントで同じファイルを編集するのが良いでしょう.

「/pub/testfile」を編集しようとすると,NFSクライアント側で rpc.statd や rpc.lockd が動作していないこと場合は次のようなメッセージが表示されます.

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 が呼び出されますので結果は変わりません.その為,使いやすい方法で使って大丈夫です.

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

マウントする際の基本的な指定方法は次の通りです.以下に,両方の方法を併記します.

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

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

nfsserver は NFS サーバーの名前またはIPアドレスを指します.[nfsshare] は NFS サーバーで共有設定されたディレクトリを示し,[mountpoint] は NFS クライアントでのマウントポイントを指定します.

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

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

# mount -t nfs stglab1:/pub /mnt

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

マウントが成功した場合,通常は特に出力がなくプロンプトに戻ります.NFS マウントが正常に行われたかどうかを確認するには,mount コマンドを使用します.

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

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

読み取り専用マウント

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

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

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

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

読み取り専用(read-only)とする方法には2つの選択肢があります.1つは,-r という専用のオプションを使用する方法であり,もう1つは -o ro というオプションの一部として read-only オプションを使用する方法です.どちらの方法を選択しても構いませんが、オプションを多く指定することを想定して,-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

NFSv2 と NFSv3 は,TCP と UDP の両方を利用することができます.UDP の方がパフォーマンスが高いとされますが,再送処理が発生するとファイル全体を再送する必要があるため,パケットロスがわずかでも発生するとパフォーマンスが急激に低下します.また、マニュアルには「現在では UDP 接続は互換性のために残されている」という記載がありますので,UDP を使用する利点はほとんどありません.

mount_nfs コマンドはデフォルトで TCP を利用しますが,ここも明示的に利用プロトコルを指定すべきです.
Unix 系 OS の種類によってデフォルトの設定が異なる可能性があるため,これらの機種差を考慮しなくても良くなるよう,プロトコルの指定を明確にするべきです.

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

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

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

このように,実際の業務では NFS バージョンとプロトコルを指定したマウントを基本とすべきです.

記事が長くなりましたので引き続きオプションの説明を次回解説します.




seichan

ご連絡は X (twitter) の DM へお願いします.

seichanをフォローする
NFS

seichanをフォローする




コメント

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