使用 Unison 进行文件同步

作者:Erik Inge Bolso

Unison 是一款文件同步工具,可在 Linux、UNIX 和 Microsoft Windows 上运行。 你们中那些使用过 IBM Lotus Notes 或 Intellisync Mobile Suite 的人可能对同步的用途有所了解,与 rsync 等单向镜像选项相比。 例如,您可能已将公司文档目录镜像到您的笔记本电脑,然后修改了一两个文档。 当您返回时,其他人可能已经修改了同一目录中的其他文档。 使用 rsync,您需要手动协调两个目录之间的差异,否则可能会覆盖他人的更改。 Unison 可以找出哪些地方发生了更改,传播已更改的文件,甚至在您告知其方法的情况下合并对同一文件的不同更改。

可以将 Unison 视为双向 rsync,并混合了一些版本控制功能。 最常见的用途是保持本地和远程主目录,或您经常在不同上下文中使用的某些数据目录同步。 它使用 rsync 算法来减少网络流量,并且应该通过 SSH 隧道在不受信任的网络上进行传输。 无需额外的工作——只需在添加目录位置时指定 ssh:// 即可。 然而,Unison 通常需要相当多的额外磁盘空间,因为同步器需要跟踪上次运行时文件的外观。

获取、编译和安装 Unison

Unison 的主页由宾夕法尼亚大学维护; 项目负责人 Benjamin C. Pierce 是计算机与信息科学系的教授。 请参阅在线资源以获取 URL。

Unison 不像 rsync 那样被广泛部署,因此您可能无法为您的发行版找到预编译的软件包。 但是从 Unison 主页下载的二进制文件应该适用于大多数人。

如果您想从源代码编译,您可以这样做。 但是,必须跳过一些额外的步骤,因为 Unison 是用 OCaml 编程的,而不是最常用的语言。 如果您的发行版没有方便的软件包,请参阅资源。

编译和安装 Unison 很简单; 输入make UISTYLE=xxx。 GTK 用户界面需要额外的 OCaml 绑定才能用于 GTK,因此我在本文中使用文本界面。 输入make UISTYLE=textmake UISTYLE=gtk应该会为您提供一个 Unison 可执行文件。 只需将可执行文件复制到您要同步的两台机器的路径中的某个位置即可。

在本文中,我使用的是 Unison 当前的稳定版本 2.9.1,除非另有说明。 如果您要同步大于 2GB 的文件,则需要使用最新的 beta 版本。

开发人员版本往往运行良好。 它们是开发人员自己在他们宝贵的数据上运行的版本。 如果您感觉有点冒险精神,请注册 unison-hackers 邮件列表。 Jerome Vouillon、Benjamin C. Pierce 和 Trevor Jim 倾向于在那里讨论改进。 提交日志也会飘过,因此您可以跟踪正在发生的事情。

配置和使用 Unison

Unison 将其配置和工作文件保存在您主目录或您想要放置它的任何位置的 .unison 目录中。 设置 UNISON 环境变量以指定备用位置。

默认配置存储在 .unison/default.prf 中。 列表 1 显示了一个适用于测试的纯文本配置文件。 现在同步两个目录就像

$ unison /nfsmount/dir1 /home/me/dir1

列表 1. .unison/default.prf

# Unison preferences file
merge = diff3 -m CURRENT1 OLD CURRENT2 > NEW
backup = Name *
maxbackups = 10
log = true
logfile = /home/knan/.unison/unison.log
rshargs = -C

Unison 然后会询问用户目录之间的任何差异,并提供合理的默认值。 然而,习惯 Unison 的思维方式确实需要一些时间。 而且,Unison 不能替代备份。 例如,Unison 愉快地将一个副本中所有文件的删除操作传播回去,这对于习惯于 CVS 的程序员来说可能是一个粗鲁的觉醒。 例如

rm dir1/* ; unison ssh://server/dir1 dir1

与您期望的

rm dir1/*; cvs update dir1

删除文件是在同步时在另一端复制的操作。 因此,此示例命令删除了 dir1 中两侧的所有文件。

一旦您感到舒适,请考虑添加auto = true到 Unison 配置文件。 这会跳过关于任何非冲突更改的问题,但让您有机会在最后退出。

建议阅读 Unison 手册。 它清晰且书写良好,并解释了大多数极端情况下会发生什么。

保持主目录同步

一旦用户熟悉了 Unison,一个常见的想法是使用它来保持机器之间(例如,您的笔记本电脑和台式机)的主目录同步。 这可以很容易地实现。 列表 2 有一个简单的配置文件可以完成这项工作,但您可能想要扩展它。 例如,列表 2 忽略了 MP3 文件和 Unison 自己的文件,并演示了include用于将通用设置应用于所有配置文件。

列表 2. .unison/home.prf

# Unison preferences file
root = /home/erik
root = ssh://remotehost/home/erik
# exactly two or none "root" lines
ignore = Name *.mp3
# ignore all .mp3 files anywhere
ignore = Path .unison
# ignore all files with .unison somewhere in their full path
include default
# imports settings from default.prf

像这样测试我们的新配置文件

$ unison home -testserver

并像这样调用它

$ unison home -batch
$ unison home

-batch 运行处理简单的情况而无需询问,根据需要进行备份和日志记录,第二次运行会询问您任何棘手的事情——例如合并。

Theroot =如果您想在命令行上指定要同步的文件,则可以省略行。 这些行等效于此调用

$ unison home /home/erik ssh://remotehost/home/erik
合并冲突的更改

为了进行三向合并,必须启用备份。 默认情况下,在禁用备份的情况下,Unison 仅保留校验和和元数据(例如权限),因此它没有未修改的文件可供参考。

在 Unison 2.9.1 版本中,如果您为冲突选择合并并且合并成功而无需手动干预,则更改会立即传播,这不会给您退出的机会。 因此,如果您有空间,我建议将 maxbackups 保留为 5 左右,而不是默认的 2,以便您有机会从自动误合并中恢复。 合并后备份目录的内容如下所示

$ ls -1 .unison/backup/
shared.txt		merged version ("NEW")
shared.txt.1.unibck	changed remotely ("CURRENT2")
shared.txt.2.unibck	changed locally ("CURRENT1")
shared.txt.3.unibck	old version ("OLD")

截至撰写本文时的最新 beta 版本 2.10.3,Unison 可以为不同的文件调用不同的合并程序。 例如,您可能希望使用 3DM 合并 XML 文件,或使用数据库合并工具合并 Berkeley 数据库。 此功能仍然是新的,并且可能会发生变化。 项目负责人指出,合并功能需要重写,并且在 2.9.1 和 2.9.20 中效果不佳。 因此,如果您打算进行大量合并,最好跟踪前沿版本。

本文资源: /article/8059

Erik Inge Bolsø 是一位 UNIX 顾问和佩剑击剑手,居住在挪威的莫尔德,自 1996 年以来一直运行 Linux。 他的另一个爱好可以通过 Google 搜索“balrog genealogy”找到,您可以通过 ljcomment@tvilsom.org 与他联系。

加载 Disqus 评论