我的问题与为什么 rsync 不做增量传输问题有关。
首先,我创建一个 1GB 的文件并/target
使用 rsync 传输到文件夹中。后来我doo
在该文件的尾部添加了 s 字符串。当我将同一个文件传输到/target
文件夹时,我观察到整个文件已被传输,而不是仅传输其更新的部分。
[Q]如何强制 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
您没有传输整个文件:
详细输出显示在第二次调用
rsync
.rsync
为发送者启动一个子进程,为接收者启动一个子进程,它们在它们之间来回发送校验和和数据。rsync
校验和文件块。默认情况下,块大小取决于文件大小。如果发送方和接收方之间的块校验和不匹配,则传输整个块。最后一个块是通过添加一个字符串来修改的,因此必须转移。这就是为什么您会看到正在传输的 131171 个字节,而不仅仅是文件中实际更改的字节数(此特定文件的块大小约为 130 KB)。另请参阅手册
-B
中的选项。rsync
您没有传输整个文件,但源和目标都被完整读取以确定差异。
与
--no-whole-file
您交换了一个简单的“通过完整复制文件来替换文件”与更复杂的“读取源并计算其校验和;读取目标并计算其校验和;更新差异”。在我这里的一个系统上,执行第二个操作比仅覆盖原始操作要花费更长的时间。(在几次尝试中,时间的差异约为 +/- 3 秒。)
--whole-file
--no-whole-file
rsync
有时不使用增量传输算法有(很好的)原因。