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
另外,我在unison
github 网站上打开了一个问题,但不久之后,他们就关闭了它,并告诉我阅读整个unison
文档,然后将任何进一步的问题发布到他们的邮件列表中。这对我来说意味着这种root = /
行为是某种记录在案的“功能”,尽管我还没有在文档中找到它被提及...尽管我还没有时间阅读整个文档。
我请求访问他们的邮件列表,但尚未获得批准。
unison
无论如何,我都会发布从文档和/或他们的邮件列表中发现的任何内容。
又一次更新
我在文档中找不到任何unison
关于/
禁止以“root”身份使用的内容。不过,我开始查看unison
他们的 github 网站上的最新源代码(https://github.com/bcpierce00/unison)事实证明,这/
确实是硬编码为Linux下的非法“root”。
要了解我为什么这么说,请访问该unison
GitHub 网站并查看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 = /”一起使用是安全的。