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 オプションを指定しないと、エクスポートするファイルシステムが読み取り専用として共有されます。以下は、2 つのデフォルトオプションをオーバーライドする /etc/exports のサンプル行です。
/another/exported/directory 192.168.0.3(rw,async)
この例では、192.168.0.3 は/another/exported/directory/ をマウントして読み書きでき、ディスクへの書き込みはすべて非同期です。エクスポートオプションの詳細については、man exportfs を 参照してください。
さらに、デフォルト値が指定されていないオプションも利用できます。たとえば、サブツリーチェックを無効にする、安全でないポートからのアクセスの許可する、安全でないファイルロックを許可する (一部の初期 NFS クライアント実装で必要) などの機能があります。これらのあまり使用されないオプションの詳細については、 man エクスポート を参照してください。
重要
/etc/exports ファイルの形式は、特にスペース文字の使用に関して非常に正確です。ホストからエクスポートするファイルシステムの間、そしてホスト同士の間には、必ず空白文字を挿入してください。また、それ以外の場所 (コメント行を除く) には、空白文字を追加しないでください。
たとえば、以下の 2 つの行は意味が異なります。
/home bob.example.com(rw)
/home bob.example.com (rw)
最初の行では、bob.example.com のユーザーのみに /home ディレクトリーへの読み取りおよび書き込みアクセスが許可されます。2 行目では 、bob.example.com のユーザーがディレクトリーを読み取り専用 (デフォルト) でマウントできるようにしますが、その他のユーザーは読み取り/書き込みでマウントできます。

8.6.2. importfs コマンド

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
/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 を設定して NFSv4 をオフにします。

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 をサポートするサーバーで、ルートディレクトリー をマウントし、周囲を調べます。
    # 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. /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.6.5. ホスト名の形式

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