rsync: --no-whole-file 如果在文件尾部添加一行则不起作用

rsync: --no-whole-file 如果在文件尾部添加一行则不起作用

我的问题与为什么rsync不进行增量传输问题。

首先,我创建一个 1GB 文件并/target使用 rsync 传输到文件夹中。后来我将 sdoo字符串添加到该文件的尾部。当我将相同的文件传输到/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

详细输出显示,在第二次调用 时仅传输了文件的一部分rsync

rsync为发送方启动一个子进程,为接收方启动一个子进程,这些子进程在它们之间来回发送校验和和数据。

rsync校验和文件的。默认情况下,块大小取决于文件大小。如果发送方和接收方之间的块校验和不匹配,则传输整个块。最后一个块通过添加字符串进行了修改,因此必须进行传输。这就是为什么您会看到正在传输的 131171 字节,而不仅仅是文件中实际更改的字节数(此特定文件的块大小约为 130 KB)。

另请参阅手册-B中的选项rsync

答案2

您没有传输整个文件,但完整读取源文件和目标文件以确定差异。

--no-whole-file将简单的“通过复制整个文件来替换文件”与更复杂的“读取源并计算其校验和;读取目标并计算其校验和;更新差异”进行交换。

在我这里的一个系统上,执行第二个操作比仅覆盖原始操作花费的时间更长。 (经过多次尝试,时间有大约 +/- 3 秒的差异。)

  • 29秒复制原件
  • 默认28秒复制更新原件--whole-file
  • 59 秒比较并复制更新后的原件--no-whole-file

rsync有时不使用增量传输算法有(充分的)理由。

相关内容