第9章 NFS (Network File System)

ネットワークファイルシステム (NFS) を利用すると、リモートのホストはネットワーク経由でファイルシステムをマウントし、そのファイルシステムをローカルにマウントしているファイルシステムと同じように操作することができるようになります。また、システム管理者側はリソースをネットワーク上の中央サーバーに統合することができるようになります。
この章では、基本的な NFS の概念と補足的な情報に焦点を絞って説明します。

9.1. 動作について

現在、NFS には 3 つのバージョンがあります。NFS バージョン 2 (NFSv2) は旧式で広くサポートされています。NFS バージョン 3 (NFSv3) は安全な非同期書き込みに対応し、NFSv2 に比べエラーの処理機能が強化されています。また、64 ビットのファイルサイズやオフセットに対応するため、クライアントによる 2Gb を超えるファイルデータへのアクセスが可能になります。
NFS バージョン 4 (NFSv4) はファイアーウォールを介してインターネット上で動作します。rpcbind サービスを必要としなくなり、ACL に対応し、ステートフルな操作を活用します。Red Hat Enterprise Linux 6 では、NFSv2、NFSv3、および NFSv4 のクライアントに対応しています。NFS 経由でファイルシステムをマウントする場合、サーバーが NFSv4 に対応していれば Red Hat Enterprise Linux はデフォルトで NFSv4 を使用します。
NFS の全バージョンで IP ネットワーク経由で実行する Transmission Control Protocol (TCP) を使用することができ、NFSv4 の場合は TCP が必須になります。NFSv2 および NFSv3 では IP ネットワーク経由で実行する User Datagram Protocol (UDP) を使用してクライアントとサーバー間のステートレスなネットワーク接続を提供することができます。
UDP で NFSv2 または NFSv3 を使用する場合、ステートレスな UDP 接続のプロトコルのオーバーヘッドは TCP より少なくなります (通常の状況を想定)。つまり、クリーンで適度なトラフィックのネットワーク上では、UDP の方がパフォーマンスがよくなります。ただし、UDP はステートレスのため、予期しないサーバーダウンなどが発生すると UDP クライアントはサーバーの要求でネットワークを飽和させ続けます。また、UDP の場合にフレームがなくなると、RPC 要求全体を再転送しなければならなくなります。一方、TCP の場合、再送信が必要なのは失ったフレームのみなります。こうした理由から NFS サーバーへの接続には TCP プロトコルが推奨されます。
マウントおよびロックプロトコルが NFSv4 プロトコルに組み込まれています。サーバーは、一般的に使用されている TCP ポート 2049 でもリッスンします。このように、NFSv4 は rpcbind [3]lockdrpc.statd デーモンとの対話が必要ありません。rpc.mountd デーモンはエクスポートのセットアップには NFS サーバーで必要ですが、送信オペレーションは行われません。

注記

Red Hat Enterprise Linux では、TCP が NFS バージョン 2 および 3 のデフォルトの転送プロトコルになります。UDP は互換性に必要となる場合は使用できますが、その使用範囲についてはできるだけ限定することを推奨しています。NFSv4 には TCP が必須となります。
RPC/NFS デーモンはすべて '-p' コマンドラインオプションがあり、ポートを設定することができるため、ファイアウォールの設定が容易になります。
TCP ラッパーによってクライアントにアクセスが許可されると、NFS サーバーは /etc/exports 設定ファイルを参照してそのクライアントのエクスポート済みファイルシステムへのアクセスの可否を確認します。アクセス可能なことが確認されると、そのユーザーは全ファイルおよびディレクトリーの操作を行えるようになります。

重要

ファイアーウォールを有効にしている Red Hat Enterprise Linux のデフォルトインストールで NFS を正しく動作させるため、IPTables はデフォルトの TCP ポート 2049 で設定してください。IPTables が正しく設定されていないと NFS は正常に動作しません。
NFS の初期化スクリプトおよび rpc.nfsd プロセスでは、システム起動中の指定ポートへのバインドが可能になりました。ただし、このポートが使用できない場合や、別のデーモンと競合してしまう場合はエラーが発生しやすくなる可能性があります。

9.1.1. 必須サービス

