使用 unison 同步多个主机

使用 unison 同步多个主机

我试图让三台机器保持同步,在其中一台机器上运行 unison 来同步其他两台机器。这种“星型”架构在 unison 手册中有宣传:

使用 Unison 同步两台以上的机器

Unison 专为同步副本对而设计。但是,也可以使用它通过执行多个成对同步来使更大的机器组保持同步。

如果您需要这样做,最可靠的设置方法是将机器组织成“星型拓扑”,其中一台机器指定为“中心”,其余机器指定为“辐条”,并且每台辐条机器仅与中心同步。星型拓扑的一大优势是它消除了混淆“虚假冲突”的可能性,因为 Unison 为其同步的每对主机维护一个单独的档案。

但在与

unison -fat -batch "$HOME/dir" ssh://"$myhost1//dir"
unison -fat -batch "$HOME/dir" ssh://"$myhost2//dir"

对于两个主机,我总是会得到其中一个主机的以下错误:

致命错误:内部错误:磁盘上的档案不相同。

当两台机器具有相同的主机名时,就会发生这种情况。

如果不是这种情况,并且您反复收到此消息,请:a) 发送错误报告至[电子邮件保护](您可能需要先加入该组,然后才允许发帖)。b) 将每台机器上的存档文件移动到其他目录(以防它们可能对调试有用)。此机器上的存档文件位于目录 /home/andreas/.unison 中,其名称格式为 arXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,其中 X 是十六进制数。c) 再次运行 unison 以从头开始同步。

如果我按照说明 b) 操作,或者我运行

unison -ignorearchives -fat "$HOME/dir" ssh://"$myhost1//dir" 

我成功同步了这个。但是同步另一个会产生上述相同的错误。似乎每当我同步其中一个时,另一个就会处于不一致的状态。除了始终添加之外,我还能如何解决这个问题-ignorearchives?Unison 版本是 2.40.102,来自 ubuntu 软件包和 android Unison 应用程序。

答案1

事实证明,“致命错误”消息比我想象的更合适。问题的根源(如果主机更改其名称,则在双机设置中会发生这种情况)是,要同步的两台 Android 设备都被确定为主机名localhost,即使它们是不同的并且由不同的 IP 地址指定。

根据 unison 手册,可以通过导出UNISONLOCALHOSTNAME环境变量手动指定主机名。但是,由于 unison 不会创建登录 shell,因此无法将其导出到.profile同步设备上的文件中。事实证明,./ssh/environment我的 ssh 服务器(两种情况下均为 SshDroid)的文件也未被读取。最后,unison 也无法读取 android 主机名(可以使用 设置setprop net.hostname [hostname])。相反,它似乎默认为localhost

因此我想出了以下解决方法:

unison -servercmd "export UNISONLOCALHOSTNAME=host1; unison" ssh://"$myhost1//dir" "$HOME/dir" 
unison -servercmd "export UNISONLOCALHOSTNAME=host2; unison" ssh://"$myhost2//dir" "$HOME/dir" 

此处的-servercmd选项定义要在远程设备上运行哪个命令来启动 unison。在我的版本中,它UNISONLOCALHOSTNAME首先将导出为两个不同的值。

然后,主机被识别为不同的,并且可以从“星型”设置中的中央“集线器”重复同步多个“提示”。

答案2

我有确切地和楼主的问题一样。我正在将两台安卓设备(内置)SD 卡上的“Books”目录与我电脑上的主文件夹同步。我使用的是简单SSHD在运行 dropbear 服务器的 android 上,似乎无法为不读取 .profile 的会话设置环境变量。

我的第一个“解决方案”是一个完整的黑客攻击:我在一台设备上同步 /storage/emulated/0/Books,在另一台设备上同步 /sdcard/Books。

现在我用特姆克斯在我的 Android 设备上。在 termux 中,可以安装 openssh,并且 termux 的 sshd 可以很好地遵守 sshd_config 中的 SetEnv 指令。只需添加以下行:

SetEnv UNISONLOCALHOSTNAME=tablet

到 $PREFIX/etc/ssh/sshd_config 文件(根据需要更改 = 后的主机名)。我还安装了Termux:启动在我的设备上并配置以便 sshd 服务器自动启动。

注意:我在以下位置使用 unison 二进制文件:https://github.com/vovcacik/unison-build-scripts/raw/master/binaries/2.48.4/linux-x86_64/unison. 如果将其他软件包中的 32 位二进制文​​件包装在未设置 LD_PRELOAD 的脚本中,则也可以使用它们。

相关内容