我的问题与为什么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
有时不使用增量传输算法有(充分的)理由。