Vagrant,共享文件夹:利用 inotify over NFS

Posted

技术标签:

【中文标题】Vagrant,共享文件夹:利用 inotify over NFS【英文标题】:Vagrant, shared folder: take advantage of inotify over NFS 【发布时间】:2014-02-07 01:26:26 【问题描述】:

我们的 Symfony2 webapp 在开发模式下使用 Assetic watcher 随时重新编译资产。

webapp 在 Docker 容器中运行,该容器在 Vagrant VM(Ubuntu 12.04 Precise)中运行。 主机是 OSX 10.9 Mavericks,它通过 NFS (v3) 共享与 VM 共享代码文件夹,并且代码通过 Docker 中的主机/访客卷安装在容器中。

由于 inotify 似乎无法检测 NFSv3 上的文件修改,因此观察程序在轮询模式下工作,这可能非常慢(检测修改大约需要 1/2 分钟)。

我读到 NFSv4 符合 inotify,但我没有找到任何好的资源。

有没有办法让 NFS/inotify 一起工作?

【问题讨论】:

【参考方案1】:

这是一个旨在解决此问题的插件:https://github.com/mhallin/vagrant-notify-forwarder

只需安装它并重新加载您的盒子即可将 inotify 通知转发到您的访客机器:

vagrant plugin install vagrant-notify-forwarder

【讨论】:

【参考方案2】:

您可能对这个名为 Guard 的工具感兴趣,它会侦听主机操作系统上所做的文件更改,然后在 Guest 上拉取并更新这些更改。这对我有用,现在我的资产几乎可以立即更新。

https://serverfault.com/questions/453826/vagrant-shared-folder-and-file-change-events

【讨论】:

【参考方案3】:

很遗憾,inotify 不能在 NFS 上工作。 inotify 通过将自身挂接到内核中的 VFS(虚拟文件系统)层来工作。每当发生修改时,inotify 都会知道,因为修改发生在同一台机器上,因此发生在同一个内核中——这使得整个事情成为可能。

使用 NFS,修改发生在服务器上,而通知预计会出现在客户端上。但是 NFS 不会在进行更改时通知客户端。否则,它不会扩展。 NFS 的设计(和操作)在单个服务器上拥有数千个客户端。想象一下,如果您做了一个微小的更改,服务器必须将其推送给所有客户端!

当然,您可以说“嘿,NFS 协议中应该有订阅机制,以便客户端可以告诉服务器他们想知道特定位置发生的变化”。嗯,NFS 是 30 年前设计的,所以请原谅他们没有包括这个订阅/通知系统 :-)

我不熟悉 Assetic,但也许您可以使用自定义脚本手动监视更改,并在每次检测到更改时重新编译资产。只需遍历包含资产源的目录,跟踪关联数组中每个文件的 mtime,每次检测到新文件(或新 mtime)时,重新编译。轰隆隆!

另见this other SO question about inotify and NFS。

【讨论】:

感谢您的详细解答。我们已经有了一个带有 Assetic 的轮询脚本,我在最初的问题中提到它是“观察者”,但它实际上非常慢(大约 1/2 分钟来检测变化)。

以上是关于Vagrant,共享文件夹:利用 inotify over NFS的主要内容,如果未能解决你的问题,请参考以下文章

Vagrant 共享文件夹适用于工作目录,但仅此而已

Vagrant 共享和同步文件夹

Vagrant 无法挂载 VirtualBox 共享文件夹

在 Vagrant 下启用 SMB 文件共享

Vagrant 共享/同步文件夹权限

vagrant虚拟机共享目录加速