dju*_*rez 8 nfs mount unmounting
每次我尝试挂载 NFS 共享时,我都会得到以下信息:
>> mount -t nfs gitlab-replica-storage.blah.com:/export/registry-gitlab-prod-data-vol /mnt/test
mount.nfs: Stale file handle
Run Code Online (Sandbox Code Playgroud)
问题是我无法卸载,正如它所说:
>> umount -f -l /mnt/test
umount: /mnt/test: not mounted
Run Code Online (Sandbox Code Playgroud)
我尝试检查是否有任何进程正在使用挂载点,但事实并非如此。
解决此问题的任何其他替代方法?
作为澄清:
max*_*zig 14
如果服务器具有该客户端的一些陈旧导出条目mount -t nfs,Stale file handle则A失败。
示例场景:当服务器重新启动而客户端未先卸载 nfs 卷时,可能会发生这种情况。当服务器返回并且客户端然后卸载并尝试安装 nfs 卷时,服务器可能会响应:
mount.nfs: Stale file handle
Run Code Online (Sandbox Code Playgroud)
您可以通过查看/proc/fs/nfs/exports或来检查这一点/proc/fs/nfsd/exports。如果有客户端的条目,它可能是一个陈旧的条目。
您可以通过显式取消导出并重新导出服务器上的相关导出来解决此问题。例如,要对所有导出执行此操作:
# exportfs -ua
# cat /proc/fs/nfs/exports
# exportfs -a
Run Code Online (Sandbox Code Playgroud)
在此之后,客户的mount -t nfs ...应该成功。
请注意,mount yieldingESTALE与其他一些系统调用(如 open/readdir/unlink/chdir ...)完全不同,返回ESTALE. 它是过时的导出与过时的文件句柄。NFS 很容易出现陈旧的文件句柄(例如,客户端有一个文件句柄,但该文件在服务器上被删除了)。
错误 ESTALE 最初是为了处理文件句柄(NFS 用于唯一标识服务器上的文件)不再指服务器上的有效文件的情况而引入的。当服务器上的应用程序、访问服务器的其他客户端,或者有时甚至是来自同一客户端的另一个挂载的文件系统在服务器上删除文件时,就会发生这种情况。当文件驻留在不再导出的文件系统上时,NFS 服务器也会返回此错误。此外,某些 NFS 服务器甚至会在重命名文件时更改文件句柄,尽管不鼓励这种做法。
即使在服务器上重新创建具有相同名称的文件或目录而客户端不知道,也会发生此错误。文件句柄是指文件的特定实例,删除文件然后重新创建它会创建文件的新实例。
当使用缓存的目录信息将路径名转换为 dentry/inode 对时,通常会出现错误 ESTALE。当后续操作发送到 NFS 服务器时,发现该信息已过期或陈旧。当使用缓存信息将路径名转换为 dentry/inode 对时,在 stat(2) 等系统调用中很容易发生这种情况,但随后对服务器的 GETATTR 调用发现文件句柄不再有效。
当在查找要查找的路径名的不同组件之间或在成功查找和后续操作之间对服务器进行更改时,也会发生此错误。
关于 ESTALE 的原始链接:ESTALE LWN。
我建议您检查 NFS 服务器上的文件和目录,或者告诉 NFS 服务器的管理员来执行此操作。
也许 NFS 服务器上存在一些旧的 pagecache、inode、dentry 缓存条目。请清洁它:
# 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
Run Code Online (Sandbox Code Playgroud)