第8章 Network File System (NFS)
ネットワークファイルシステム (NFS) を利用すると、リモートのホストがネットワーク経由でファイルシステムをマウントし、そのファイルシステムを、ローカルにマウントしているファイルシステムと同じように操作できるようになります。また、システム管理者は、リソースをネットワーク上の中央サーバーに統合することができるようになります。
この章では、基本的な NFS の概念と補足的な情報に焦点を絞って説明します。
8.1. NFS の概要
現在、Red Hat Enterprise Linux には、NFS のメジャーバージョンが 2 つ含まれています。
- NFS バージョン 3 (NFSv3) は、安全な非同期書き込みをサポートし、以前の NFSv2 よりもエラー処理で堅牢です。また、64 ビットのファイルサイズとオフセットにも対応しているため、クライアントは 2GB 以上のファイルデータにアクセスできます。
- NFS バージョン 4 (NFSv4)はファイアウォールやインターネットを介して動作し、rpcbind サービスが不要になり、ACL に対応し、ステートフルな操作を利用します。
Red Hat Enterprise Linux 7.4 リリース以降、Red Hat Enterprise Linux は NFS バージョン 4.2 (NFSv4.2) に完全に対応しています。
以下は、Red Hat Enterprise Linux における NFSv4.2 の機能です。
- スパースファイル: ファイルの領域の効率を検証し、プレースホルダーがストレージの効率を向上できるようにします。これは、1 つ以上のホールがあるファイルです。ホールは、ゼロのみで設定される、割り当てられていないデータブロックまたは初期化されていないデータブロックです。
lseek()
NFSv4.2 での 操作は、seek_hole()
およびseek_data()
に対応しています。これにより、アプリケーションはスパースファイルのホールの場所をマッピングできます。 - 領域の予約: ストレージサーバーが空き領域を予約することを許可します。これにより、サーバーで領域が不足することがなくなります。NFSv4.2 は、領域を予約するための
allocate()
操作、領域の予約を解除するdeallocate()
操作、およびファイル内の領域の事前割り当てまたは割り当て解除を行うfallocate()
操作に対応します。 - ラベル付き NFS: データアクセス権を強制し、NFS ファイルシステム上の個々のファイルに対して、クライアントとサーバーとの間の SELinux ラベルを有効にします。
- レイアウトの機能拡張:NFSv4.2 は、クライアントがレイアウトとの通信についてメタデータサーバーに通知するために使用できる新しい操作
layoutstats()
を提供します。
7.4 より前のバージョンの Red Hat Enterprise Linux は、バージョン 4.1 までの NFS に対応します。
NFSv4.1 の機能は次のとおりです。
- ネットワークのパフォーマンスとセキュリティーを向上させ、Parallel NFS (pNFS) に対するクライアント側のサポートも追加されました。
- コールバックに個別の TCP 接続が必要なくなり、クライアントと通信できない場合でも、NFS サーバーは委任を許可できるようになりました。たとえば、NAT やファイアウォールが干渉する場合です。
- 応答が失われ、操作が 2 回送信された場合に特定の操作が不正確な結果を返すことがあるという以前の問題を防ぐために、1 回限りのセマンティクスを提供します (再起動操作を除く)。
NFS クライアントは、デフォルトで NFSv4.1 を使用してマウントを試行し、サーバーが NFSv4.1 に対応していない場合は NFSv4.0 にフォールバックします。サーバーが NFSv4.0 に対応していない場合、マウントは後で NFSv3 に戻ります。
注記
NFS バージョン 2 (NFSv2) は、Red Hat のサポート対象外になりました。
NFS の全バージョンで、IP ネットワーク経由で実行する Transmission Control Protocol (TCP) を使用することができ、NFSv4 の場合は TCP が必須になります。NFSv3 は、IP ネットワークで実行している User Datagram Protocol (UDP) を使用して、クライアントとサーバー間のステートレスなネットワーク接続を提供することができます。
UDP で NFSv3 を使用する場合は、(通常の条件下で) ステートレス UDP 接続のプロトコルオーバーヘッドが TCP より少なくなります。つまり、クリーンで適度なトラフィックのネットワーク上では、UDP の方がパフォーマンスがよくなります。ただし、UDP はステートレスのため、予期しないサーバーダウンなどが発生すると、UDP クライアントはサーバーの要求でネットワークを飽和させ続けます。また、UDP の場合にフレームがなくなると、RPC 要求全体を再転送しなければならなくなります。一方、TCP の場合、再送信が必要なのは失ったフレームのみになります。こうした理由から NFS サーバーへの接続には TCP プロトコルが推奨されます。
NFSv4 プロトコルには、マウントとロックのプロトコルが組み込まれています。サーバーは、既知の TCP ポート 2049 もリッスンします。そのため、NFSv4 は rpcbindと対話する必要はありません。 [1]、、 および rpc.statd デーモン。rpc.mountd デーモンは、エクスポートを設定するために NFS サーバーで引き続き必要ですが、ネットワーク上の操作には関与しません。
注記
TCP は、Red Hat Enterprise Linux の NFS バージョン 3 のデフォルトのトランスポートプロトコルです。UDP は互換性に必要となる場合は使用できますが、その使用範囲についてはできるだけ限定することを推奨しています。NFSv4 には TCP が必要です。
すべての RPC/NFS デーモンには、ポートを設定できる '-p' コマンドラインオプションがあり、ファイアウォール設定が容易になります。
TCP ラッパーがクライアントへのアクセスを許可すると、NFS サーバーは
/etc/exports
設定ファイルを参照して、クライアントがエクスポートされたファイルシステムにアクセスできるかどうかを判断します。アクセスが可能なことが確認されると、そのユーザーは、ファイルおよびディレクトリーへの全操作を行えるようになります。
重要
ファイアーウォールを有効にしている Red Hat Enterprise Linux のデフォルトインストールで NFS を正しく動作させるために、IPTables は、デフォルトの TCP ポート 2049 に設定してください。IPTables が正しく設定されていないと、NFS は正常に動作しません。
NFS 初期化スクリプトおよび rpc.nfsd プロセスでは、システム起動時に指定したポートへのバインドが可能になりました。ただし、このポートが使用できない場合や、別のデーモンと競合してしまう場合は、エラーが発生しやすくなる可能性があります。
8.1.1. 必要なサービス
Red Hat Enterprise Linux は、カーネルレベルのサポートとデーモンプロセスの組み合わせを使用して、NFS ファイル共有を提供します。すべての NFS バージョンは、クライアントとサーバー間の Remote Procedure Calls (RPC) に依存します。Red Hat Enterprise Linux 7 の RPC サービスは、rpcbind サービスによって制御されます。NFS ファイルシステムの共有やマウントには、実装されている NFS のバージョンに応じて、次のようなサービスが連携して動作することになります。
注記
portmap サービスは、Red Hat Enterprise Linux の以前のバージョンでは、RPC プログラム番号を IP アドレスポート番号の組み合わせにマッピングするために使用されていました。このサービスは、IPv6 サポートを有効にするために、Red Hat Enterprise Linux 7 で rpcbind に置き換えられました。
- nfs
- systemctl start nfs は、NFS サーバーと適切な RPC プロセスを開始し、共有 NFS ファイルシステムの要求を処理します。
- nfslock
- systemctl start nfs-lock は、適切な RPC プロセスを開始する必須サービスをアクティブにし、NFS クライアントがサーバー上のファイルをロックできるようにします。
- rpcbind
- rpcbind は、ローカルの RPC サービスからのポート予約を受け入れます。その後、これらのポートは、対応するリモートの RPC サービスによりアクセス可能であることが公開されます。rpcbind は RPC サービスの要求に応答し、要求された RPC サービスへの接続を設定します。このプロセスは NFSv4 では使用されません。
以下の RPC プロセスは、NFS サービスを容易にします。
- rpc.mountd
- このプロセスは、NFS サーバーが 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) プロトコルを実装し、これにより、NFSv3 クライアントがサーバー上のファイルをロックできるようになります。NFS サーバーが実行中で、NFS ファイルシステムがマウントされていれば、このプロセスは常に自動的に起動します。
- rpc.statd
- このプロセスは、Network Status Monitor (NSM) RPC プロトコルを実装します。NFS サーバーが正常にシャットダウンされずに再起動すると、NFS クライアントに通知します。rpc.statd は、nfslock サービスにより自動的に開始されるため、ユーザー設定は必要ありません。このプロセスは NFSv4 では使用されません。
- rpc.rquotad
- このプロセスは、リモートユーザーのユーザークォーター情報を提供します。rpc.rquotad は、nfs サービスにより自動的に開始されるため、ユーザー設定は必要ありません。
- rpc.idmapd
- rpc.idmapd は、ネットワーク上の NFSv4 名(
ユーザー@ドメイン
の形式の文字列)とローカル UID と GID の間でマッピングされる NFSv4 クライアントおよびサーバーのアップコールを提供します。idmapd を NFSv4 で機能させるには、/etc/idmapd.conf
ファイルを設定する必要があります。少なくとも、NFSv4 マッピングドメインを定義する Domain パラメーターを指定する必要があります。NFSv4 マッピングドメインが DNS ドメイン名と同じ場合は、このパラメーターは必要ありません。クライアントとサーバーが ID マッピングの NFSv4 マッピングドメインに合意しないと、適切に動作しません。注記Red Hat Enterprise Linux 7 では、NFSv4 サーバーのみが rpc.idmapd を使用します。NFSv4 クライアントは、キーリングベースの idmapper nfsidmap を使用します。nfsidmap は、ID マッピングを実行するためにカーネルがオンデマンドで呼び出されるスタンドアロンプログラムです。これはデーモンではありません。nfsidmap に問題が発生した場合、クライアントは rpc.idmapd の使用にフォールバックします。nfsidmap の詳細は、man ページの nfsidmap を参照してください。