NFS共有をマウントしようとするたびに、次のようになります。
>> mount -t nfs gitlab-replica-storage.blah.com:/export/registry-gitlab-prod-data-vol /mnt/test
mount.nfs: Stale file handle
問題は、私がアンマウントできないことです。
>> umount -f -l /mnt/test
umount: /mnt/test: not mounted
マウントポイントを使用しているプロセスがあるかどうかを確認してみましたが、そうではありません。
これをトラブルシューティングする他の方法はありますか?
説明として:
エラーESTALEは、NFSがサーバー上のファイルを一意に識別するために使用するファイルハンドルがサーバー上の有効なファイルを参照しなくなった状況を処理するために最初に導入されました。これは、サーバー上のアプリケーション、サーバーにアクセスする他のクライアント、または同じクライアントからマウントされた別のファイルシステムによって、サーバー上のファイルが削除されたときに発生する可能性があります。 NFSサーバーは、エクスポートされなくなったファイルシステムにファイルが存在する場合にも、このエラーを返します。さらに、一部のNFSサーバーでは、ファイルの名前が変更されたときにファイルハンドルも変更しますが、これはお勧めできません。
このエラーは、同じ名前のファイルまたはディレクトリがクライアントで認識されずにサーバーで再作成された場合でも発生します。ファイルハンドルは、ファイルの特定のインスタンスを参照し、ファイルを削除してから再作成すると、ファイルの新しいインスタンスが作成されます。
エラーESTALEは通常、キャッシュされたディレクトリ情報を使用してパス名をdentry/inodeペアに変換するときに発生します。後続の操作がNFSサーバーに送信されたときに、情報が古いか古くなっていることが検出されました。これは、キャッシュされた情報を使用してパス名がdentry/inodeペアに変換されたときに、stat(2)などのシステムコールで簡単に発生する可能性があります。
このエラーは、検索するパス名の異なるコンポーネントを検索する間、または検索が成功してから次の操作を行うまでの間にサーバーで変更が行われた場合にも発生する可能性があります。
ESTALEに関する元のリンク: ESTALE LWN 。
NFSサーバーのファイルとディレクトリを確認するか、NFSサーバーの管理者に依頼してください。
多分古いページキャッシュ、inode、dentryキャッシュエントリがNFSサーバーに存在しています。きれいにしてください:
# To free pagecache
echo 1 > /proc/sys/vm/drop_caches
# To free dentries and inodes
echo 2 > /proc/sys/vm/drop_caches
# To free pagecache, dentries and inodes
echo 3 > /proc/sys/vm/drop_caches
サーバーにそのクライアントの古いエクスポートエントリがある場合、mount -t nfs
はStale file handle
で失敗します。
シナリオ例:これは、クライアントが最初にnfsボリュームをアンマウントせずにサーバーを再起動したときに発生する可能性があります。サーバーが復帰し、クライアントがnfsボリュームをアンマウントしてマウントしようとすると、サーバーは次のように応答します。
mount.nfs: Stale file handle
これは/proc/fs/nfs/exports
または/proc/fs/nfsd/exports
で確認できます。クライアントのエントリがある場合、古いエントリである可能性があります。
サーバーで関連するエクスポートを明示的にアンエクスポートして再エクスポートすることで、これを修正できます。たとえば、すべてのエクスポートでこれを行うには:
# exportfs -ua
# cat /proc/fs/nfs/exports
# exportfs -a
この後、クライアントのmount -t nfs ...
は成功するはずです。
ESTALE
を生成するマウントは、ESTALE
を返す他のシステムコール(open/readdir/unlink/chdir ...など)とはかなり異なることに注意してください。エクスポートが古くなっているのに対して、ファイルハンドルが古くなっています。古いファイルハンドルはNFSで簡単に発生します(たとえば、クライアントにはファイルハンドルがありますが、サーバー上でファイルが削除されました)。
NFSサーバーで古いマウントエントリを見つけます。
showmount -a | grep ip_address_of_nfs_client
NFSクライアントのIPアドレスおよびマウントしようとしている共有に関連する行が表示された場合は、rmtabから古いエントリを削除します。
vi /var/lib/nfs/rmtab
Rpc.mountdをリロードして、新しいrmtabが見えるようにします。
killall rpc.mountd ; /usr/sbin/rpc.mountd
エクスポートが実際にマウントされているかどうかを確認します。
# cat /proc/mounts | grep nfs
古いファイルハンドルエラーは、NFSサーバーが古いバージョンのファイルをエクスポートパスに保持していることを意味します。 NFSサーバーの再起動が役立つことがあります。ただし、古いOS(RHEL/CentOS 6.9)では、NFS4ではなくNFS3に戻す方が良い場合があります。私の経験では、古いNFS4クライアントが新しいNFS4.1サーバーで時々問題を抱えています。これは特にファイルのロックに当てはまります。