次のシナリオを考えてみましょう。 2台のLinuxコンピュータAとBが常に使用できるわけではなく、特別なハードウェアラジオリンクを介して接続されています。これは、2つのRaspberry Piで発生する可能性があります。どのコンピュータもインターネットにアクセスできません。
Linux A には 1GB の libabc.so というライブラリがあり、Linux B にはこのライブラリのソースコードがあります。 Linux Bのユーザーがソースコードの単一定数を変更し、ライブラリを再コンパイルすると仮定します。
1GBの再コンパイルされたファイル全体を送信せずにLinux BからLinux Aにアップデートを送信する方法やツールはありますか?
どういうわけか使用しようとしていましたが、git
テキスト以外のファイルに対する増分変更を保存しません。私が知っているのは、rsync
ファイル全体も同期されます。どちらの場合も、ラジオリンクを介して他のコンピュータのファイルシステムに簡単にアクセスできません。したがって、どちらの場合も、1GBのデータが転送されます。別の解決策は、Linux Aでソースコードを複製して更新することです。しかし、コンパイルに時間がかかり、Linux Bのパフォーマンスがはるかに優れています。
最終的な解決策は、このような軽いツールを直接書くことでした。しかし、すでに何か利用可能なものがあると思います。
ベストアンサー1
私が知っているのは、
rsync
ファイル全体も同期されます。
ファイルを同期します。ただし、ネットワーク転送のデフォルトの動作は、ファイルがすでに存在する場合はデータ全体を送信するのではなく、ローリングブロックチェックサムを計算して比較することです。これにより、共通点がある場合に送信する必要があるデータ量が減ります。
ファイルをスキップしないと、受信側の既存のバージョンが転送用の「デフォルトファイル」になり、データソースとして使用されます。これは、送信者が送信する必要がある一致するデータを削除するのに役立ちます。データのリモートマッチングを有効にするために、ベースファイルのブロックチェックサムが生成され、ファイルインデックス番号の直後に送信者に送信されます。
...
ブロックチェックサム一致が見つかると、一致ブロックと見なされ、累積された一致しないデータが受信者に送信されます。その後、一致するブロックの受信者ファイル内のオフセットと長さ、ブロックチェックサム、およびジェネレータが送信されます。一致するブロックの後の次のバイトに進みます。