我最近使用inotify创建了一个Dropbox系统,用于查看在特定目录中创建的文件。我正在观看的目录是从NFS服务器挂载的,而inotify的行为与我预期的不同。考虑以下场景:在机器A上运行inotify脚本,观察/ some / nfs / dir / also / visible / to / B.
- 使用机器A在/ some / nfs / dir / also / visible / to / B中创建文件,脚本按预期运行。使用机器B执行相同的操作,不会通知脚本有关目录中丢弃的新文件 - 当脚本在NFS服务器上运行时,它会在从机器A和机器B创建文件时得到通知。
这是我用来访问inotofy的软件包中的错误,还是这种预期的行为?
此致
安德鲁
答案 0 :(得分:64)
inotify需要内核支持才能工作。当应用程序跟踪目录时,它会要求内核在发生这些更改时通知它。发生更改时,除了将这些更改写入磁盘外,内核还会通知观察过程。
在远程NFS计算机上,内核看不到更改;它完全是远程发生的。 NFS早于inotify,并且在NFS中没有网络级别支持,或任何等效的。
如果您想解决这个问题,您可以在存储服务器上运行服务(因为该内核将始终看到对文件系统的更改),该代理会对远程计算机的请求进行inotify,并将数据转发到远程客户端。
编辑:对于我来说,NFS因缺乏对inotify的支持而应该受到指责,这似乎很奇怪。
网络文件系统(NFS)是一种分布式文件系统协议,最初由 Sun Microsystems于1984年开发,wikipedia article
但是:
Inotify(inode notify)是一个 Linux内核子系统,用于扩展文件系统以注意对文件系统的更改。 [...]它已经从2.6.13版本(6月18日, 2005 )[...]中包含在主线Linux内核中。 wikipedia article
很难期望便携式网络协议/应用程序能够支持为不同操作系统开发的特定内核功能,并且在二十多年后出现。即使 包含扩展程序,它们也不会在其他操作系统上可用或有用。
*在所有情况下强调我的
另一个问题;让我们假设我们根本不使用网络,而是一个具有良好inotify支持的本地文件系统:ext3(假设它挂载在/mnt/foo
)。但是,不是真正的磁盘,文件系统是从环回设备安装的;然后可以在vfs中的其他位置访问基础文件(例如,/var/images/foo.img
)。
现在,您不应该修改已安装的ext3文件系统,但如果更改是文件内容而不是元数据,那么这样做仍然相当安全。
因此,假设一个聪明的用户在十六进制编辑器中修改文件系统映像(/var/images/foo.img
),用一些其他数据替换文件的内容,同时inotify监视正在观察挂载的同一文件文件系统。
没有合理的方法可以安排inotify始终通知观看过程中的这种变化。虽然可能会有一些旋转可以采取ext3通知并尊重更改,但这些都不适用于xfs drtiver,否则非常相似。
也不应该。你是在作弊! inotify只能告知您在观察的实际挂载点上通过vfs发生的更改。如果更改发生在VFS之外,由于对基础数据的更改,inotify无法帮助您,也不能解决该问题。
您是否考虑过使用邮件队列进行网络通知?
答案 1 :(得分:6)
答案 2 :(得分:2)
对于那些在Docker上为什么绑定安装为何无法检测到主机目录中文件更改(用于应用程序的热重载)的答案的人中寻找答案,这是因为文件传播在主机与容器未与容器内核通信。
仅将容器本身的更改传达给内核。解决方案是让实时重新加载实用程序打开“轮询模式”,而不要使用fsnotify。
答案 3 :(得分:0)
我同意SingleNegationElimination的解释,并希望补充说iSCSI目标可以正常工作,因为它们会提醒内核。
所以"真实"文件系统(相对于系统,即)将触发Inotify以发出警报。像Rsync一样,将某些内容捕获到已安装的分区中。
如果您必须通过inotify获取通知(或必须使用inotify),您可以将rsync -avz作为cron到文件系统。当然,缺点是您使用的是真正的系统硬盘空间。
答案 4 :(得分:0)
我第二次@SingleNegationElimination。
此外,您可以尝试notify-forwarder。
如果您使用无业游民,请使用vagrant-notify-forwarder。