EN JA
NFSV4(4)
NFSV4(4) FreeBSD Kernel Interfaces Manual NFSV4(4)

名称

NFSv4NFS Version 4 プロトコル

解説

NFS クライアントとサーバは、 NFSv4 仕様のサポートを行います。 Network File System (NFS) Version 4 Protocol RFC 3530 を参照してください。プロトコルは、NFS バージョン 3 とほぼ同様ですが、実に多くの点で異なっています。それは操作を一緒に連結する単一の合成 (compound) RPC を使用します。これらの操作のそれぞれは、NFS バージョン 3 の RPC と同様です。複合物での操作は、それらの 1 つが失敗して (エラーを返し)、次に、RPC が、その時点で終了するまで、順番に実行されます。

それには、サーバがもはやステートレスでないことを意味する、統合されたロックのサポートがあります。そのようなものとして、 NFSv4 サーバは、リブートの後に (常にサーバが使用するリース (lease) 持続時間より大きい) グレース (grace) 期間の復旧モードのままとなります。このグレースの期間の間に、クライアントは、状態を復旧しますが、操作を変更する他の open/lock 状態を実行しません。正しい復旧意味論に提供するために、 stablerestart(5) によって記述された小さなファイルは、復旧フェーズの間にサーバによって使用されます。このファイルが不足しているか、または空であるなら、使用される nfsd(8) によって維持されるバックアップコピーがあります。いずれかのファイルが不足しているなら、それらは、 nfsd(8) によって作成されます。ファイルとバックアップコピーの両方が空であるなら、復旧のためのグレース期間を提供せずに、サーバが開始されることとなります。 nfsd(8) が単に再開されているときではなく、サーバマシンがリブートされるときだけ、復旧が起こることに注意してください。

NFS バージョン 3 に存在しない、いくつかのオプション機能を提供します:

 
- NFS バージョン 4 ACL 
- 委託 (Referral)、他のサーバにサブツリーをリダイレクトする 
  (未実装) 
- 委譲 (Delegation)、クライアントがファイルを局所的に操作することができる

NFSv4 プロトコルは、別々のマウントプロトコルを使用せず、サーバが単一のファイルシステムツリー構造を提供すると仮定し、1 つ以上で指定されたローカルファイルシステムツリーの点をルートとします。

 
V4: <rootdir> [-sec=secflavors] [host(s) or net]
 

exports(5) ファイルの (複数の) 行。 (詳細については、 exports(5) を参照しててください。) nfsd(8) によって、エクスポートされているサブツリーへのツリーの縦断が可能となるように、ローカルファイルシステムのエクスポートされないサブツリーで操作の制限されたサブセットを実行することができます。そのようなものとして、エクスポートされていないファイルシステムで ``<rootdir>'' となることができます。例外は、``<rootdir>'' 以下のすべての ZFS ファイルシステムがエクスポートされなければならないものとして、エクスポートをチェックする、ZFS です。しかしながら、その時、ルートとされた全体のツリーは、エクスポートされた NFS であるかもしれないタイプであるローカルファイルシステムになければなりません。 NFSv4 ファイルシステムは、``<rootdir>'' をルートとするので、``/'' 以外の何かにこれを設定すると、NFS バージョン 2 または 3 より NFSv4 のための異なったマウントパスを使用するために要求されることとなります。 NFS バージョン 2 と 3 と異なって、バージョン 4 によって、クライアントマウントは、複数のサーバファイルシステムの向こう側に橋渡しすることができますが、すべてのクライアントが、これを行うことができるというわけではありません。

NFSv4 は、数値の代わりにユーザとグループのための名前を使用します。有線上では、それらは、次の形を取ります:

 
<user>@<dns.domain>
 

ここで、``<dns.domain>'' は、ホスト名の検索のために使用される DNS ドメインと同じではありませんが、通常、同じ文字列に設定されます。ほとんどのシステムは、この ``<dns.domain>'' をデフォルトでマシンの hostname(1) のドメイン名の部分に設定します。しかしながら、通常、名前<->数値マッピングを行うために使用されるデーモンのためのコマンドラインのオプションまたは設定ファイルによってこれを上書きすることができます。 FreeBSD の下では、マッピングデーモンは、 nfsuserd(8) と呼ばれ、マシンのホスト名のドメイン部分を上書きするコマンドラインのオプションがあります。クライアントまたはサーバのいずれかの、 NFSv4 の使用のために、このデーモンは、実行されなければなりません。この ``<dns.domain>'' が正しく設定されていないか、または、デーモンが実行されていないなら、``ls -l'' は、通常、多くの ``nobody'' と ``nogroup'' 所有者を報告します。

uid/gid 番号は、もはや NFSv4 プロトコルでは使用されませんが、それでも、デフォルトである AUTH_SYS (sec=sys) を使用するとき、それらは、RPC 認証フィールドにあります。そのようなものとして、この場合、ユーザ/グループ名と数値の空間の両方がクライアントとサーバの間で一致していなければなりません。

しかしながら、利用者が RPCSEC_GSS (sec=krb5, krb5i, krb5p) で NFSv4 を実行するなら、名前と KerberosV チケットだけが通知されます。

サーバのセットアップ

