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_socketているようです。command_socket私ができることはありますか?

回避策として、Unison出力を解析し、ソケットファイルを手動で生成できます。これにより、この特定の問題は解決されますが、Unison出力にスキップされたファイルの名前が含まれていないため、他のソケットファイルには問題が残ります。

ベストアンサー1

Unison 2.40(私が書いた最新バージョン)以降、Unisonは通常のファイル、ディレクトリ、またはシンボリックリンク以外のファイルをサポートしていません。以前のバージョンでは、特殊ファイルが見つかると転送が中断されました。 2.40以降、これらのファイルは無視されます。 2.40.65では、最初の同期では無視されたファイル名は表示されませんが、後続の同期では表示されます。したがって、Unisonを手動で一度実行してから、出力を解析して特別なファイルを取得できます。

別のオプションは、Unisonにパッチを適用するか、手動で特別なファイルを見つけてコピーすることです。

これらのファイルを同期する 1 つの方法は、そのファイルのリポジトリを維持することです。たとえば、並列階層を作成し、通常のファイルに特殊ファイルをエンコードし、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は私が最初に聞いたケースです。だから私は一時的なアプローチを取るべきだと思いました。同期時にソケットをスキップし、新しいアカウント作成プロセス中に(Unisonプロファイルの作成やその他の操作で)Dropbox用のソケットを作成します。

おすすめ記事