web-dev-qa-db-ja.com

--checksumオプションと--ignore-timesオプションのRsyncの違い

Rsyncの--checksumオプションと--ignore-timesオプションの違いを誰かが明確にできますか?

私の理解は次のとおりです。

--checksum
ファイルのサイズと時間が一致する場合、両端でチェックサムを実行して、ファイルが本当に同じかどうかを確認します。

--ignore-times
ファイルの時間が両端で同じであるかどうかに関係なく、すべてのファイルを「転送」します。それでもデルタ転送アルゴリズムが使用されるため、ファイルが実際に同一である場合、何も転送されません。

それが技術的な違いですが、私の知る限り、それらは意味的に同じです。

だから、私が思っているのは:

  • 2つのオプションの実際的な違いは何ですか?
  • どちらを使用するのですか?
  • それらの間にパフォーマンスの違いはありますか?
105
Andy Madge

通常、rsyncは、ソース側と宛先側でファイルのサイズと時間が同じである場合、ファイルをスキップします。これはrsyncがソース側と宛先側で同一である可能性が非常に高いファイルの内容を調べる必要がなくなるため、通常は良いアイディアであるヒューリスティックです。

--ignore-timesは、rsyncにファイルの時間とサイズのヒューリスティックをオフにするように指示し、すべてのファイルを無条件にソースから宛先に転送します。 rsyncはその後、ソース側ですべてのファイルを読み取ります。これは、--whole-fileオプションに応じて、デルタ転送アルゴリズムを使用するか、すべてのファイル全体を送信する必要があるためです指定されました。

--checksumは、ファイルの時間とサイズのヒューリスティックも変更しますが、ここでは時間を無視してサイズのみを調べます。サイズが異なるソース側と宛先側のファイルは、明らかに異なるため、転送されます。同じサイズのファイルはチェックサムされ(rsyncバージョン3.0.0+のMD5、または以前のバージョンのMD4)、合計が異なることが判明したファイルも転送されます。

ソース側と宛先側がほとんど同じ場合、--checksumを指定すると、ほとんどのファイルが両側でチェックサムされます。これには長い時間がかかる可能性がありますが、特にデルタ転送アルゴリズムが使用されている場合は、最小限のデータが実際にネットワーク経由で転送されることが重要です。もちろん、これは非常に遅いネットワークや非常に高速なCPUを使用している場合にのみ有効です。

一方、--ignore-timesは、ネットワークを介してより多くのデータを送信し、すべてのソースファイルが読み取られるようにしますが、少なくとも、ソースで暗号学的に強力な多くのハッシュサムを計算するという追加の負担を課すことはありませんおよび宛先CPU。ネットワークが高速であるか、CPUが比較的低速である場合、このオプションは--checksumよりも優れたパフォーマンスを期待します。

--checksumまたは--ignore-timesを使用するのは、ファイルの内容が破損している疑いがあるが、変更時刻が変更されていない宛先にファイルを転送する場合に限られます。おそらく他のユースケースがあるかもしれませんが、私はどちらのオプションを使用する他の正当な理由も本当に考えられません。

112
Steven Monday

チェックサムは、タイムスタンプを保持していない別のシステムを使用してファイルを同期している場合にも役立ちます。チェックサムは異なるファイルのみを転送し、受信側のすべてのタイムスタンプを更新して、それらが一致するようにします

18
Paulus

1つの詳細:チェックサムオプションは、一端でファイル全体をチェックし、次に他端でファイル全体をチェックします。ファイルがいくらか大きい場合、この種の並列処理は無効になります。

また、巨大なファイルがある場合、--checksumを使用しない場合とは異なり、-Iを使用するとタイムアウトになる可能性が高くなります。

4
Francois

info rsyncに関して--checksumオプション-"接続の両側にあるすべてのファイルのこのファイル全体のチェックサムは、ファイルの転送中に発生する自動チェックサム検証に加えて発生するため、このオプションはかなり遅くなる可能性があります。"

2
LeoB

--ignore-timesオプションを使用すると、すべてのファイルがデルタエンコードされ、デルタ転送アルゴリズム(デルタエンコード)は少なくともチェックサムと同じくらい遅くなります。

Rsync --ignore-timesが、デルタ転送で何も転送されない場合が多い「転送後の自動検証」を回避できるほど賢いかどうかはわかりません。

--ignore-timesの場合:

  • Rsyncがスマートでない(またはデルタエンコーディングを信頼しない)場合、チェック(チェックサムとエンコーディング)は2回行われます。
  • また、デルタエンコーディングが128ビットのMD4チェックサムよりもはるかに遅い場合もあります。

--checksum--ignore-timesはどちらも「かなり低速」になりますが、--ignore-timesはさらに低速になる可能性があります(上記の2つの可能性があるため)。

良い質問です。実際にパフォーマンスの違いを見つけたら投稿してください。

2