Unison 无法同步 Dropbox 配置(套接字文件)

Unison 无法同步 Dropbox 配置(套接字文件)

我正在使用 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_socketcommand_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 配置文件创建以及您执行的其他操作一起)。

相关内容