Red Hat Enterprise Linux では、NFS ファイル共有を提供するためにカーネルベースのサポートとデーモンのプロセスの組み合わせを使用します。NFS のすべてのバージョンはクライアントとサーバー間の Remote Procedure Call (RPC) に依存します。Red Hat Enterprise Linux 6 での RPC サービスは rpcbind サービスで制御されます。NFS ファイルシステムの共有やマウントには、実装されている NFS のバージョンに応じて次のようなサービスが連携して動作することになります。

注記

portmap サービスは、Red Hat Enterprise Linux の旧バージョンで RPC プログラム番号を IP アドレスとポート番号の組み合わせにマッピングする際に使用されていました。このサービスは Red Hat Enterprise Linux 6 では IPv6 に対応するよう rpcbind に置き換えられています。この変更についてさらに詳しくは、以下のリンクを参照してください。
nfs
service nfs start により NFS サーバーおよび該当の RPC プロセスが起動し、共有 NFS ファイルシステムの要求が処理されます。
nfslock
service nfslock start によって RPC プロセスを起動する必須サービスがアクティベートされます。この RPC プロセスにより NFS クライアントはサーバー上にあるファイルをロックできるようになります。
rpcbind
rpcbind でローカルの RPC サービスからポート予約が受け取られると、これらのポートはリモートの RPC サービスによってアクセス可能であることが公開されます。rpcbind は RPC サービスの要求に応答し、要求された RPC サービスへの接続のセットアップを行います。NFSv4 では rpcbind は使用されません。
以下の RPC プロセスは NFS サービスと連携して動作します。
rpc.mountd
NFS サーバーはこのプロセスを使用して NFSv2 および NFSv3 クライアントの MOUNT 要求を処理します。要求されている NFS 共有が現在 NFS サーバーで公開されているか、またその共有へのクライアントのアクセスが許可されているかをチェックします。マウントの要求が許可されると rpc.mountd サーバーは Success ステータスで応答し、この NFS 共有用の File-Handle を NFS クライアントに戻します。
rpc.nfsd
rpc.nfsd では、サーバーが公開している明示的な NFS のバージョンとプロトコルを定義できます。NFS クライアントが接続するたびにサーバースレッドを提供するなど、NFS クライアントの動的なデマンドに対応するため Linux カーネルと連携して動作します。このプロセスは nfs サービスに対応します。
lockd
lockd はクライアントとサーバーの両方で実行されるカーネルスレッドです。Network Lock Manager (NLM) プロトコルを実装し、NFSv2 および NFSv3 のクライアントがサーバー上でファイルのロックを行えるようにします。NFS サーバーが実行中で NFS ファイルシステムがマウントされていれば、このプロセスは常に自動的に起動します。
rpc.statd
Network Status Monitor (NSM) RPC プロトコルを実装します。NFS サーバーが正常にシャットダウンされず再起動された場合に NFS クライアントに通知します。 rpc.statdnfslock サービスによって自動的に起動されるため、ユーザー設定を必要としません。このプロセスは NFSv4 では使用されません。
rpc.rquotad
リモートユーザーのユーザークォータ情報を提供します。rpc.rquotadnfs サービスによって自動的に起動するため、ユーザー設定を必要としません。
rpc.idmapd
rpc.idmapd は、ネットワーク上の NFSv4 の名前 (user@domain 形式の文字列) とローカルの UID および GID とのマッピングを行う NFSv4 クライアントアップコールおよびサーバーアップコールを提供します。idmapd を NFSv4 で正常に動作させるには、/etc/idmapd.conf ファイルを設定する必要があります。NFSv4 を使用する場合はこのサービスが必須となりますが、全ホストに同じ DNS ドメイン名を共有させる場合は必要ありません。ローカルドメインの使用については、ナレッジベース記事の https://access.redhat.com/site/solutions/130783 を参照してください。


[3] Red Hat Enterprise Linux の以前のバージョンで RCP プログラム番号を IP アドレスのポート番号の組み合わせにマッピングする際に使用されていた portmap に代わり、rpcbind サービスが使用されます。さらに詳しくは、「必須サービス」 を参照してください。