Linux

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

  • January 27, 2013

我正在使用 Unison 在多台電腦上同步我的家,除此之外,我已經解決了所有問題。

Dropbox 配置被部分跳過,因此 Dropbox 認為沒有配置並再次通過配置嚮導。

這是 Unison 與 Dropbox 相關的輸出:

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 輸出不包含跳過文件的名稱,因此其他套接字文件仍然存在問題。

從 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 配置文件創建和你做的任何其他事情)。

引用自:https://unix.stackexchange.com/questions/62602