Unison 和版本/编译器冲突

Unison 和版本/编译器冲突

我有两台机器,一台运行 Ubuntu 18.04,另一台运行 Ubuntu 20.04。我想使用 Unison 在它们之间同步文件,但存在一些问题。首先,因为我也与另一台机器同步,所以我从源 Unison 2.48.3 编译。然后在 Ubuntu 18.04 中,我从 Ubuntu 软件 Unison 2.48.4 安装了 Ubuntu 20.04。正确设置它们后,我从 Ubuntu 18.04 的命令行运行 unison-2.48.4-gtk 并尝试同步。尽管一切正常,即它找到了机器和目录,然后我收到消息: Fatal error during unmarshaling (input value:ill-formed message) possibly because client and serer have been compiled with different versions of OCaml compiler。在 20.04 中,我检查了 OCaml 的版本,但显然它没有返回任何内容(即使我已经从应用程序商店安装了 unison)。 18.04 的版本是 4.05.0。关于我能做什么有什么想法吗?

答案1

当您需要同步具有不同操作系统的多台计算机时,如果您不想每次 Unison 和/或 OCaml 更改某些内容时都从源代码进行编译,那么有一种干净的解决方案应该始终有效,并且可以快速安装 Unison。这样您就可以在所有 Linux 计算机、客户端和服务器上拥有完全相同的 Unison/OCaml 版本。这就是快照的用途。无论安装在哪个操作系统中,同一个快照都应该完全相同。在这种情况下,我们在软件中心提供了 unison-jz。它将安装针对 OCaml 4.02.3 编译的 Unison 2.51.2

如果snapd已经安装,就像在Ubuntu中一样,你只需要发出:

sudo snap install unison-jz

如果您想同步主目录之外的内容,您可能必须在开发人员模式下安装 unison-jz,以便它可以处理所需的权限。在这种情况下,您必须在终端中使用的行是:

sudo snap install --devmode unison-jz

要使 Unison 的快照版本正常工作,您还必须做两件事。那些是:

  1. 创建要用于同步文件的 Unison 配置文件后,请使用文本编辑器添加以下行

     servercmd = /snap/bin/unison-jz.unison -ui text
    

    到您的配置文件,位于 ~/snap/unison-jz/current/.unison/

    所有配置文件都使用扩展名 .prf

    这样,客户端计算机中的 unison 会调用服务器中的 snap'd 版本 (unison-jz),该版本具有相同的 Unison/OCaml 版本

  2. 显然,unison-jz 中包含的 ssh 版本不理解 ssh 配置文件中的术语“包含”,如果找到它就会出错。因此,您可能还需要编辑文件 /etc/ssh/ssh_config

    使用您选择的文本编辑器以管理员身份打开它。例如

     sudo nano /etc/ssh/ssh_config
    

    并注释掉第 19 行,如下所示

     Include /etc/ssh/ssh_config.d/*.conf
    

    它应该看起来像这样

     #Include /etc/ssh/ssh_config.d/*.conf
    

我认为这是处理这种情况的更简单的方法,因为从源代码构建通常是不可能的,因为在旧版本的 Ubuntu 中尝试编译新版本的 OCaml 或 Unison 时会出现依赖性问题。

更多信息:

http://www.xente.mundo-r.com/zasjls/other/20/unison_en.html

答案2

您正在混合 Unison 版本 2.48.3 和 2.48.4。 Unison 对此非常挑剔,因为开发人员甚至在次要版本之间也更改了 Unison 存档文件的格式。无论如何,Unison 的版本应该在您的所有机器之间匹配。我会跳过应用程序商店,并在 Ubuntu 计算机上手动编译/安装 2.48.3。

此外,您必须确保使用相同版本的 oCaml 在每台计算机上编译相同版本的 Unison ;)

答案3

解决这个问题的一个简单方法是使用 apt pinning,如Debian 的或者乌班图的文档,以将一致包保留在较新主机上以发布较旧系统。

要使 debian bullseye 使用 buster 的一致,请确保/etc/apt/sources.list包含两个版本的行,并将以下内容放入/etc/apt/preferences.d/unison

Package: unison
Pin: release n=bullseye
Pin-Priority: -10

Package: unison
Pin: release n=buster
Pin-Priority: 900

apt-get install unison/buster如果已安装,运行将降级该软件包。请注意软件包名称如何以斜线和发行版本作为后缀。

用焦点替换靶心,用仿生替换破坏者可能会起作用,但我还没有测试过。问答中版本名称对应的数字如下:

  • 仿生海狸是 Ubuntu 18.04
  • Focal Fossa 是 Ubuntu 20.04
  • Buster 是 Debian 10
  • Bullseye 是 Debian 11

(其他答案建议使用 snap。虽然有些人可以接受,但请注意该软件如何创建实际上无法删除的 ~/snap/ 目录,并且五年来没有简单的解决方案被接受。详细信息在askubuntu.com/882562/.)

答案4

不必修改每个配置文件,使用 snap 别名可能会更容易:

sudo snap alias unison-jz.unison unison

在客户端和服务器端。

相关内容