サーバーノードでは、エクスポートされたフォルダーにアクセスできます。ただし、再起動後(サーバーとクライアントの両方)、フォルダーはクライアントからアクセスできなくなります。
サーバー上
# 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
クライアント側からの共有フォルダには問題がなかったと言わざるを得ませんが、再起動後(サーバーとクライアント)、このメッセージが表示されます。
それを修正する方法はありますか?
リブートの順序は重要です。クライアントの後でサーバーを再起動すると、この状況が発生する可能性があります。古いNFSハンドルは、クライアントがファイルを開いていることを示していますが、サーバーはファイルハンドルを認識していません。場合によっては、NFSはタイムアウト後にデータ構造をクリーンアップします。他の場合では、NFSデータ構造を自分でクリーンアップし、後でNFSを再起動する必要があります。これらの構造が配置される場所は、多少O/Sに依存します。
まずサーバーで、次にクライアントでNFSを再起動してください。これにより、ファイルハンドルがクリアされる場合があります。
他のサーバーから開いたファイルでNFSサーバーを再起動することはお勧めしません。これは、サーバー上で開いているファイルが削除されている場合に特に問題になります。サーバーは、再起動されるまでファイルを開いたままにすることがありますが、再起動するとサーバー側のメモリ内ファイルハンドルが削除されます。その後、クライアントはファイルを開くことができなくなります。
サーバーから使用されているマウントを特定することは困難であり、信頼できません。 showmount -a
オプションは一部のアクティブなマウントを表示する場合がありますが、それらのすべてを報告するわけではありません。ロックされたファイルは簡単に識別できますが、ロックを有効にする必要があり、ファイルをロックするにはクライアントソフトウェアに依存します。
クライアントでlsof
を使用して、マウントでファイルを開いているプロセスを特定できます。
NFSマウントでhard
およびintr
マウントオプションを使用します。 hard
オプションを使用すると、IOが無期限に再試行されます。intr
オプションを使用すると、NFSで待機しているプロセスを強制終了できますIO完了します。
私が書いたこのスクリプトを試してください:
#!/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
NFSサーバーで、ファイルシステムをエクスポート解除して再エクスポートします。
exportfs -u nfs-server:/ file_system exportfs nfs-server:/ file_system
クライアントでファイルシステムをマウントする
mount -t nfs nfs-server:/ filesystem/mount_point
特定のパスのlsofをチェックし、それぞれのpidを強制終了します。次に、パーティションをアンマウントしてマウントします。