某些目录上的“陈旧文件句柄”在 NFS 挂载后立即发生;没有文件句柄打开

i33*_*36_ 5 nfs

一段时间以来,我一直在遇到 NFS 的一个奇怪问题,其中一个看似随机的目录子集(总是相同的)在/NFS 挂载后立即显示为陈旧的文件句柄。

我已经能够通过显式导出看似随机的问题目录集来纠正问题,但我想看看我是否可以更彻底地修复问题,这样我就不必偶尔向导出表添加随机目录.

下面,我挂载了一个文件系统,显示没有打开的文件句柄 runls和 rerun lsof。为清晰起见,在命令之间添加了空行:

# mount -t nfs -o vers=4,noac,hard,intr 192.168.0.2:/ /nfs -vvv
mount.nfs: trying text-based options 'vers=4,noac,hard,intr,addr=192.168.0.2,clientaddr=192.168.0.4'
192.168.0.2:/ on /nfs type nfs (rw,vers=4,noac,hard,intr)

# lsof | grep /nfs

# ls -lh /nfs
ls: cannot access /nfs/usr: Stale file handle
ls: cannot access /nfs/root: Stale file handle
ls: cannot access /nfs/etc: Stale file handle
ls: cannot access /nfs/home: Stale file handle
lrwxrwxrwx   1 root root       7 Mar 27  2017 bin -> usr/bin
drwxr-xr-x   6 root root     16K Jan  1  1970 boot
drwxr-xr-x 438 i336 users    36K Feb 28 12:12 data
drwxr-xr-x   2 root root    4.0K Mar 14  2016 dev
d?????????   ? ?    ?          ?            ? etc
d?????????   ? ?    ?          ?            ? home
lrwxrwxrwx   1 root root       7 Mar 27  2017 lib -> usr/lib
lrwxrwxrwx   1 root root       7 Mar 27  2017 lib64 -> usr/lib
drwxr-xr-x  15 root root    4.0K Oct 15 15:51 mnt
drwxr-xr-x   2 root root    4.0K Aug  9  2017 nfs
drwxr-xr-x  14 root root    4.0K Jan 28 17:00 opt
dr-xr-xr-x   2 root root    4.0K Mar 14  2016 proc
d?????????   ? ?    ?          ?            ? root
drwxr-xr-x   2 root root    4.0K Mar 14  2016 run
lrwxrwxrwx   1 root root       7 Mar 27  2017 sbin -> usr/bin
drwxr-xr-x   6 root root    4.0K Jun 22  2016 srv
dr-xr-xr-x   2 root root    4.0K Mar 14  2016 sys
drwxrwxrwt   2 root root    4.0K Dec 10  2016 tmp
d?????????   ? ?    ?          ?            ? usr
drwxr-xr-x  15 root root    4.0K May 24  2017 var

# lsof | grep /nfs

#
Run Code Online (Sandbox Code Playgroud)

有问题的子目录不是挂载点;他们看起来完全正常:

$ ls -dlh /usr /root /etc /home
drwxr-xr-x 123 root root  12K Mar  3 13:34 /etc
drwxr-xr-x   7 root root 4.0K Jul 28  2017 /home
drwxrwxrwx  32 root root 4.0K Mar  3 13:55 /root
drwxr-xr-x  15 root root 4.0K Feb 24 17:48 /usr
Run Code Online (Sandbox Code Playgroud)

syslog 中没有关于这些目录的相关错误。唯一显示的信息提到了一组不同的目录:

... rpc.mountd[10080]: Cannot export /proc, possibly unsupported filesystem or fsid= required
... rpc.mountd[10080]: Cannot export /dev, possibly unsupported filesystem or fsid= required
... rpc.mountd[10080]: Cannot export /sys, possibly unsupported filesystem or fsid= required
... rpc.mountd[10080]: Cannot export /tmp, possibly unsupported filesystem or fsid= required
... rpc.mountd[10080]: Cannot export /run, possibly unsupported filesystem or fsid= required
Run Code Online (Sandbox Code Playgroud)

这是/etc/exports目前的样子:

/ *(rw,subtree_check,no_root_squash,nohide,crossmnt,fsid=0,sync)
Run Code Online (Sandbox Code Playgroud)

服务器端正在运行 Arch Linux,目前在内核 4.10.3 上。

客户端是带有内核 4.1.6 的 Slackware 14.1。

Mic*_*lan 0

exports对于 NFS 4,您的文件看起来不正常:

\n\n
/ *(rw,subtree_check,no_root_squash,nohide,crossmnt,fsid=0,sync)\n
Run Code Online (Sandbox Code Playgroud)\n\n

相反,我认为您需要遵循该行的Arch Linux 说明fsid=0。它声明了一个特殊的导出,\xe2\x80\x98,即所谓的 NFS 根目录。\xe2\x80\x99

\n\n

然后按照说明在后续行中声明您自己的导出。\n您可以导出服务器\xe2\x80\x99s 根文件系统 \xe2\x80\x94,以免与 NFS 根 \xe2\x80\x94\nas 混淆如这篇旧的 Gentoo 帖子所示。

\n