如何让 unison 备份从 / 开始的整个文件系统?

如何让 unison 备份从 / 开始的整个文件系统?

unison 2.52.1我在我的 Linux 机器(Ubuntu 版本 20.04)和 Mac(MacOS 版本 11.7)上同时使用这两种软件。

我想unison通过 ssh 连接将我的整个 linux 文件系统(通过“忽略”排除一些特定目录)备份到 Mac 上的目录。

我知道如何设置基于 ssh 的unison传输,除了一个关键点:似乎unison不允许源机器的初始“根”为/。但是,由于我想备份 Linux 机器上的所有内容,因此我需要从 Linux 文件系统树的根开始。

有谁知道如何让unison源“root”位于/Linux 下?

提前非常感谢您。

更新:这是失败的首选项文件,以及我收到的错误消息......

root = /
root = ssh://[email protected]//Users/useronmac/backups
force = /
sshargs = -p 6543
[ "ignore" commands go here ]

这是我收到的错误...

[ ...  etc. ... ]
Looking for changes
  Waiting for changes from server
Reconciling changes
         error            /  
The path / is a root directory
No updates to propagate

如果我对第一个“根”和“力”使用任何其他名称,则效果很好。例如...

root = /usr
root = ssh://[email protected]//Users/useronmac/backups
force = /usr

这毫无问题。

另一更新

根据@Edward的建议,我尝试使用 运行-debug all。除了我上面列出的内容之外,没有打印出任何特别有意义的内容。以下是输出末尾的重要 stdout 行-debug all...

[ ... etc. ... ]
[update] Updating archives
[update] Saving archive in /root/.unison/scb96ed4facff65e2345cb97206c90f055
[server: update] Saving archive in /Users/useronmac/Library/Application Support/Unison/scce5852e4685b7e41685f5f8f38d86e90
[update] Copying archive /root/.unison/tmb96ed4facff65e2345cb97206c90f055 to /root/.unison/arb96ed4facff65e2345cb97206c90f055
[server: update] Copying archive /Users/useronmac/Library/Application Support/Unison/tmce5852e4685b7e41685f5f8f38d86e90 to /Users/useronmac/Library/Application Support/Unison/arce5852e4685b7e41685f5f8f38d86e90
[update] Removing archive /root/.unison/tmb96ed4facff65e2345cb97206c90f055
[server: update] Removing archive /Users/useronmac/Library/Application Support/Unison/tmce5852e4685b7e41685f5f8f38d86e90
         error            /  
The path / is a root directory
No updates to propagate
Synchronization complete at 18:48:20  (0 items transferred, 1 skipped, 0 failed)
  skipped:  (The path / is a root directory)
[server: remote] Connection closed by the client

另外,我在unisongithub 网站上打开了一个问题,但不久之后,他们就关闭了它,并告诉我阅读整个unison文档,然后将任何进一步的问题发布到他们的邮件列表中。这对我来说意味着这种root = /行为是某种记录在案的“功能”,尽管我还没有在文档中找到它被提及...尽管我还没有时间阅读整个文档。

我请求访问他们的邮件列表,但尚未获得批准。

unison无论如何,我都会发布从文档和/或他们的邮件列表中发现的任何内容。

又一次更新

我在文档中找不到任何unison关于/禁止以“root”身份使用的内容。不过,我开始查看unison他们的 github 网站上的最新源代码(https://github.com/bcpierce00/unison)事实证明,这/确实是硬编码为Linux下的非法“root”。

要了解我为什么这么说,请访问该unisonGitHub 网站并查看src/fspath.ml那里的文件。首先,从该文件的第 45 行开始,我们有以下内容:

let isRootDir d =
(* We assume all path separators are slashes in d                            *)
  d="/" ||
  (Util.osType = `Win32 && Rx.match_string winRootRx d)

这表示在非 Win32 操作系统上,isRootDir如果相关文件是/,则该函数返回“true”,否则返回“false”。

然后,查看isRootDirLocalString从同一文件第 50 行开始的函数:

let isRootDirLocalString d =
  let d =
    if Util.osType = `Win32 then Fileutil.backslashes2forwardslashes d else d
  in
  isRootDir ((Fileutil.removeTrailingSlashes d) ^ "/")

此函数在非 Win32 操作系统上也将返回/路径名的“true”。

然后,查看同一文件的第 380-382 行:

if isRootDirLocalString realpath then
    raise (Util.Transient(Printf.sprintf
                            "The path %s is a root directory" abspath));

如果“realpath”变量为,则此代码将引发异常/,您可以看到此异常的文本正是我root = /在测试中尝试指定时收到的确切错误消息。

源代码中没有其他地方打印此错误消息。

因此,我得出结论,禁止root = /确实是某种有意为之的特征unison

一旦我进入unison邮件列表,我会询问他们是否愿意放宽这一禁令,如果所讨论的“根”被标记为“强制”。

答案1

好吧,我找到了我的问题的答案:升级到unison 2.53.x

我错误地认为该2.52.x系列是最新版本,但事实证明该2.53.x版本至少已经发布了一段时间,当我发现该版本并将其安装在我的主机上时,我看到“root = /”和“force = /”现在已经开始工作。

我猜想 Unison 的人们最近也意识到将“root = /”与“force = /”一起使用是安全的。

相关内容