gpt4 book ai didi

nfs - 使用 NFS 进行 inotify

转载 作者:行者123 更新时间:2023-12-03 05:48:16 27 4
gpt4 key购买 nike

我最近使用 inotify 创建了一个保管箱系统,监视在特定目录中创建的文件。我正在监视的目录是从 NFS 服务器挂载的,并且 inotify 的行为与我的预期不同。考虑以下场景,其中 inotify 脚本在计算机 A 上运行,监视/some/nfs/dir/also/visible/to/B。

- 使用计算机 A 在/some/nfs/dir/also/visible/to/B 中创建文件,脚本的行为符合预期。使用机器 B 执行相同的操作,脚本不会收到关于目录中删除了新文件的通知。
- 当脚本在 NFS 服务器上运行时,当从机器 A 和机器 B 创建文件时,它会收到通知。

这是我用来访问 inotofy 的包中的错误,还是这是预期的行为?

最佳答案

inotify 需要内核的支持才能工作。当应用程序跟踪目录时,它会要求内核在发生这些更改时通知它。当更改发生时,除了将这些更改写入磁盘之外,内核还会通知监视进程。

在远程 NFS 机器上,更改对内核不可见;它完全是远程发生的。 NFS 早于 inotify,并且 NFS 或任何类似的东西都没有网络级别的支持。

如果你想解决这个问题,你可以在存储服务器上运行一个服务(因为内核总是会看到文件系统的更改),该服务代理远程计算机的 inotify 请求,并将数据转发到远程客户端。

编辑:我觉得 NFS 很奇怪应该归咎于它缺乏对 inotify 的支持。

Network File System (NFS) is a distributed file system protocol originally developed by Sun Microsystems in 1984, wikipedia article

但是:

Inotify (inode notify) is a Linux kernel subsystem that acts to extend filesystems to notice changes to the filesystem. [...] It has been included in the mainline Linux kernel from release 2.6.13 (June 18, 2005 ) [...]. wikipedia article

很难指望可移植的网络协议(protocol)/应用程序能够支持为不同操作系统开发的特定内核功能,并且该功能在二十多年后出现。即使它确实包含其扩展,它们在其他操作系统上也不可用或无用。

*在所有情况下都强调我的

<小时/>

还有一个问题;假设我们根本不使用网络,而是使用具有良好 inotify 支持的本地文件系统:ext3(假设它安装在 /mnt/foo)。但文件系统不是真正的磁盘,而是从环回设备挂载的;并且底层文件又可以在 vfs 中的不同位置访问(例如,/var/images/foo.img)。

现在,您不应该修改已安装的 ext3 文件系统,但如果更改的是文件内容而不是元数据,那么这样做仍然相当安全。

因此,假设一个聪明的用户在十六进制编辑器中修改文件系统镜像(/var/images/foo.img),用一些其他数据替换文件的内容,同时inotify watch 正在观察已安装文件系统上的同一文件。

没有合理的方法可以安排 inotify 始终向观看进程通知此类更改。尽管可能需要进行一些调整才能使 ext3 注意到并遵守更改,但这些都不适用于 xfs drtiver,因为它们在其他方面非常相似。

也不应该。你在作弊! inotify 只能通知您通过正在监视的实际挂载点处的 vfs 发生的更改。如果更改发生在该 VFS 之外,则由于底层数据发生更改,inotify 无法为您提供帮助,也不是为了解决该问题而设计的。

您是否考虑过使用消息队列进行网络通知?

关于nfs - 使用 NFS 进行 inotify,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4231243/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com