8.7. NFS サーバーの設定

NFS サーバーのエクスポートを設定する方法は 2 つあります。
  • NFS の設定ファイル /etc/exports を手動で編集する方法。
  • コマンドラインで、コマンド exportfs を使用する方法。

8.7.1. /etc/exports 設定ファイル

/etc/exports ファイルは、リモートホストにどのファイルシステムをエクスポートするかを制御し、オプションを指定します。以下の構文ルールに従います。
  • 空白行は無視する。
  • コメント行は、ハッシュ記号 (#) で始める。
  • 長い行はバックスラッシュ (\) を使って折り返す。
  • エクスポートするファイルシステムは、それぞれ 1 行で指定する。
  • 許可するホストの一覧は、エクスポートするファイルシステムの後に空白文字を追加し、その後に追加する。
  • 各ホストのオプションは、ホスト識別子の直後に括弧を追加し、その中に指定する。ホストと最初の括弧の間には空白を入れない。
エクスポートするファイルシステムのエントリーは、以下のように指定します。
export host(options)
ここでは、以下のような変数を使用しています。
export
エクスポートするディレクトリー
host
エクスポートを共有するホストまたはネットワーク
options
host に使用するオプション
各ホストにそれぞれオプションを付けて、複数のホストを 1 行で指定することができます。この場合は、以下のように、各ホスト名の後に、そのホストに対するオプションを括弧を付けて追加します。ホストは空白文字で区切ります。
export host1(options1) host2(options2) host3(options3)
ホスト名を指定する別の方法は、「ホスト名の形式」 を参照してください。
最も簡単な方法は、/etc/exports ファイルに、エクスポートするディレクトリーと、そのディレクトリーへのアクセスを許可するホストを指定するだけです。以下の例のようになります。

例8.6 /etc/exports ファイル

/exported/directory bob.example.com
この例では、bob.example.com が、 NFS サーバーの /exported/directory/ をマウントできます。ここではオプションが指定されていないため、NFS では、 デフォルト 設定が使用されます。
デフォルトの設定は以下のようになります。
ro
エクスポートするファイルシステムは読み込み専用です。リモートホストは、このファイルシステムで共有されているデータを変更することができません。このファイルシステムで変更 (読み書き) を可能にするには、rw オプションを指定します。
sync
NFS サーバーは、以前の要求で発生した変更がディスクに書き込まれるまで、要求に応答しません。代わりに非同期書き込みを有効にするには、async オプションを指定します。
wdelay
NFS サーバーは、別の書き込み要求が差し迫っていると判断すると、ディスクへの書き込みを遅らせます。これにより、複数の書き込みコマンドが同じディスクにアクセスする回数を減らすことができるため、書き込みのワークロードが低下し、パフォーマンスが向上します。これを無効にするには、no_wdelay を指定します。no_wdelay は、デフォルトの sync オプションが指定されている場合に限り利用可能になります。
root_squash
(ローカルからではなく) リモート から接続している root ユーザーが root 権限を持つことを阻止します。代わりに、そのユーザーには、NFS サーバーによってユーザー ID nfsnobody がく割り当てられます。これにより、リモートの root ユーザーの権限を、最も低いローカルユーザーレベルにまで下げ (squash) て、権限を持たずにリモートサーバーに書き込むのを阻止します。no_root_squash と指定すると、この root squashing が無効になります。
(root を含む) すべてのリモートユーザーの権限を下げるには、all_squash を使用します。特定ホストのリモートユーザーに対して、NFS サーバーが割り当てるユーザー ID とグループ ID を指定するには、anonuidanongid のオプションをそれぞれ以下のように使用します。
export host(anonuid=uid,anongid=gid)
ここで、uidgid はそれぞれ、ユーザー ID 番号およびグループ ID 番号です。anonuidanongid のオプションを使用することで、リモート NFS ユーザーが共有する特別なユーザーおよびグループアカウントを作成できるようになります。
デフォルトでは、access control lists (アクセス制御リスト) (ACL) は、Red Hat Enterprise Linux では NFS によってサポートされています。この機能を無効にするには、ファイルシステムをエクスポートする際に no_acl オプションを指定します。
エクスポートするファイルシステムのデフォルトはすべて、明示的に上書きする必要があります。たとえば、rw オプションを指定しないと、エクスポートするファイルシステムは読み込み専用として共有されます。以下は、/etc/exports の例になりますが、ここでは 2 つのデフォルトオプションを上書きしています。
/another/exported/directory 192.168.0.3(rw,async)
このエントリーでは、192.168.0.3/another/exported/directory/ を読み込み書き込マウントできるように設定しています。そして、ディスクへの書き込みはすべて非同期となります。エクスポートオプションの詳細は、man exportfs を参照してください。
さらに、デフォルト値が指定されていないオプションも利用できます。たとえば、サブツリーチェックを無効にする、安全でないポートからのアクセスの許可する、安全でないファイルロックを許可する (一部の初期 NFS クライアント実装で必要) などの機能があります。あまり使用されないオプションの詳細は、man exports を参照してください。

重要

/etc/exports ファイルでは、特に空白文字ついては、非常に厳しく扱われます。ホストとエクスポートされるファイルシステムの間、そしてホスト同士の間には、必ず空白文字を挿入してください。また、それ以外の場所 (コメント行を除く) には、絶対に空白文字を追加しないでください。
たとえば、以下の 2 つの行は意味が異なります。
/home bob.example.com(rw)
/home bob.example.com (rw)
最初の行は、bob.example.com からのユーザーにのみ、/home ディレクトリーへの読み/書きアクセスを許可します。2番目の行は、bob.example.com からのユーザーには、ディレクトリーを読み込み専用 (デフォルト) でマウントすることを許可しており、その他のユーザーには、読み込み/書き込みでマウントすることを許可します。

8.7.2. exportfs コマンド

NFS 経由でリモートユーザーにエクスポートされているすべてのファイルシステム、並びにそれらのファイルシステムのアクセスレベルは /etc/exports ファイル内に一覧表示してあります。nfs サービスが開始すると、/usr/sbin/exportfs コマンドが起動してこのファイルを読み込み、実際のマウントプロセスのために制御を rpc.mountd (NFSv3の場合) とその後にrpc.nfsd に渡します。この時点でファイルシステムがリモートユーザーに使用可能になります。
/usr/sbin/exportfs コマンドを手動で発行すると、root ユーザーは NFS サービスを再開始せずにディレクトリーをエクスポートするか、しないかを選択できるようになります。適切なオプションが与えられると、/usr/sbin/exportfs コマンドはエクスポートしたファイルシステムを /var/lib/nfs/xtab に書き込みます。rpc.mountd はファイルシステムへのアクセス権限を決定する際に xtab ファイルを参照するため、エクスポートしたファイルシステム一覧への変更はすぐに反映されます。
/usr/sbin/exportfs で利用可能な一般的なオプションの一覧は以下のようになります。
-r
/etc/exports 内に一覧表示してあるすべてのディレクトリーから /etc/lib/nfs/xtab 内に新しいエクスポート一覧を構成することにより、それらのディレクトリーがエクスポートされることになります。結果的にこのオプションが /etc/exports 内のいずれかの変更でエクスポート一覧をリフレッシュすることになります。
-a
/usr/sbin/exportfs に渡される他のオプションに応じて、すべてのディレクトリーがエクスポートされるか、またはされないことになります。他のオプションが指定されない場合は、/usr/sbin/exportfs は、/etc/exports 内に指定してあるすべてのファイルシステムをエクスポートします。
-o file-systems
/etc/exports 内に一覧表示されていないエクスポートされるディレクトリーを指定します。file-systems の部分を、エクスポートされるファイルシステムに置き換えます。これらのファイルシステムは、/etc/exports で指定されたものと同じフォーマットでなければなりません。このオプションは、多くの場合、エクスポート用ファイルシステム一覧に永続的に追加する前に、エクスポート予定のファイルシステムをテストするために使用されます。/etc/exports 構文の詳細は、/etc/exports 設定ファイル」を参照してください。
-i
/etc/exports を無視します。コマンドラインから出されたオプションのみが、エクスポート用ファイルシステムの定義に使用されます。
-u
すべての共有ディレクトリーをエクスポートしません。コマンド /usr/sbin/exportfs -ua は、すべての NFS デーモンを稼働状態に維持しながら、NFS ファイル共有を保留します。NFS 共有を再度有効にするには、exportfs -r を使用します。
-v
詳細表示を意味します。exportfs コマンドを実行するときに表示されるエクスポート、または非エクスポートのファイルシステムの情報が、より詳細に表示されます。
exportfs コマンドにオプションを渡さない場合と、現在エクスポートされているファイルシステムの一覧が表示されます。exportfs コマンドの詳細については、man exportfs を参照してください。

8.7.2.1. NFSv4 で exportfs の使用

Red Hat Enterprise Linux 7 では、提示されるファイルシステムは自動的に同じパスを使用して NFSv3 およびNFSv4 クライアントで利用可能になるため、NFSv4 のエクスポートを設定するための特別なステップは必要ありません。これは、以前のバージョンとの相違点です。
クライアントが NFSv4 を使用しないようにするには、/etc/sysconfig/nfsRPCNFSDARGS= -N 4 を設定し、NFSv4 の使用を停止します。

8.7.3. ファイアウォール背後での NFS の実行

NFS は RPC サービスのポートを動的に割り当てる rpcbind を必要としますが、ファイアウォールルールの設定で問題が発生する可能性があります。ファイアウォールの背後でクライアントが NFS 共有にアクセスできるようにするには、/etc/sysconfig/nfs ファイルを編集し、RPC サービスが実行されるポートを設定します。
/etc/sysconfig/nfs ファイルは、デフォルトではすべてのシステムに存在しているわけではありません。/etc/sysconfig/nfs が存在しない場合は作成し、以下を指定します。
RPCMOUNTDOPTS="-p port"
これにより、rpc.mount コマンドラインに「-p port」が追加され、rpc.mount -p port になります。
nlockmgr サービスが使用するポートを指定するには、/etc/modprobe.d/lockd.conf ファイルの nlm_tcpport オプションと nlm_udpport オプションに、ポート番号を設定します。
NFS の起動に失敗すると、/var/log/messages がチェックされます。一般的に、すでに使用されているポート番号を指定した場合に NFS の起動に失敗します。/etc/sysconfig/nfs の編集後、以下のコマンドを実行して nfs-config サービスを再起動し、Red Hat Enterprise Linux 7.2 以下のバージョンで新しい値が反映されるようにします。
#  systemctl restart nfs-config
NFS サーバーを再起動します。
#  systemctl restart nfs-server
rpcinfo -p を実行し、変更が反映されたことを確認します。

注記

NFSv4.0 コールバックがファイアウォールを通過するように許可するには、/proc/sys/fs/nfs/nfs_callback_tcpport をセットして、サーバーがクライアント上のそのポートに接続できるようにします。
このプロセスは、NFSv4.1 またはそれ以降には必要ありません。そして mountdstatd、および lockd のための他のポート群は純粋な NFSv4 環境では必要ありません。

8.7.3.1. NFS エクスポートの検出

NFS サーバーがエクスポートするファイルシステムを発見する方法は2種類あります。
  • NFSv3 をサポートするいずれかのサーバー上で、showmount コマンドの使用です。
    $ showmount -e myserver
    Export list for mysever
    /exports/foo
    /exports/bar
  • NFSv4 t 対応のサーバーで、root ディレクトリーをマウントします。
    # mount myserver:/ /mnt/
    # cd /mnt/
    exports
    # ls exports
    foo
    bar
NFSv4 と NFSv3 の両方をサポートするサーバーでは、上記の方法はいずれも機能し、同じ結果を出します。

注記

Red Hat Enterprise Linux 6 以前には、設定の仕方によって旧来の NFS サーバーは別々のパス経由で NFSv4 クライアントにファイルシステムをエクスポートすることがありました。それらのサーバーではデフォルトで NFSv4 を有効にしていないため、これは問題にはなっていません。

8.7.4. ファイアウォールからの RPC クォータを許可する

ディスククォータを使用するファイルシステムをエクスポートする場合は、クォータ RPC (Remote Procedure Call) サービスを使用して、NFS クライアントにディスククォータデータを提供できます。

手順8.1 ファイアウォールの背後で RPC クォータのアクセスを可能にする

  1. rpc-rquotad サービスを有効にするには、以下のコマンドを使用します。
    # systemctl enable rpc-rquotad 
  2. rpc-rquotad サービスを起動するには、以下のコマンドを使用します。
    # systemctl start rpc-rquotad 
    rpc-rquotad が有効な場合は、nfs-server サービスが起動した後に自動的に起動します。
  3. ファイアウォールの背後で、クォータ RPC サービスにアクセスできるようにするには、UDP ポートまたは TCP ポート 875 を開く必要があります。デフォルトのポート番号は /etc/services ファイルに指定します。
    デフォルトのポート番号は、/etc/sysconfig/rpc-rquotad ファイルの RPCRQUOTADOPTS 変数に -p port-number を追加すると上書きできます。
  4. /etc/sysconfig/rpc-rquotad ファイルへの変更を有効にするには、rpc-rquotad を再起動します。
    # systemctl restart rpc-rquotad

リモートホストにクォータを設定する

デフォルトでは、リモートホストだけがクォーターを読み込めます。クォータを設定できるようにするには、/etc/sysconfig/rpc-rquotad ファイルの RPCRQUOTADOPTS 変数に -S オプションを追加します。
/etc/sysconfig/rpc-rquotad ファイルへの変更を有効にするには、rpc-rquotad を再起動します。
# systemctl restart rpc-rquotad

8.7.5. ホスト名の形式

ホストは以下の形式にすることができます。
単独マシン
完全修飾型ドメイン名 (サーバーで解決可能な形式)、ホスト名 (サーバーで解決可能な形式)、あるいは IP アドレス
ワイルドカードで指定された一連のマシン
* または ? の文字を使用して文字列の一致を指定します。ワイルドカードは IP アドレスでは使用しないことになっていますが、逆引き DNS ルックアップが失敗した場合には偶然に機能するかも知れません。ワイルドカードを完全修飾型ドメイン名に指定する時は、ドット(.) はワイルドカードの一部にはなりません。例えば、*.example.comone.example.com を範囲に入れますがone.two.example.com はその範囲に入りません。
IP ネットワーク
a.b.c.d/z を使用します。ここで、a.b.c.d はネットワークであり、z はネットマスクのビット数です (例えば、 192.168.0.0/24)。別の使用可能形式は a.b.c.d/netmask となり、ここで a.b.c.d がネットワークで、netmask がネットマスクです (例えば、 192.168.100.8/255.255.255.0)。
Netgroup
形式 @group-name を使用します。ここで、group-name は NIS netgroup の名前です。

8.7.6. RDMA で NFS の有効化 (NFSoRDMA)

Red Hat Enterprise Linux 7 では、RDMA に対応するハードウェアが存在すると、RDMA (remote direct memory access) サービスが自動的に有効になります。
RDMA 上で NFS を有効化するには:
  1. rdmardma-core パッケージをインストールします。
    /etc/rdma/rdma.conf ファイルにはデフォルトで XPRTRDMA_LOAD=yes が設定されており、NFSoRDMA クライアントモジュールをロードする rdma サービスが必要になります。
  2. NFSoRDMA サーバー モジュールを自動的にロードするには、/etc/rdma/rdma.confSVCRDMA_LOAD=yes 行を追加します。
    /etc/sysconfig/nfs ファイルの RPCNFSDARGS="--rdma=20049" は、NFSoRDMA サービスがクライアントをリッスンするポート番号 (20049) を指定します。RFC 5667 では、RDMA で NFSv4 サービスを提供する場合は、サーバーがポート 20049 をリッスンすることが定められています。
  3. /etc/rdma/rdma.conf ファイルを編集したら、nfs サービスを再起動します。
    # systemctl restart nfs
    以前のカーネルバージョンで /etc/rdma/rdma.conf の変更を有効にするには、システムを再起動する必要があります。

8.7.7. NFSv4 専用サーバーの設定

デフォルトで、NFS サーバーは Red Hat Enterprise Linux 7 の NFSv2、NFSv3、および NFSv4 接続をサポートします。ただし、NFS バージョン 4.0 以降のみをサポートするように NFS を設定することもできます。NFSv4 では rpcbind サービスがネットワークをリッスンする必要がないため、これにより、システム上で開いているポートと実行中のサービスの数が最小限に抑えられます。
NFS サーバーが NFSv4 専用として設定されていると、NFSv2 または NFSv3 を使用して共有をマウントしようとするクライアントは、次のようなエラーでマウントに失敗します。
Requested NFS version or transport protocol is not supported.

手順8.2 NFSv4 専用サーバーの設定

NFS サーバーを NFS バージョン 4.0 以降のみをサポートするように設定する方法を説明します。
  1. /etc/sysconfig/nfs 設定ファイルに以下の行を追加して、NFSv2、NFSv3、UDP を無効化します。
    RPCNFSDARGS="-N 2 -N 3 -U"
  2. 任意で、RPCBINDMOUNT、および NSM プロトコル呼び出しのリッスンを無効にします。これは NFSv4 専用の場合は不要です。
    これらのオプションを無効にすると、次のような影響があります。
    • NFSv2 または NFSv3 を使用してサーバーから共有をマウントしようとするクライアントが応答しなくなります。
    • NFS サーバー自体が NFSv2 および NFSv3 ファイルシステムをマウントできなくなります。
    これらのオプションを無効にするには:
    • 以下の行を /etc/sysconfig/nfs ファイルに追加します。
      RPCMOUNTDOPTS="-N 2 -N 3"
    • 関連サービスを無効化します。
      # systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket
  3. NFS サーバーを再起動します。
    # systemctl restart nfs
    変更は、NFS サーバーを起動または再起動するとすぐに反映されます。

NFSv4 専用の設定の確認

netstat ユーティリティーを使用することで、NFS サーバーが NFSv4 専用モードで設定されていることを確認できます。
  • 以下は、NFSv4 専用サーバーでの netstat の出力例です。RPCBINDMOUNTNSM のリッスンも無効になります。nfs が唯一リッスンする NFS サービスとなります。
    # netstat -ltu
    
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 0.0.0.0:nfs             0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
    tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN     
    tcp6       0      0 [::]:nfs                [::]:*                  LISTEN     
    tcp6       0      0 [::]:12432              [::]:*                  LISTEN     
    tcp6       0      0 [::]:12434              [::]:*                  LISTEN     
    tcp6       0      0 localhost:7092          [::]:*                  LISTEN     
    tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
    udp        0      0 localhost:323           0.0.0.0:*                          
    udp        0      0 0.0.0.0:bootpc          0.0.0.0:*                          
    udp6       0      0 localhost:323           [::]:*
  • NFSv4 専用サーバーを設定する前の netstat 出力には、sunrpcmountd サービスが含まれます。
    # netstat -ltu
    
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 0.0.0.0:nfs             0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:36069           0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:52364           0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:mountd          0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
    tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN     
    tcp6       0      0 [::]:34941              [::]:*                  LISTEN     
    tcp6       0      0 [::]:nfs                [::]:*                  LISTEN     
    tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN     
    tcp6       0      0 [::]:mountd             [::]:*                  LISTEN     
    tcp6       0      0 [::]:12432              [::]:*                  LISTEN     
    tcp6       0      0 [::]:56881              [::]:*                  LISTEN     
    tcp6       0      0 [::]:12434              [::]:*                  LISTEN     
    tcp6       0      0 localhost:7092          [::]:*                  LISTEN     
    tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
    udp        0      0 localhost:323           0.0.0.0:*                          
    udp        0      0 0.0.0.0:37190           0.0.0.0:*                          
    udp        0      0 0.0.0.0:876             0.0.0.0:*                          
    udp        0      0 localhost:877           0.0.0.0:*                          
    udp        0      0 0.0.0.0:mountd          0.0.0.0:*                          
    udp        0      0 0.0.0.0:38588           0.0.0.0:*                          
    udp        0      0 0.0.0.0:nfs             0.0.0.0:*                          
    udp        0      0 0.0.0.0:bootpc          0.0.0.0:*                          
    udp        0      0 0.0.0.0:sunrpc          0.0.0.0:*                          
    udp6       0      0 localhost:323           [::]:*                             
    udp6       0      0 [::]:57683              [::]:*                             
    udp6       0      0 [::]:876                [::]:*                             
    udp6       0      0 [::]:mountd             [::]:*                             
    udp6       0      0 [::]:40874              [::]:*                             
    udp6       0      0 [::]:nfs                [::]:*                             
    udp6       0      0 [::]:sunrpc             [::]:*