複数のコンピューター間でフォルダー ツリーを同期させようとしています。現在、unison
中央のリモート サーバーを備えたスター トポロジを使用しています。サーバー上のデータを暗号化したいので、サーバー上でツリーunison
(.unison
フォルダーを含む) はツリー内に保持されますencfs
。同期を実行するには、各クライアントで次の操作を実行します。
- サーバーストレージをマウントする
sshfs
- ストレージをローカル
encfs
にマウントするsshfs
unison
ドキュメントのローカル コピーとマウントされたコピーの間で実行します。
この設定には多くの利点があります:
- オープンソースツール
- スクリプト可能なコマンドラインソリューション
- 安全な通信
ssh
encfs
フォルダツリーがサーバー上で復号化されないため、サーバーからプライバシーが保護されます。unison
プレーンテキスト上で実行されるため、同期中に変更を比較する機能
あまりうまく機能しない点の 1 つは、同期の速度です。encfs
サーバーのフォルダーはクライアントにマウントされるため、クライアントが行うすべての呼び出しをサーバーにstat()
転送する必要があります。ドキュメント ツリーにはすでに何千ものファイルがあり、同期では各ファイルに対して少なくとも 1 回の呼び出しを実行する必要があります (フォルダーに保存されている状態の変更を排除するため)。上記の利点を維持しながら、より高速な代替手段はありますか?ssh
unison
stat()
.unison
注: 最後の条件を削除すると、unison
暗号テキスト上で実行し、encfs
ツリーをローカルにマウントするだけで済みます。その後、unison
クライアントとサーバー上でローカルに実行されるため、stat()
呼び出しが高速になります。ただし、少なくともどのファイルが同期されているかを確認するオプションがあると便利です。暗号テキストunison
上ではencfs
、ファイル名が暗号化されます。
この問題を解決するには、同期中にファイル メタデータをサーバーからクライアントに効率的に転送する必要があることは理解しています。たとえば、メタデータを 1 か所に保存して、何千ものブロックを送信するのではなく (転送呼び出しで行われる処理)、1 つ (または数個) のデータ ブロックのみを送信してすべてを転送する方法 (つまり、既存のstat()
ツールの組み合わせ) があるかどうか疑問に思っています。
encfs
たとえば、サーバー上の大きなファイル内に格納されている 以上ext4
のパーティションを に置き換え、経由でクライアントにマウントするとどうなるでしょうか。ファイルシステムはファイルのメタデータをまとめて保持し、数ブロックのみを送信して転送するのでしょうか。更新中に、暗号化されたファイル全体を書き換えるのではなく、数ブロックのみを送信することを認識するのでしょうか。dm-crypt
losetup
sshfs
ext4
sshfs
答え1
ext4
私は以上luks
の方法で成功しましたsshfs
。unison
このタイプのマウントで実行すると、 以上encfs
の方法よりもはるかに高速であるsshfs
ことがわかりました。つまり、何千ものstat()
構造体が何らかの方法でファイルシステムにまとめられext4
、同期中に必要なネットワーク トラフィックが少なくなるはずです。
少し面倒なのは、ext4
ファイルシステムがすべてのファイルにユーザーIDを必要とすることです。このユーザーIDは、ファイルシステムext4
がクライアントにローカルにマウントされたときにアクセス許可を計算するために使用されます。私の場合は、ローカルユーザーIDを特定の番号に変更することを選択しました。全て同期元のクライアント。別の方法としては、ext4
uid 0 のファイルシステムにファイルを保存し、非ルート uid でファイルシステムbindfs
をマウントする方法があります。ext4