我有一个运行 Raspbian 9 的文件服务器,并使用 Unison over SSH 在这两者之间同步我的主目录。
这在我使用 Ubuntu 18.04 的两年中一直运行良好,但在升级到 Ubuntu 20.04 后,通过 SSH 的同步因解组错误而中止,声称两个 Unison 版本(本地和远程)是使用不同的 OCaml 版本构建的。
所有涉及的系统(升级前和升级后)上的 Unison 版本均为 2.48。
是什么赋予了?
答案1
原因
通过网络使用 Unison 可以大大加快整个网络的同步速度(因为文件是在本地而不是通过网络扫描文件的更改),但它需要两端匹配 Unison 版本。由于 Unison 依赖于一些 OCaml 库来进行同步,并且这些库显然不能保证跨 OCaml 版本稳定,因此两端不仅需要运行相同的 Unison 版本,而且还需要运行使用相同 OCaml 构建的相同 Unison 版本版本。 (是的,这很糟糕,Unison 项目在这方面有多个问题:第375章关于协议依赖于用于构建的 OCaml 版本;目前正在开发中,但从 Unison 2.51.3 开始仍然开放。#407是关于有线协议随每个版本而变化的假设。)
据我所知,Raspbian 9 (Stretch) 附带 OCaml 4.02,Ubuntu 18.04 附带 OCaml 4.05,Ubuntu 20.04 附带 OCaml 4.08。据推测,Unison 是在该平台的默认 OCaml 版本上构建的,但 2.48 尚未告诉我们这一点(后续版本报告其 OCaml 版本)。虽然显然 4.05 恰好与 4.02 兼容,但 4.08 似乎引入了破坏兼容性的更改。
Unison 项目提供了一些来自 CI 的二进制文件,更高版本允许在不同的 OCaml 版本之间进行选择。不幸的是,这不适用于该armhf
架构,也不适用于 Unison 2.48,因此这在这里没有帮助。
短期解决方案(立即可用)
目前,将 Ubuntu 机器上的 Unison 降级到 18.04 附带的版本对我来说是有效的。 (除了 libc 的最低版本之外,该包具有最小的依赖性。)
抓住unison-gtk_2.48.4-1ubuntu1_amd64
从 Ubuntu 存储库(这是 18.04 附带的版本;20.04 有unison-gtk_2.48.4-4ubuntu1_amd64
),并使用以下命令安装它:
sudo dpkg -i ~/Downloads/unison-gtk_2.48.4-1ubuntu1_amd64.deb
为了防止更新程序在下次运行时撤消您的更改,请将包置于保留状态:
sudo apt-mark hold unison-gtk
(如果您决定将来升级,重新运行此命令unhold
将撤消此操作,从而允许再次升级软件包。)
您可能必须删除两端的Unison~/.unison/ar*
缓存。~/.unison/fp*
现在,Unison 将再次工作。
中短期解决方案(~2021 年中期)
即将推出的 Debian 11 (Bullseye) 包括 Unison 2.51。接下来的方法是将文件服务器更新到 Debian 11 和 Unison 2.51,并且对于任何工作站,从 Unison 的 CI 获取二进制版本,以及匹配的程序和 OCaml 版本。考虑到 Debian 之前的发布周期,Bullseye 在 2021 年初/中期的某个时间发布有点现实。
中长期解决方案(2022-2023)
据我了解相应的问题,从有线协议中删除 OCaml 版本依赖项指日可待。那么,要走的路就是在两端都有匹配的 Unison 版本(前提是它是一个消除了依赖性的版本)。不过,您最喜欢的发行版在发布后可能需要一段时间才能搭载这样的版本 - 我们可能谈论的是 2022 年 4 月到 2023 年中期之间的某个时间。
长期解决方案
Unison 团队还致力于将有线协议版本号与程序版本分开分配,因此只要协议确实没有更改,多个版本最终将共享相同版本的有线协议。一旦发生这种情况,即使是不同的 Unison 版本也可以一起工作,只要两者使用相同的协议版本。