Unison 無法同步 Dropbox 配置(套接字文件)
我正在使用 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 配置文件創建和你做的任何其他事情)。