再起動後の「古いNFSファイルハンドル」


16

サーバーノードでは、エクスポートされたフォルダーにアクセスできます。ただし、再起動後(サーバーとクライアントの両方)、フォルダーはクライアントからアクセスできなくなります。

サーバー上

# ls /data
Folder1
Forlder2

および/ etc / exportsファイルには

/data 192.168.1.0/24(rw,no_subtree_check,async,no_root_squash)

クライアントで

# ls /data
ls: cannot access /data: Stale NFS file handle

クライアント側からの共有フォルダーに問題はなかったと言わざるを得ませんが、再起動後(サーバーとクライアント)、このメッセージが表示されます。

それを修正する方法はありますか?

回答:


22

再起動の順序は重要です。クライアントがこの状況になった後、サーバーを再起動することができます。古いNFSハンドルは、クライアントが開いているファイルを持っているが、サーバーがファイルハンドルを認識しなくなったことを示します。場合によっては、NFSはタイムアウト後にデータ構造をクリーンアップします。それ以外の場合は、NFSデータ構造を自分で消去し、その後NFSを再起動する必要があります。これらの構造が配置される場所は、多少O / Sに依存します。

最初にサーバーでNFSを再起動してから、クライアントで再起動してください。これにより、ファイルハンドルがクリアされる場合があります。

他のサーバーからファイルを開いてNFSサーバーを再起動することはお勧めしません。サーバーで開いているファイルが削除されている場合、これは特に問題です。サーバーは再起動するまでファイルを開いたままにすることができますが、再起動するとサーバー側のメモリ内ファイルハンドルが削除されます。その後、クライアントはファイルを開くことができなくなります。

サーバーからどのマウントが使用されたかを判断することは難しく、信頼性がありません。このshowmount -aオプションはいくつかのアクティブなマウントを表示する場合がありますが、それらすべてを報告しない場合があります。ロックされたファイルは簡単に識別できますが、ロックを有効にする必要があり、クライアントソフトウェアに依存してファイルをロックします。

lsofクライアントで使用して、マウント上でファイルを開いているプロセスを識別できます。

NFSマウントでhardintrマウントオプションを使用します。このhardオプションにより、IOが無期限に再試行されます。このintrオプションを使用すると、NFS IOの完了を待機しているプロセスを強制終了できます。


使用することhard, intrは良いアドバイスです。ただし、NFSでは試行ごとにタイムアウトが2倍になることに注意してください。だから、あなたはベストセットtimeo=1などretrans=5。これにより、NFSの再起動後にNFSサーバーに大きな負荷がかかることに注意してください。NFSサービスを頻繁に再起動しないようにしてください;)
bjanssen 14

あなたの答えは正しいです。また、別の簡単な解決策を見つけました。古いNFSハンドラーを言うノードで、フォルダをアンマウントして再度マウントし直してください。
マフムード14

4

私が書いたこのスクリプトを試してください:

#!/bin/bash
# Purpose:
# Detect Stale File handle and remove it
# Script created: July 29, 2015 by Birgit Ducarroz
# Last modification: --
#

# Detect Stale file handle and write output into a variable and then into a file
mounts=`df 2>&1 | grep 'Stale file handle' |awk '{print ""$2"" }' > NFS_stales.txt`
# Remove : ‘ and ’ characters from the output
sed -r -i 's/://' NFS_stales.txt && sed -r -i 's/‘//' NFS_stales.txt && sed -r -i 's/’//' NFS_stales.txt

# Not used: replace space by a new line
# stales=`cat NFS_stales.txt && sed -r -i ':a;N;$!ba;s/ /\n /g' NFS_stales.txt`

# read NFS_stales.txt output file line by line then unmount stale by stale.
#    IFS='' (or IFS=) prevents leading/trailing whitespace from being trimmed.
#    -r prevents backslash escapes from being interpreted.
#    || [[ -n $line ]] prevents the last line from being ignored if it doesn't end with a \n (since read returns a non-zero exit code when it encounters EOF).

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Unmounting due to NFS Stale file handle: $line"
    umount -fl $line
done < "NFS_stales.txt"
#EOF

2

NFSサーバーで、ファイルシステムをUNエクスポートおよび再エクスポートします。

exportfs -u nfs-server:/ file_system exportfs nfs-server:/ file_system

クライアント上でファイルシステムをマウントします

mount -t nfs nfs-server:/ filesystem / mount_point


0

特定のパスのlsofを確認し、それぞれのpidを強制終了します。次に、パーティションをアンマウントして、マウントし直します。


これは、質問に記載されている問題の解決策というよりは、回避策のようなものです。
asdmin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.