不久前,我注意到当文件保存到 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。
摘自接受的答案
展品#2inotify 需要内核的支持才能工作。当应用程序跟踪目录时,它会要求内核在发生这些更改时通知它。当更改发生时,除了将这些更改写入磁盘之外,内核还会通知监视进程。
在远程 NFS 机器上,更改对内核不可见;它完全是远程发生的。 NFS 早于 inotify,并且 NFS 或任何类似的东西都没有网络级别的支持。
如果您查看,请进行更多研究inotify常见问题解答
问:我可以观看 sysfs(procfs、nfs...)吗?
简单地说:是的,但有一些限制。这些限制因内核版本而异,并且往往会变得更小。请阅读有关特定文件系统的信息。
那么支持吗?
我认为最终您遇到的是 NFS 不提供与本地安装的文件系统相同的功能。
例如从一个Linux线程nfs:
- CIFS 具有内置通知功能(机会锁)
- NFS 提供“租约”通知
这里的要点是,诸如 CIFS 和 NFS 之类的备用文件系统提供了非常基本的(如果有的话)直接支持 inotify。
NFS v4 状态
NFS 版本 4 为客户端提供建立或重新建立状态的协议,并将后续服务器有状态操作的所有权与先前建立的状态相关联。要解决客户端缺失的问题,NFS 版本 4 客户端必须在服务器指定的租用时间内定期刷新状态。租约超时后,服务器可以释放客户端的资源并将其提供给其他应用程序。
- 客户端通过发出 getattr 操作来获取服务器指定的租用超时属性。 getattr 不是有状态操作,因此不需要建立先前的状态。 getattr 操作可以先于 setclientid 或 setclientid_confirm 操作。
- 请参阅 NFS 服务器的租用时间站点属性来设置和调整租用时间段。 *