inotify 需要内核的支持才能工作。当应用程序跟踪目录时,它会要求内核在发生这些更改时通知它。当更改发生时,除了将这些更改写入磁盘之外,内核还会通知监视进程。
在远程 NFS 机器上,内核看不到更改;它完全发生在远程。NFS 早于 inotify 并且在 NFS 中没有网络级别的支持,或者任何等效的东西。
如果你想解决这个问题,你可以在存储服务器上运行一个服务(因为内核总是会看到对文件系统的更改),它代理对远程机器的请求,并将数据转发到远程客户端。
编辑:我觉得奇怪的是NFS应该因为它缺乏对 inotify 的支持而受到指责。
网络文件系统 (NFS) 是一种分布式文件系统协议,最初由Sun Microsystems 于 1984 年开发,维基百科文章
然而:
Inotify(inode notify)是一个Linux 内核子系统,用于扩展文件系统以通知文件系统的更改。[...] 从 2.6.13 版(2005 年 6 月 18日)开始,它已包含在主线 Linux 内核中[...]。维基百科文章
很难期望一个可移植的网络协议/应用程序支持为不同的操作系统开发的特定内核特性,并且这种特性在20 多年后才出现。即使它确实包含了它的扩展,它们在其他操作系统上也不可用或无用。
*在所有情况下都强调我的
另一个问题;假设我们根本不使用网络,而是使用具有良好 inotify 支持的本地文件系统:ext3(假设它安装在/mnt/foo
)。但是文件系统不是真正的磁盘,而是从环回设备安装的;并且底层文件又可以在 vfs 中的不同位置访问(例如,/var/images/foo.img
)。
现在,您不应该修改已挂载的 ext3 文件系统,但如果更改的是文件内容而不是元数据,那么这样做仍然是相当安全的。
因此,假设一个聪明的用户/var/images/foo.img
在十六进制编辑器中 修改了文件系统映像(
没有合理的方式可以安排 inotify 始终通知观看过程这种变化。尽管可能需要进行一些调整才能使 ext3 注意到并尊重更改,但这些都不适用于 xfs drtiver,否则它非常相似。
也不应该。你在作弊!。inotify 只能通知您在被监视的实际挂载点通过 vfs 发生的更改。如果更改发生在该 VFS 之外,由于基础数据发生更改,inotify 无法帮助您,也并非旨在解决该问题。
您是否考虑过使用消息队列进行网络通知?