rsync:ファイルの末尾に行を追加すると、--no-whole-fileは機能しません。

rsync:ファイルの末尾に行を追加すると、--no-whole-fileは機能しません。

私の問題はrsyncが増分転送を実行しない理由質問。

まず、1GBファイルを作成し、/targetrsyncを使用してフォルダに転送します。後でdooファイルの末尾に s 文字列を追加しました。同じファイルを/targetフォルダに転送したときに、更新された部分だけではなくファイル全体が転送されたことがわかりました。

[尋ねる]rsyncがファイルの更新された部分のみを増分転送するように強制するにはどうすればよいですか?可能ですか、それともファイル全体を再送信する唯一のオプションですか?

例:

$ mkdir target
$ fallocate -l 1G target/temp_1GB_file
$ rsync --inplace --no-whole-file  --size-only --progress temp_1GB_file doo
temp_10GB_file
  1073741824 100%  227.30MB/s    0:00:04 (xfer#1, to-check=0/1)

sent 131163 bytes  received 229425 bytes  48078.40 bytes/sec
total size is 1073741824  speedup is 2977.75

$ echo 'doo' >> temp_10GB_file
$ rsync --no-whole-file  --size-only --progress temp_1GB_file doo # Here complete file has been transferred all over again.
  temp_10GB_file
  1073741828 100%  226.44MB/s    0:00:04 (xfer#1, to-check=0/1)

sent 131171 bytes  received 229418 bytes  48078.53 bytes/sec
total size is 1073741828  speedup is 2977.74

答え1

ファイル全体を転送するわけではありません。

sent 131171 bytes  received 229418 bytes  48078.53 bytes/sec
total size is 1073741828  speedup is 2977.74

詳細出力は、2回目の呼び出しでファイルの一部のみが送信されたことを示していますrsync

rsync送信者のサブプロセスと受信者のサブプロセスが開始され、これらのサブプロセスはチェックサムとデータをやり取りします。

rsyncチェックサム彫刻ファイル。デフォルトでは、ブロックサイズはファイルサイズによって異なります。送信側と受信側のブロックチェックサムが一致しない場合、ブロック全体が送信されます。最後のブロックは文字列を追加することで変更されたため、送信する必要がありました。そのため、ファイル内で実際に変更されたバイト数ではなく、131171バイトが転送されるようにマークされます(この特定のファイルのブロックサイズは約130KBです)。

-Bマニュアルのオプションも参照してくださいrsync

答え2

ファイル全体を転送せずにソースファイルとターゲットファイル全体を読み、違いを確認します。

--no-whole-file単純な「ファイル全体をコピーしてファイルを置き換える」を、より複雑な「ソース読み取りとチェックサムの計算、ターゲットの読み取りとチェックサムの計算、違いの更新」と交換します。

ここにあるシステムでは、2番目のタスクを実行するのは元のタスクを上書きするよりも時間がかかります。 (複数回試した後、時間は約+/-3秒ほど変わりました。)

  • 29秒で元のコピー
  • ソースをコピーして更新するためのデフォルト値は28秒です。--whole-file
  • 更新されたソースを比較してコピーするために59秒--no-whole-file

rsync時々、デルタ転送アルゴリズムを使用しない(妥当な)理由があります。

関連情報