Unison 和扩展文件属性

Unison 和扩展文件属性

我有两台机器,一台 Debian,一台 Ubuntu,两台机器都在 ext4 上,并在 fstab 中启用了扩展文件属性。 getfattr 和 setfattr 已在本地两台机器上安装并完美运行。但是,unison(版本 2.40.102)默认情况下不同步扩展文件属性。

我用谷歌搜索发现包含应该启用扩展属性同步的配置文件设置的博客文章。所以,我改变了我的个人资料,现在看起来像这样:

root=/path/to/dir
root=ssh://[email protected]//path/to/dir2
auto=true
batch=true
perms=0
rsync=true
maxthreads=1
retry=3
confirmbigdeletes=false
copythreshold=0
copyprog = rsync -aX --rsh='ssh -p 22' --inplace --compress
copyprogrest = rsync -aX --rsh='ssh -p 22' --partial --inplace --compress
copyquoterem = true
copymax = 1

此配置文件同步新文件的扩展属性,但是当我更改已同步的文件上的扩展属性并一致执行时,我得到:

Nothing to do: replicas have not changed since last sync.

其他一切都完美同步,但一致不知道扩展属性的变化。我还尝试禁用 fastcheck,希望它能够更详细地检查文件;没用。我尝试朝一个方向进行 rsync,效果非常好。但我需要双向同步,所以我只能保持一致。

我浏览了官方手册,但它只是顺便提到了扩展文件属性。所以我的问题是:这可以一致完成吗?我在这里缺少一些简单的东西吗?或者,是否有其他开源工具可以实现这一目标? (我知道 bsync 和 bitpocket,但在我的初步测试中,它们也没有注意到扩展文件属性的更改)。

答案1

如果将来有人遇到与我相同的问题 - unison 不适用于扩展文件属性。解决这个问题的一种方法是 copyprog + copythreshold=0 hack(请参阅原始问题中的配置文件),但这并不能解决一致没有注意到 xattr 的变化的问题。正如我在评论之一中提到的,即使更改文件的修改时间也不会一致同步修改的 xattr。不仅如此,甚至还会擦除下次该文件的内容发生更改时。

我可以使用扩展文件属性进行双向同步的唯一方法是使用同步,通过向 rsync 参数添加 -X 标志并更改文件的修改时间来更改它。

这远非理想的解决方案:更改文件的修改时间、没有 Windows 支持、Python 3 依赖、上次提交是去年等,但这是我发现的唯一可以完成这项工作的软件。

答案2

这可能是您在手册中已经看到的内容,但是在自2.27以来的变化它说

Unison 有时可能无法传输文件,即使文件尚未更改,也会显示无用的消息“同步期间已更新目标”。这可能是由于程序改变了......文件的扩展属性而不改变其修改时间。目前还不清楚最好的解决办法是什么——这不是 Unison 的错,但它让 Unison 的行为令人费解——……

所以看起来 Unison 主要关注文件的修改时间而不是其他。我尝试的解决方法是在扩展属性更改后立即更新文件的修改时间,这将导致 Unison 注意到更改并同步文件。但这是否可行取决于您如何更改扩展属性。

我认为可以使用某些东西来inotifytools检测文件扩展属性的更改。您可以编写一个脚本,用于inotifytoos监视您希望 Unison 同步的所有文件,然后touch在检测到更改时监视该文件。

相关内容