我正在使用 Unison 在多台计算机上同步我的家庭,并且我已经解决了除此之外的所有问题。
Dropbox 配置被部分跳过,因此 Dropbox 认为没有配置并再次执行配置向导。
以下是与 Dropbox 相关的 Unison 输出:
Reconciling changes
<-?-- dir .dropbox
<---- dir .dropbox-dist
<---- dir .dropbox-dist-new
[BGN] Copying .dropbox from /home/.nfs/jorge.suarez/linux-home to /home/remoto/jorge.suarez
[END] Copying .dropbox
[BGN] Copying .dropbox-dist from /home/.nfs/jorge.suarez/linux-home to /home/remoto/jorge.suarez
[END] Copying .dropbox-dist
[BGN] Copying .dropbox-dist-new from /home/.nfs/jorge.suarez/linux-home to /home/remoto/jorge.suarez
[END] Copying .dropbox-dist-new
partially transferred: .dropbox
这是该目录的原始内容:
$ ls -lah
total 22M
drwx------ 3 jorge.suarez users 3,9K 2013-01-25 21:39 .
drwxr-xr-x 43 jorge.suarez users 3,9K 2013-01-25 21:40 ..
srw------- 1 jorge.suarez users 0 2013-01-25 21:39 command_socket
-rw------- 1 jorge.suarez users 3,0K 2013-01-25 21:39 config.db
-rw------- 1 jorge.suarez users 20K 2013-01-25 21:39 config.dbx
-rw------- 1 jorge.suarez users 66K 2013-01-25 21:39 deleted.dbx
-rw------- 1 jorge.suarez users 4 2013-01-25 21:39 dropbox.pid
-rw------- 1 jorge.suarez users 2,0M 2013-01-25 21:39 filecache.dbx
-rw------- 1 jorge.suarez users 89 2013-01-25 21:39 host.db
-rw------- 1 jorge.suarez users 221 2013-01-25 21:39 host.dbx
-rw------- 1 jorge.suarez users 81 2013-01-25 21:39 hostkeys
srw------- 1 jorge.suarez users 0 2013-01-25 21:39 iface_socket
drwx------ 2 jorge.suarez users 3,9K 2013-01-25 21:39 l
-rw------- 1 jorge.suarez users 13K 2013-01-25 21:39 photo.dbx
-rw------- 1 jorge.suarez users 20M 2013-01-25 21:39 sigstore.dbx
-rw------- 1 jorge.suarez users 232 2013-01-25 21:39 unlink.db
同步的,就在 Dropbox 有机会启动之前:
$ ls -lah
total 22M
drwx------ 3 jorge.suarez users 4,0K Xan 25 22:09 .
drwx------ 43 jorge.suarez users 4,0K Xan 25 22:10 ..
-rw------- 1 jorge.suarez users 3,0K Xan 25 22:09 config.db
-rw------- 1 jorge.suarez users 20K Xan 25 22:09 config.dbx
-rw------- 1 jorge.suarez users 66K Xan 25 22:09 deleted.dbx
-rw------- 1 jorge.suarez users 4 Xan 25 22:09 dropbox.pid
-rw------- 1 jorge.suarez users 2,0M Xan 25 22:09 filecache.dbx
-rw------- 1 jorge.suarez users 89 Xan 25 22:09 host.db
-rw------- 1 jorge.suarez users 221 Xan 25 22:09 host.dbx
-rw------- 1 jorge.suarez users 81 Xan 25 22:09 hostkeys
drwx------ 2 jorge.suarez users 4,0K Xan 25 22:09 l
-rw------- 1 jorge.suarez users 13K Xan 25 22:09 photo.dbx
-rw------- 1 jorge.suarez users 20M Xan 25 22:09 sigstore.dbx
-rw------- 1 jorge.suarez users 232 Xan 25 22:09 unlink.db
它似乎iface_socket
被command_socket
跳过,因为它们是套接字文件。我能做些什么吗?
作为解决方法,我可以解析 Unison 输出并手动创建套接字文件。这应该可以解决这个特定问题,但对于其他套接字文件来说,问题仍然存在,因为 Unison 输出不包含跳过文件的名称。
答案1
从 Unison 2.40(我编写的最新版本)开始,Unison 不支持任何非常规文件、目录或符号链接的文件。之前的版本在遇到特殊文件时会中止传输;从 2.40 开始,这些文件将被忽略。在 2.40.65 中,您在第一次同步中看不到被忽略的文件的名称,但会在后续同步中显示。因此,您可以手动运行 Unison 一次,然后解析其输出以检测特殊文件。
其他选项是修补 Unison,或手动查找特殊文件并复制它们。
同步这些文件的一种方法是保留它们的存储库。例如,创建一个并行层次结构,将特殊文件与普通文件进行编码,让 Unison 对其进行同步,并在同步后将并行层次结构解码回来。在齐心跑之前,双方:
mkdir -p .pipes .sockets
find . -type p -exec sh -c '
mkdir -p ".pipes/${0%/*}";
touch -r "$0" ".pipes/$0"; chmod -r "$0" ".pipes/$0"
' {} \;
find . -type s -exec sh -c '
mkdir -p ".sockets/${0%/*}";
touch -r "$0" ".sockets/$0"; chmod -r "$0" ".sockets/$0"
' {} \;
一致运行后:
(cd .pipes &&
find -type f -exec sh -c '
[ -p "../$0" ] && exit;
mkfifo "../$0";
touch -r "$0" "../$0"; chmod -r "$0" "../$0"
' {} \;)
find -type p -exec '[ -e ".pipes/$0" ] || rm "$0"' {} \;
(cd .sockets &&
find -type f -exec sh -c '
[ -S "../$0" ] && exit;
python -c "import os, sys; os.mknod(sys.argv[1], 0140000)" "../$0";
touch -r "$0" "../$0"; chmod -r "$0" "../$0"
' {} \;)
find -type s -exec '[ -e ".sockets/$0" ] || rm "$0"' {} \;
(警告:未经测试的代码。假设使用 GNU 工具(包括任何非嵌入式 Linux)。)
我认为这比保证的更复杂。很少有应用程序依赖现有的命名管道或套接字:大多数应用程序根据需要创建它们。 Dropbox 是我听说过的第一个案例。因此,我想我会采用一种临时方法:同步时跳过套接字,并在新帐户创建过程中为 Dropbox 创建它们(与 Unison 配置文件创建以及您执行的其他操作一起)。