NFS 挂载可能被内核卸载

NFS 挂载可能被内核卸载

最近在几台机器上,挂载点开始消失(每台服务器一个挂载点,随机间隔和随机机器),我在日志中找不到任何内容。我有五个挂载点,其中任何一个都会随机消失。消失和挂载点协议没有关系(TCP和UDP挂载都会消失)。

我没有尝试过什么
连续运行 tcp dump(我不愿意这样做,因为这个问题每 2-3 天发生一次......)

有关机器的信息
NFS启动,启动服务器是FreeBSD 11.0。 (顺便说一句,其日志中没有任何内容)rootfs 选项是:
(rw,noatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,nolock,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=ADDRESS,mountvers=3,mountport=677,mountproto=udp,local_lock=all,addr=ADDRESS)
操作系统是 CentOs7,运行 4.11.0-1 ML 内核。安装选项示例:
rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=ADDRESS,mountvers=3,mountport=4002,mountproto=udp,local_lock=none,addr=ADDRESS) (rw,relatime,vers=3,rsize=32768,wsize=32768,namlen=255,hard,proto=udp,timeo=11,retrans=3,sec=sys,mountaddr=ADDRESS,mountvers=3,mountport=4002,mountproto=udp,local_lock=none,addr=ADDRESS,_netdev)
有关 NFS 共享和服务器的信息
我总共有 5 个不同的 NFS 服务器,负载平衡是通过 DNS 完成的,所有服务器都导出相同的挂载点(一些共享 UDP,一些共享 TCP)。运行NFS服务器的服务器是RHEL 6.7(Santiago),内核版本2.6.32-573.el6,snfs-common/server/client是4.7.3。正如您在服务器日志中也猜不到与此问题相关的任何内容。导出选项示例:
(rw,async,root_squash,no_wdelay,no_subtree_check,fsid=ID)
到目前为止我尝试过的事情:
我的第一个假设是,我有一个进程在随机 NFS 共享上由于某些奇怪的原因调用 umount 或 umount2,在使用 sysdig 跟踪 unlinkat、unlink、unmount 和 remove 系统调用后,我只能看到 systemd-logind 在用户会话被破坏时执行 unmount2,但在挂载点上没有。我在凿子中使用的 sysdig 过滤器发布如下:
function on_init() local filename = path for i in string.gmatch(path, "[^/]+") do filename = i end print("PID\tPROC_NAME\tPROC_EXEC\tPROC_SID\tPROC_PNAME\tPROC_PPID\tPROC_EXELINE\tPROC_PCMDLINE") chisel.set_event_formatter("%proc.pid\t%proc.name\t%proc.exec\t%proc.sid\t%proc.pname\t%proc.ppid\t%proc.exeline\t%proc.pcmdline ") chisel.set_filter( "(evt.type=unlinkat and evt.arg.name=" .. path .. ") or \ (evt.type=unlink and evt.arg.path=" .. path .. ") or \ (evt.type=umount) or \ (evt.type=remove and evt.arg.path=" .. path .. ")") return true end
卸载再次随机发生,但过滤器无法看到。我认为过滤器有缺陷,我创建了一个程序,它使用和卸载共享umountumount2尝试了 lazy 和 force umount 标志),过滤器正确检测到它们,所以这让我相信内核正在卸载东西。
我的日志中没有任何内容,甚至没有共享出现问题时常见的“nfs 没有响应”消息。
如果我登录一台机器并重新安装,重新安装会成功,没有任何问题。
我有许多客户端从相同的设置运行,但这种情况不会发生。这组机器唯一的共同点是它们的网络段和 NFS 启动服务器。但我不明白为什么如果服务器和客户端之间的通信中断,却没有任何报告。

答案1

如果有人关心的话,这是内核中的 NFS 错误。应该通过提交修复cc89684c9a265828ce061037f1f79f4a68ccd3f7

NFS:仅使明显无效的 dentry 无效

自从 v3.18 中提交 bafc9b754f75(“vfs:在 d_invalidate 中进行更精确的测试”)以来,从 ->d_revalidate() 返回“0”将导致 dentry 无效,即使它已经安装了文件系统。后裔。已挂载的文件系统已卸载。

...

相关内容