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


10

前一段时间,我注意到将文件保存到NFS挂载和本地文件系统时,由inotify报告的事件有所不同。

基础VFS是否不应该提供文件操作的统一视图?

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

在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运行的

Answers:


4

是否支持NFS?

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

展览#1

原因在此StackOverflow问答中得到了解释,标题为:inotify with NFS

摘录自已接受的答案

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

在远程NFS机器上,更改对内核不可见;因此,对内核而言,更改不可见。它完全是远程发生的。NFS早于inotify,并且NFS或任何等效版本都没有网络级别的支持。

展览#2

如果您查看inotify FAQ,请进行更多研究

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

简单地说:是的,但有一些限制。这些限制在内核版本之间有所不同,并且会变得越来越小。请阅读有关特定文件系统的信息。

这样支持吗?

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

例如nfs linux线程

  • CIFS具有内置的通知功能(操作锁定)
  • NFS提供“租约”以进行通知

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

NFS v4状态

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

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

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

3
OP似乎在NFS上看到事件,它们与在本地文件系统上看到的事件只是不同。链接的问题和答案似乎表明inotifyNFS上没有事件。
iruvar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.