NFSv4 をサポートする NFS サーバをセットアップするためには、次のように rc.conf(5) の変数を設定する必要があります:
 
nfs_server_enable="YES" 
nfsv4_server_enable="YES" 
nfsuserd_enable="YES"
 
または、古いサーバの使用を強制する、``-o'' オプションなしで mountd(8)nfsd(8) を開始します。また、 nfsuserd(8) デーモンが実行されなければなりません。

また、利用者は、 NFSv4 が動作するために、少なくとも 1 つの ``V4:'' 行を exports(5) ファイルに追加する必要があります。

利用者がエクスポートしているファイルシステムが NFSv4 を通してアクセスされているだけなら、性能を向上させるかもしれない、利用者が変更することができる 2、3 の sysctl(8) 変数があります。

vfs.nfsd.issue_delegations
0 以外に設定されるなら、サーバは、クライアント Open Delegation を発行することができます。これらの委譲 (delegation) は、クライアントがクライアントでローカルにファイルを操作することを許可します。残念ながら、現時点では、委譲のクライアントの使用は、制限されるので、性能向上は、観測されていません。 NFSv4 クライアントにエクスポートされるファイルシステムが、サーバでローカルにアクセスされていないときだけ、これを有効にすることができます、そして、 NFS バージョン 2 または 3 クライアントを通してアクセスされるなら、これらのクライアントは、NLM を使用することができません。
vfs.nfsd.enable_locallocks
ローカルなバイト範囲のロックの獲得を無効にするために、0 に設定することができます。エクスポートしているファイルシステムをローカルにアクセスしないか、または NLM がそれらで操作できない場合にだけ、ローカルなロックを無効にすることができます。
 

Samba サーバのアクセスが上記の議論のための ``local access'' であると見なされるかもしれないことに注意してください。

リンクされている NFSv4 をサポートする NFS サーバがあるカーネルを構築するには、次を

 
options NFSD
 

カーネルの config(5) ファイルに指定しなければなりません。

クライアントのマウント

NFSv4 マウントを行うためには、 mount_nfs(8) コマンドラインで ``nfsv4'' オプションを指定します。これは、 NFSv4 をサポートするクライアントの使用を強制して、 ``tcp'' と NFSv4 を設定します。

nfsuserd(8) は、上記のように、実行されなければなりません。また、 NFSv4 のマウントは、サーバにクライアントをユニークに識別するためにホスト uuid を使用するので、

 
hostid_enable="NO"
 

rc.conf(5) で設定されるなら、安全に NFSv4 マウントを行うことができません。

 

NFSv4 サーバが委譲のサポートでマウントされているなら、利用者は、クライアント側のコールバックを扱うために nfscbd(8) デーモンを開始することができます。次が、

 
nfsuserd_enable="YES" 
nfscbd_enable="YES"
 

rc.conf(5) に設定されているなら、これは起こります。

 

機能しているコールバックのパスなしで、サーバは、決してクライアントに委譲 (Delegation) を発行しません。

 

デフォルトで、コールバックアドレスは、カーネルと port# 7745 で rtalloc() を通して獲得された IP アドレスに設定されます。デフォルトの port# を上書きするために、 nfscbd(8) のためのコマンドラインオプションを使用することができます。

 

NAT ゲートウェイの後ろで、動作するコールバックを取得するために、コールバックサービスのためのポートは、NAT ゲートウェイで設定される必要があり、次に NAT ゲートウェイのアドレス (ホスト IP と port#) は、 sysctl(8) 変数 vfs.nfs.callback_addr を次の形式の文字列に割り当てることによって設定される必要があります:

 

N.N.N.N.N.N

 

ここで、最初の 4 つの N は、ホスト IP アドレスで、最後の 2 は、ネットワークバイト順の port# (ポート番号) (範囲 0-255 ですべて 10 進数の #) です。

リンクされた NFSv4 をサポートするクライアントがあるカーネルを構築するためには、次のオプション

 
options NFSCL
 

がカーネルの config(5) ファイルで指定されなければなりません。

``nfsuserd_flags'' と ``nfscbd_flags'' rc.conf(5) 変数を通してブート時に nfsuserd(8)nfscbd(8) デーモンのためにオプションを指定することができます。

同じホストのエクスポートされた (複数の) ボリュームに対する NFSv4 マウントは、ハングアップした NFS サーバの結果となるかもしれないので、推奨されません。 nfsd スレッドが新しい vnode を獲得する部分として NFSv4 VOP_RECLAIM()/Close RPC を行おうことを試みるとき、それは、生じます。他のすべての nfsd スレッドが、この nfsd スレッドによって保持されたロックを待っていてブロックされるなら、Close RPC をサービスする nfsd スレッドは、ありません。

関連ファイル

/var/db/nfs-stablerestart
NFS V4 の安定した再開ファイル
/var/db/nfs-stablerestart.bak
ファイルのバックアップコピー

バグ

現時点では、ローカルファイルシステム操作のための委譲 (delegation) のリコールはありません。そのようなものとして、委譲は、NFS がボリュームをエクスポートするように、単に使用されているファイルシステムのためにだけ有効にされるべきであり、ローカルのシステムコールを通してアクセスされず、Samba のようなサービスでもありません。
July 1, 2013 FreeBSD