用NFS进行inotify

时间:2010-11-20 04:34:32

标签: nfs inotify

我最近使用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的软件包中的错误,还是这种预期的行为?

此致

安德鲁

5 个答案:

答案 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)

我找到了一个使用supervisor守护程序监视文件修改的SGI FAM。它支持NFS,您可以在wiki

上看到一些说明

答案 2 :(得分:2)

对于那些在Docker上为什么绑定安装为何无法检测到主机目录中文件更改(用于应用程序的热重载)的答案的人中寻找答案,这是因为文件传播在主机与容器未与容器内核通信。

仅将容器本身的更改传达给内核。解决方案是让实时重新加载实用程序打开“轮询模式”,而不要使用fsnotify。

答案 3 :(得分:0)

我同意SingleNegationElimination的解释,并希望补充说iSCSI目标可以正常工作,因为它们会提醒内核。

所以"真实"文件系统(相对于系统,即)将触发Inotify以发出警报。像Rsync一样,将某些内容捕获到已安装的分区中。

如果您必须通过inotify获取通知(或必须使用inotify),您可以将rsync -avz作为cron到文件系统。当然,缺点是您使用的是真正的系统硬盘空间。

答案 4 :(得分:0)

我第二次@SingleNegationElimination。

此外,您可以尝试notify-forwarder

  • 机器A监视本地inotify事件,然后将它们转发到机器B(通过UDP)。
  • 机器B无法(无法?)重播事件,但是会为更改后的文件触发ATTRIB事件。

如果您使用无业游民,请使用vagrant-notify-forwarder