重启后出现“过时的NFS文件句柄”

在服务器节点上,可以访问导出的文件夹。 但是,重新启动后(服务器和客户端),该文件夹不再可以从客户端访问。

在服务器上

# 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。 这可能会清除文件句柄。

不build议使用从其他服务器打开的文件重新启动NFS服务器。 如果打开的文件在服务器上被删除,这尤其是有问题的。 服务器可能会保持文件处于打开状态,直到重新启动,但重新启动将删除服务器端的内存文件句柄。 然后客户端将不能再打开文件。

确定从服务器使用哪些安装是困难和不可靠的。 showmount -a选项可能会显示一些有效的坐骑,但可能不会报告所有坐骑。 locking的文件更容易识别,但需要启用locking,并依靠客户端软件来locking文件。

您可以在客户端上使用lsof来标识在安装文件上打开文件的进程。

我在我的NFS挂载上使用了hardintr挂载选项。 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