用NFS进行inotify
我最近使用inotify创build了一个dropbox系统,观察在特定目录中创build的文件。 我正在看的目录是从NFS服务器挂载的,inotify的行为与我预期的不同。 考虑下面的情况,在机器A上运行inotify脚本,看/ some / nfs / dir / also / visible / to / B.
– 使用机器A在/ some / nfs / dir / also / visible / to / B中创build一个文件,该脚本按照预期运行。 使用机器B执行相同的操作,脚本不会收到关于在目录中丢弃的新文件的通知。
当脚本在NFS服务器上运行时,从机器A和机器B两者创build文件时都会收到通知。
这是我用来访问inotofy的包中的错误,还是这个预期的行为?
问候,
安德鲁
inotify需要内核的支持来工作。 当应用程序跟踪目录时,它会要求内核在发生这些更改时通知它。 当发生改变时,除了将这些改变写入磁盘之外,内核还通知观看过程。
在远程NFS机器上,更改对内核不可见; 它完全是远程发生的。 NFS早于版本化,在NFS中没有networking级别的支持,或者任何等同的东西。
如果你想解决这个问题,你可以在存储服务器上运行一个服务(因为这个内核总是会看到文件系统的变化),这个服务代理了对远程机器的请求,并把数据转发到远程客户端。
编辑:我觉得, NFS应该归咎于缺乏支持inotify。
networking文件系统(NFS)是一个分布式文件系统协议,最初由Sun Microsystems于1984年在 wikipedia文章中开发
然而:
Inotify(inode notify)是一个Linux内核子系统 ,用于扩展文件系统以注意对文件系统的更改。 它已经包含在2.6.13版本( 2005年 6月18 日 )[…]的主线Linux内核中。 维基百科的文章
很难期望便携式networking协议/应用程序能够支持针对不同操作系统开发的特定内核function,并且在二十多年后才出现。 即使它包含扩展名,也不能在其他操作系统上使用或使用。
*在所有情况下强调我的
另一个问题是 让我们假设我们根本不使用networking,而是一个具有良好inotify支持的本地文件系统:ext3(假设它挂载在/mnt/foo
)。 但是,而不是一个真正的磁盘,文件系统从一个回环设备挂载; 底层文件又可以在vfs的不同位置访问(比如/varhttp://img.dovov.comfoo.img
)。
现在,你不应该修改挂载的ext3文件系统,但如果更改是文件内容而不是元数据,那么这样做还是相当安全的。
因此,假设一个聪明的用户在一个hex编辑器中修改文件系统映像( /varhttp://img.dovov.comfoo.img
),用一些其他数据replace文件的内容,同时一个inotify监视器观察挂载的文件文件系统。
没有合理的方法可以安排总是通知观察过程这种变化。 虽然可能会有一些回旋可以让ext3注意到并尊重这种变化,但是这些都不适用于xfs drtiver,这在其他方面是非常相似的。
也不应该。 你在作弊! inotify只能通知您在正在监视的实际挂载点上通过vfs发生的更改。 如果更改发生在VFS之外,由于基础数据的更改,inotify不能帮助您,并不是为了解决该问题而devise的。
您是否考虑过使用消息队列进行networking通知?
我发现一个SGI FAM使用一个监督守护进程来监视文件修改。 它支持NFS,你可以在wiki上看到一些描述
我同意SingleNegationElimination的解释,并且想补充一点,iSCSI目标将起作用,因为它们警告内核。
所以在“真正的”文件系统上(相对于系统而言)会触发Inotify警报。 像Rsync'ing一样,将东西networking化为一个挂载的分区。
如果你必须通过inotify(或者必须使用inotify)来获取通知,你可以使用cron来将rsync -avz转换到文件系统。 缺点当然是你正在使用真正的系统硬盘空间。