NFS サーバーの再起動後の NFS 古くなったファイル ハンドル: なぜこのようなことが起こるのか、また業界ではどのように対処しているのか?

NFS サーバーの再起動後の NFS 古くなったファイル ハンドル: なぜこのようなことが起こるのか、また業界ではどのように対処しているのか?

この問題は私を困惑させています。

さまざまなクライアントにマウントされた NFS 共有を持つ NFS サーバーがあります。ただし、NFS サーバーを再起動する必要がある場合は、必ずすべてのクライアントのマウントで「古いファイル ハンドル」エラーが大量に発生し、クライアントで NFS 共有を手動でアンマウントして再マウントする必要があります。

NFS サーバー上のエクスポートをチェックしたところcat /etc/exports、再起動後も各 NFS エクスポートに同じ fsid が渡されています。

私の質問:

  1. 業界はこの問題をどのように処理しているのでしょうか? システム管理者が各クライアントを手動でアンマウント/再マウントしたり、接続されたクライアントをまとめて再起動したりするとは想像しがたいことです。それとも、本当にそのように処理されているのでしょうか? (「ダウンタイムは発生せず、NFS サーバーを再起動する必要もありません。」という標準は別として)
  2. なぜこのようなことが起こるのでしょうか? これは、fsid が同じであっても、NFS サーバーがファイル ハンドルを再計算するため、再起動ごとに同じにならない可能性があるからでしょうか?
  3. これを防ぐためにマウント構成で何か改善すべき点はありますか?

/etc/fstab:

[NFSserver]:/mnt/backup /mnt/backup nfs bg,nfsvers=3,tcp 0 0

パーこの郵便受けhard、オプションを追加してマウントすることが提案されましたintrが、何も違いはなかったようです。

  1. 他のすべてが失敗した場合は、bash スクリプトを使用してマウント/ディレクトリを監視し、古いファイル エラーがないか確認し、アンマウント/マウント サイクルを実行するだけでよいのでしょうか?

前もって感謝します。

-トルクレンチ

答え1

NFS バージョン 3 を使用していますが、ポート 2049 のメイン NFS サービスに加えて、いくつかのヘルパー サービスが必要です。これらの 1 つは でrpc.statd、再起動の検出と再起動後の NFS ロックの回復/クリアに重要な役割を果たします。

これらのヘルパー サービスはランダムなポートに配置され、RPC ポート マッパー (通常、rpcbind最近の Linux ではプロセス名が付けられています) に接続することで検出されます。ファイアウォールを備えた最近のネットワークでは、このような動作によって状況が複雑になることがあります。再起動後には確定的なポートにヘルパー サービスが配置されているように見えても、NFS サービスを再起動すると、まったく異なるポート番号に割り当てられる場合があります。

幸いなことに、多くの最近の Unix 系システムでは、NFS ロック マネージャー (歴史的にはrpc.lockd、現在では通常カーネル内に実装されています)のポート番号をロックダウンできます。これrpc.statdrpc.mountd、NFSv3 を何らかの信頼性でファイアウォールに通過させたい場合に不可欠です。

RHEL および関連ディストリビューションの場合、次の行を追加することで NFS ヘルパー ポート番号をロックダウンできます/etc/sysconfig/network

LOCKD_TCPPORT=4045
LOCKD_UDPPORT=4045
STATD_PORT=4046
MOUNTD_PORT=4047

Debian および関連ディストリビューションの場合は、次の行を追加します/etc/modprobe.d/nfs.conf

options lockd nlm_udpport=4045 nlm_tcpport=4045

...そして次の行/etc/default/nfs-common:

STATDOPTS="-p 4046"

...そして次の行/etc/default/nfs-kernel-server:

RPCMOUNTDOPTS="-p 4047" # you may want to add a --manage-gids option here

(必要に応じて別のポート番号を使用することもできますが、Solaris の NFSv3 ロック マネージャーのデフォルト ポートは 4045 であり、HP-UX 11.31 でも同様にハードコードされています。)


しかし、NFSv3 プロトコルには別の落とし穴があります。IP アドレスだけを使用して NFS 共有をマウントすることはできますが、NFSv3 ロック プロトコルは内部的にホスト名を使用します。クライアントとサーバーの両方が正しい名前で互いを認識している必要があります。そうしないと、再起動後の NFS ファイル ロックとロック回復が機能しません。各システムの「正しい名前」は、によって報告される名前ですuname -n

したがって、サーバーとクライアントでそれぞれ がuname -n返される場合は、それらの正確な名前が、ホストが NFS に使用する必要のある IP アドレスに解決されることを確認する必要があります。言い換えると、サーバーは名前を使用してクライアントに接続でき、その逆も同様である必要があります。server.exampleclient.examplerpc.statdclient.example

そうしないと、最初はすべて正常に動作しているように見えるかもしれませんが、どちらかの側が再起動すると、Stale file handleエラーが発生する可能性があります。

答え2

@telcoM からの素晴らしい回答に加えて、他に 2 つの解決策を提案したいと思います。

  • オプション付きでNFSをマウントしますnoac(これは意思ls大きなディレクトリや多数のファイルに対して発行するとパフォーマンスが低下しますstat)

  • NFS v4.1 を使用します (v4.0 には「古いファイルの処理」につながるバグがいくつかあったため、必ず v4.1 プロトコルを選択してください)。

関連情報