为什么 inotify 事件在 NFS 挂载上不同?

为什么 inotify 事件在 NFS 挂载上不同?

不久前,我注意到当文件保存到 NFS 挂载与本地文件系统时,inotify 报告的事件是不同的。

底层VFS不应该提供文件操作的统一视图吗?

以下是Debian 7.1(Linux 3.2)下VIM保存文件的轨迹

在 NFS 挂载上:

wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2048 (IN_MOVE_SELF)
wd=1 mask = 4 (IN_ATTRIB)
wd=1 mask = 1024 (IN_DELETE_SELF)
wd=1 mask = 32768 )

在本地文件系统上

wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 8 (IN_CLOSE_WRITE)
wd=1 mask = 4 (IN_ATTRIB)

使用 EMACS 保存文件也会显示不同的行为

在 NFS 挂载上:

wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2048 (IN_MOVE_SELF)

在本地文件系统上:

wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 16 (IN_CLOSE_NOWRITE)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 32 (IN_OPEN)
wd=1 mask = 2 (IN_MODIFY)
wd=1 mask = 8 (IN_CLOSE_WRITE)

这些测试是用inotify-touch.c

答案1

inotify NFS 支持吗?

环顾网络,inotify 可能支持 NFS,但支持方式非常有限。

展品#1

其原因在 StackOverflow 问答中进行了解释,标题为:使用 NFS 进行 inotify

摘自接受的答案

inotify 需要内核的支持才能工作。当应用程序跟踪目录时,它会要求内核在发生这些更改时通知它。当更改发生时,除了将这些更改写入磁盘之外,内核还会通知监视进程。

在远程 NFS 机器上,更改对内核不可见;它完全是远程发生的。 NFS 早于 inotify,并且 NFS 或任何类似的东西都没有网络级别的支持。

展品#2

如果您查看,请进行更多研究inotify常见问题解答

问:我可以观看 sysfs(procfs、nfs...)吗?

简单地说:是的,但有一些限制。这些限制因内核版本而异,并且往往会变得更小。请阅读有关特定文件系统的信息。

那么支持吗?

我认为最终您遇到的是 NFS 不提供与本地安装的文件系统相同的功能。

例如从一个Linux线程nfs:

  • CIFS 具有内置通知功能(机会锁)
  • NFS 提供“租约”通知

这里的要点是,诸如 CIFS 和 NFS 之类的备用文件系统提供了非常基本的(如果有的话)直接支持 inotify。

NFS v4 状态

摘自IBM 关于 NFS v4 状态的文章

NFS 版本 4 为客户端提供建立或重新建立状态的协议,并将后续服务器有状态操作的所有权与先前建立的状态相关联。要解决客户端缺失的问题,NFS 版本 4 客户端必须在服务器指定的租用时间内定期刷新状态。租约超时后,服务器可以释放客户端的资源并将其提供给其他应用程序。

  • 客户端通过发出 getattr 操作来获取服务器指定的租用超时属性。 getattr 不是有状态操作,因此不需要建立先前的状态。 getattr 操作可以先于 setclientid 或 setclientid_confirm 操作。
  • 请参阅 NFS 服务器的租用时间站点属性来设置和调整租用时间段。 *

相关内容