Red Hat Training

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

第8章 NFS (Network File System)

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

8.1. NFS の仕組み

現在、Red Hat Enterprise Linux には 2 つのメジャーバージョンの NFS が含まれています。NFS バージョン 3 (NFSv3) は安全な非同期書き込みに対応し、NFSv2 よりもエラーの処理機能が強化されています。また、64 ビットのファイルサイズおよびオフセットをサポートするため、クライアントは 2 GB を超えるファイルデータにアクセスできます。NFSv4 はファイアウォールを介して動作し、インターネット上でも動作します。さらに、rpcbind サービスが必要なく、ACL をサポートし、ステートフルな操作を利用します。
Red Hat Enterprise Linux 7 には NFS バージョン 4.1 (NFSv4.1) のサポートが追加され、Parallel NFS (pNFS) のクライアント側サポートを含むパフォーマンスおよびセキュリティーの機能が複数強化されました。NFSv4.1 ではコールバックで個別の TCP 接続が不要になり、(NAT やファイアウォールが妨害する場合など) クライアントと通信できなくても、NFS サーバーは委任を許可できます。さらに、NFSv4.1 では exactly once セマンティックが提供されるようになり (再起動操作を除く)、返答が失われ、操作が 2 度送信された場合に、特定の操作が不正確な結果を返す可能性のあるこれまでの問題が発生しないようになりました。
Red Hat Enterprise Linux 7 は NFSv3、NFSv4.0、および NVSv4.1 クライアントをサポートします。NFS クライアントは、デフォルトでは 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]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 プロセスでは、システム起動中の指定ポートへのバインドが可能になりました。ただし、このポートが使用できない場合や、別のデーモンと競合してしまう場合は、エラーが発生しやすくなる可能性があります。

8.1.1. 必須サービス

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

注記

portmap サービスは、Red Hat Enterprise Linux の旧バージョンで、RPC プログラム番号を、IP アドレスとポート番号の組み合わせにマッピングするのに使用されていました。このサービスは、Red Hat Enterprise Linux 7 でIPv6 に対応にするため、rpcbind に置き換えられています。
nfs
systemctl start nfs により NFS サーバーおよび該当の RPC プロセスが起動し、共有 NFS ファイルシステムの要求が処理されます。
nfslock
systemctl start nfs-lock は、適切な RPC プロセスを起動する必須サービスをアクティベートし、NFS クライアントがサーバー上のファイルをロックできるようにします。
rpcbind
rpcbind で、ローカルの RPC サービスからポート予約を受け取ると、これらのポートはリモートの RPC サービスによってアクセス可能であることが公開されます。rpcbind は、RPC サービスの要求に応答し、要求された RPC サービスへの接続のセットアップを行います。NFSv4 では rpcbind は使用されません。
以下の 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.rquotadnfs サービスによって自動的に起動するため、ユーザー設定を必要としません。
rpc.idmapd
rpc.idmapd は、ネットワーク上の NFSv4 の名前 (user@domain 形式の文字列) とローカルの 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 の詳細は、nfsidmap の man ページを参照してください。


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