3台のマシンの同期を維持しようとしていますが、そのうちの1台でユニゾンを実行して他の2台を同期しています。この「スター」アーキテクチャは、ユニゾンマニュアルで宣伝されています。
ユニゾンを使用して複数のマシンを同期する
Unisonは、レプリカのペアを同期するために設計されています。ただし、これを使用して、複数のペアワイズ同期を実行することにより、マシンのより大きなグループの同期を維持することができます。
これを行う必要がある場合、設定する最も信頼できる方法は、マシンを「スタートポロジ」に編成し、1台のマシンを「ハブ」、残りを「スポーク」として指定し、各スポークマシンを同期させることです。ハブのみ。スタートポロジの大きな利点は、同期するホストのペアごとに個別のアーカイブがUnisonによって維持されるという事実から生じる、混乱する「偽の競合」の可能性を排除することです。
しかし、最初の同期後
unison -fat -batch "$HOME/dir" ssh://"$myhost1//dir"
unison -fat -batch "$HOME/dir" ssh://"$myhost2//dir"
両方のホストで、どちらか一方に対して常に次のエラーが発生します。
致命的なエラー:内部エラー:ディスク上のアーカイブが同一ではありません。
これは、両方のマシンのホスト名が同じ場合に発生する可能性があります。
そうでない場合で、このメッセージが繰り返し表示される場合は、次のようにしてください。a)バグレポートを[email protected]に送信します(投稿を許可する前にグループに参加する必要がある場合があります)。 b)各マシンのアーカイブファイルを他のディレクトリに移動します(デバッグに役立つ場合があります)。このマシンのアーカイブファイルは、ディレクトリ/home/andreas/.unisonにあり、arXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXという形式の名前が付いています。Xは16進数です。 c)ユニゾンを再度実行して、最初から同期します。
指示b)に従った場合、または実行した場合
unison -ignorearchives -fat "$HOME/dir" ssh://"$myhost1//dir"
これを正常に同期します。ただし、もう一方をスナイスすると、上記と同じエラーが発生します。それらの1つを同期するたびに、もう1つは一貫性のない状態になるようです。常に-ignorearchives
を追加する以外に、これを修正するにはどうすればよいですか?ユニゾンバージョンはubuntuパッケージとAndroidユニゾンアプリから2.40.102です。
「致命的なエラー」メッセージは、私が思っていたよりも適切であることがわかりました。問題の原因(ホストが名前を変更した場合に2台のマシンのセットアップで発生します)は、ホスト名と同期する2つのAndroidデバイスが両方ともlocalhost
、それらは異なり、異なるIPアドレスで指定されていますが。
ユニゾンマニュアルによると、ホスト名はUNISONLOCALHOSTNAME
環境変数をエクスポートすることで手動で指定できます。 unisonはログインシェルを作成しないため、同期デバイスの.profile
ファイルにエクスポートすることはできません。私のsshサーバー(どちらの場合もSshDroid)の./ssh/environment
ファイルも読み取られなかったことが判明しました。最後に、Androidホスト名(setprop net.hostname [hostname]
で設定可能)もユニゾンによって読み取られません。代わりに、デフォルトでlocalhost
に設定されているようです。
したがって、次の回避策を考え出しました。
unison -servercmd "export UNISONLOCALHOSTNAME=Host1; unison" ssh://"$myhost1//dir" "$HOME/dir"
unison -servercmd "export UNISONLOCALHOSTNAME=Host2; unison" ssh://"$myhost2//dir" "$HOME/dir"
ここで、-servercmd
オプションは、ユニゾンを開始するためにリモートデバイスで実行するコマンドを定義します。私のバージョンでは、最初にUNISONLOCALHOSTNAME
を2つの異なる値にエクスポートします。
次に、ホストが異なると認識され、「スター」セットアップの中央の「ハブ」から複数の「ヒント」を繰り返し同期することができます。
私は正確にOPと同じ問題を抱えていました。 2つのAndroidデバイスとPC上のマスターフォルダーの(内部)sdcardの "Books"ディレクトリを同期しています。使用していたのは SimpleSSHD on Androidこれはdropbearサーバーを実行しており、.profileを読み取らないセッションの環境変数を設定する方法がないようです。
私の最初の「解決策」は完全なハックでした。一方のデバイスで/ storage/emulated/0/Booksを同期し、もう一方のデバイスで/ sdcard/Booksを同期しました。
今、私はAndroidデバイスで termux を使用しています。termuxでは、opensshをインストールでき、termuxのsshdはsshd_configのSetEnvディレクティブを尊重します。次の行を追加するだけです。
SetEnv UNISONLOCALHOSTNAME=tablet
$ PREFIX/etc/ssh/sshd_configファイルに移動します(必要に応じて、=の後にホスト名を変更します)。また、デバイスに Termux:Boot をインストールし、sshdサーバーが自動的に起動するように構成します。
N.B.私はユニゾンバイナリを次の場所で使用しています: https://github.com/vovcacik/unison-build-scripts/raw/master/binaries/2.48.4/linux-x86_64/unison 。他のパッケージの32ビットバイナリも、LD_PRELOADの設定を解除するスクリプトでラップされている場合に使用できます。