Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

8.6. NFS サーバーの設定

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

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

/etc/exports ファイルは、リモートホストにどのファイルシステムをエクスポートするかを制御し、オプションを指定します。以下の構文ルールに従います。
  • 空白行は無視する。
  • コメントを追加するには、ハッシュマーク(#)で行を開始します。
  • 長い行はバックスラッシュ(\)で囲むことができます。
  • エクスポートするファイルシステムは、それぞれ 1 行で指定する。
  • 許可するホストのリストは、エクスポートするファイルシステムの後に空白文字を追加し、その後に追加する。
  • 各ホストのオプションは、ホストの識別子の直後に括弧を追加し、その中に指定する。ホストと最初の括弧の間には空白を使用しない。
エクスポートするファイルシステムの各エントリーは、以下のように指定します。
export host(options)
ここでは、以下のような変数を使用しています。
export
エクスポートするディレクトリー
host
エクスポートを共有するホストまたはネットワーク
オプション
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/ をマウントできます。この例ではオプションが指定されていないため、デフォルト 設定が使用されます。
デフォルトの設定は以下のようになります。
ro
エクスポートするファイルシステムは読み取り専用です。リモートホストは、このファイルシステムで共有されているデータを変更できません。このファイルシステムで変更 (読み取り/書き込み) を可能にするには、rw オプションを指定します。
sync
NFS サーバーは、以前の要求で発生した変更がディスクに書き込まれるまで、要求に応答しません。代わりに非同期書き込みを有効にするには、async オプションを指定します。
wdelay
NFS サーバーは、別の書き込み要求が差し迫っていると判断すると、ディスクへの書き込みを遅らせます。これにより、複数の書き込みコマンドが同じディスクにアクセスする回数を減らすことができるため、書き込みのオーバーヘッドが低下し、パフォーマンスが向上します。これを無効にするには、no_wdelay を指定します。no_wdelay は、デフォルトの sync オプションも指定されている場合にのみ使用できます。
root_squash
(ローカルからではなく) リモート から接続している root ユーザーが root 権限を持つことを阻止します。代わりに、NFS サーバーはユーザー ID nfsnobody を割り当てます。これにより、リモートの root ユーザーの権限を、最も低いローカルユーザーレベルにまで下げて (squash)、高い確率でリモートサーバーへの書き込む権限を与えないようにすることができます。root squashing を無効にするには、no_root_squash を指定します。
すべてのリモートユーザー (root を含む) を抑制するには、all_squash を使用します。特定ホストのリモートユーザーに対して、NFS サーバーが割り当てるユーザー ID とグループ ID を指定するには、anonuid オプションと anongid オプションを以下のように使用します。
export host(anonuid=uid,anongid=gid)
uidgid は、それぞれユーザー ID とグループ ID の番号になります。anonuid オプションと anongid オプションにより、共有するリモート NFS ユーザー用に、特別なユーザーアカウントおよびグループアカウントを作成できます。
デフォルトでは、アクセス制御リスト (ACLs) は、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.6.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.mountdxtab ファイルを参照するため、エクスポートしたファイルシステムのリストへの変更がすぐに反映されます。
以下は、/usr/sbin/exportfs で利用可能な一般的に使用されるオプションの一覧です。
-r
/var/lib/nfs/etab に新しいエクスポート一覧を作成して、/etc/exports に一覧表示されているすべてのディレクトリーをエクスポートします。このオプションにより、/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.6.2.1. NFSv4 での exportfs の使用

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

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

NFS には rpcbind が必要です。これは RPC サービスにポートを動的に割り当て、ファイアウォールルールの設定に問題が発生する可能性があります。クライアントがファイアウォールの背後にある NFS 共有にアクセスできるようにするには、/etc/sysconfig/nfs ファイルを編集して、RPC サービスを実行するポートを設定します。クライアントがファイアウォールを介して RPC クォータにアクセスできるようにする方法は、「ファイアウォールを介した RPC クォータのアクセス」 を参照してください。
/etc/sysconfig/nfs ファイルは、デフォルトではすべてのシステムに存在しません。/etc/sysconfig/nfs が存在しない場合は作成し、以下を指定します。
RPCMOUNTDOPTS="-p port"
これにより、"-p port" が rpc.mount コマンドラインに追加されます( rpc.mount -p port )。
nlockmgr サービスが使用するポートを指定するには、/etc/modprobe.d/lockd.conf ファイルの nlm_tcpport オプションおよび nlm_udpport オプションのポート番号を設定します。
NFS が起動しない場合は、/var/log/messages を確認してください。通常、すでに使用されているポート番号を指定すると、NFS が起動しません。/etc/sysconfig/nfs を編集したら、以下のコマンドを実行して、Red Hat Enterprise Linux 7.2 以前で nfs-config サービスを再起動する必要があります。
#  systemctl restart nfs-config
次に、NFS サーバーを再起動します。
#  systemctl restart nfs-server
rpcinfo -p を実行して、変更が有効になったことを確認します。
注記
NFSv4.0 コールバックがファイアウォールを通過できるようにするには、/proc/sys/fs/nfs/nfs_callback_tcpport を設定し、サーバーがクライアント上のそのポートに接続できるようにします。
このプロセスは、NFSv4.1 以降には必要ありません。純粋な NFSv4 環境では、mountdstatd、および lockd 用の他のポートは必要ありません。

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

NFS サーバーがエクスポートするファイルシステムを検出する方法は 2 種類あります。
  • NFSv3 に対応するサーバーでは、showmount コマンドを使用します。
    $ showmount -e myserver
    Export list for mysever
    /exports/foo
    /exports/bar
  • NFSv4 に対応するサーバーで、root ディレクトリーを マウント し、確認します。
    # mount myserver:/ /mnt/
    # cd /mnt/
    exports
    # ls exports
    foo
    bar
NFSv4 と NFSv3 の両方に対応するサーバーでは、上記の方法はいずれも有効で、同じ結果となります。
注記
Red Hat Enterprise Linux 6 以前には、設定の仕方によって以前の NFS サーバーは別々のパス経由で NFSv4 クライアントにファイルシステムをエクスポートすることがありました。このようなサーバーでは、デフォルトで NFSv4 が有効にならないため、問題にはなりません。

8.6.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. rpc-rquotad を再起動して、/etc/sysconfig/rpc-rquotad ファイルの変更を有効にします。
    # systemctl restart rpc-rquotad

リモートホストからのクォータの設定

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

8.6.5. ホスト名の形式

ホストは以下の形式にすることができます。
単独のマシン
完全修飾型ドメイン名 (サーバーで解決可能な形式)、ホスト名 (サーバーで解決可能な形式)、あるいは IP アドレス
ワイルドカードで指定された一連のマシン
文字列の一致を指定するには、* 文字または ? 文字を使用します。ワイルドカードは IP アドレスでは使用しないことになっていますが、逆引き DNS ルックアップが失敗した場合には誤って動作する可能性があります。完全修飾ドメイン名でワイルドカードを指定する場合、ドット(.)はワイルドカードに含まれません。たとえば、*.example.com には one.example.com が含まれていますが、1.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)。
Netgroups
形式 @group-name を使用します。ここで、group-name は NIS netgroup の名前です。

8.6.6. NFS over RDMA の有効化 (NFSoRDMA)

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

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

デフォルトでは、NFS サーバーは Red Hat Enterprise Linux 7 の NFSv2、NFSv3、および NFSv4 の接続に対応します。ただし、バージョン 4.0 以降の NFS のみに対応するように 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 ユーティリティーを使用して、NFSv4 専用モードで NFS サーバーが設定されていることを確認できます。
  • 以下は、NFSv4 専用サーバーでの netstat 出力例です。RPCBINDMOUNT、および NSM をリッスンして無効になります。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 出力には、sunrpc および mountd サービスが含まれます。
    # 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             [::]:*