rsync --inplace是写入整个文件还是仅写入需要更新的部分?(用于btrfs + rsync备份)


21

我正在阅读一些指南,介绍如何将btrfs快照与rsync结合使用,以构成具有历史记录的高效备份解决方案。但是,这完全取决于是否rsync --inplace仅修改文件中那些实际更改的部分,还是按顺序覆盖整个文件。如果它写入整个文件,那么btrfs似乎总会创建该文件的新副本,这会使该想法的效率大大降低。


它甚至怎么知道是否可以避免写入整个文件?它不是需要先读取整个文件,以了解发生了什么变化吗?
Mehrdad

2
@Mehrdad是的,的确如此,但是阅读全文不是问题。如果rsync读取整个文件,然后查找并仅更新所需的那些部分,则btrfs将仅复制这些更新的块。但是,如果rsync读取写入整个文件,那么这将是一个问题。
PetrPudlák'13年

1
@Mehrdad rsync不仅知道它可以避免写入整个文件,而且可以做到这样,而无需将其完全复制到网络上。聪明的小程序。
Gunther Piez

Answers:


31

如果传递rsync两个本地路径,它将默认使用“ --whole-file”,而不是增量传输。因此,您要寻找的是“ --no-whole-file”。如果您请求“ -c”,您还将获得增量传输。

您可以通过以下方式进行验证:

$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3

sent 196831 bytes  received 72 bytes  393806.00 bytes/sec
total size is 196608  speedup is 1.00

然后触摸文件并重新同步

$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1

sent 65662 bytes  received 31 bytes  131386.00 bytes/sec
total size is 196608  speedup is 2.99

您可以通过“ ls -li”验证它是否已重新使用了索引节点,但是请注意它已发送了整个64K字节。使用--no-whole-file再试一次

$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1

sent 494 bytes  received 595 bytes  2178.00 bytes/sec
total size is 196608  speedup is 180.54

现在,您只发送了494个字节。您可以使用strace进一步验证是否写入了任何文件,但这至少显示了使用增量传输。

请注意(请参阅注释),--whole-file假设是针对本地文件系统的(请参见rsync的手册页)。另一方面,--no-whole-file假设是跨网络的,则--inplace其自身的行为将与相同--inplace --no-whole-file


为什么不--inplace暗示--no-whole-file
Geremia'9

--no-whole-file反正不是默认值吗?
Geremia

2
@Geremia不是两条路径都是本地的。我的示例表明,--inplace这并不意味着--no-whole-file我在2013年使用的rsync版本,但是欢迎您使用自己的rsync版本重复此实验。
无数据,2016年

好吧,inplace这不是“扫描相同/不同的块”,而是要立即从偏移量0开始覆盖现有文件。(否则,将建立一个临时副本,然后才删除旧的目标文件并重命名临时副本。如果该进程被中断,则尽可能长时间地保留旧文件可能被认为“更安全”。当然,这对于性能,峰值存储消耗(认为大文件),碎片可能更糟……)...
弗兰克·诺克(Frank Nocke)17-2-27

1
我认为,这--no-whole-file总是相反,总是暗示--inplace,否则它的大部分性能提升将消失。找不到记录,但是...
Frank Nocke

15

我猜这里是肯定的答案,引用了手册的正确部分:

   --inplace

          [...]

          This option is useful for transferring large files
          with  block-based  changes  or  appended data, and
          also on systems that are disk bound,  not  network
          bound.   It  can  also  help  keep a copy-on-write
                                               *************
          filesystem snapshot from diverging the entire con‐
          *******************
          tents of a file that only has minor changes.

4

--inplace仅覆盖已更改的区域。写入Btrfs时始终使用它。


您是否有证据表明它不会覆盖文件的其他部分?
PetrPudlák2013年

ZFS是否同样适用?
ewwhite

@ewwhite:由于ZFS与BTRFS一样是COW(写时复制),因此可以。
Geremia'3

@PetrPudlák -vvv显示它跳过了匹配的块
Tom Hale

3

rsync的增量传输算法处理的是传输整个文件还是传输不同的部分。在两台计算机之间同步文件以节省带宽时,这是默认行为。可以使用--whole-file(或-W)替代它来强制rsync传输整个文件。

--inplace处理rsync在传输期间是否创建临时文件。默认行为是创建一个临时文件。这提供了一种安全措施,如果传输中断,则目标计算机中的现有文件将保持不变/不变。--inplace覆盖此行为并告知rsync直接更新现有文件。这样,如果传输中断,则可能存在目标计算机中文件不一致的风险。


2

从手册页:

This  option  changes  how  rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new  copy  of  the file and moving it into place when it is com-
plete, rsync instead writes the updated  data  directly  to  the
destination file.

这使我相信它会完全覆盖文件-我想rsync以任何其他方式工作几乎是不可能的。


2
在确定需要更新哪些部分后,它可以仅搜索并更新这些部分,而不用写入整个文件。
PetrPudlák'13年

0

本文描述了就地rsync的理论工作。

论文参考:D。Rasch和R. Burns。就地Rsync:移动和无线设备的文件同步。USENIX年度技术会议,FREENIX跟踪,91-100,USENIX,2003年。

从链接:

...我们修改了现有的rsync实现,以支持就地重建。

摘要:[...]我们已经修改了rsync,使其可以在空间受限的设备上运行。目标主机上的文件将在文件当前版本所占用的同一存储中进行更新。受空间限制的设备不能使用传统的rsync,因为它需要文件的旧版本和新版本都需要内存或存储空间。例如,在具有较小内存的蜂窝电话和手持式PC上同步文件。就地rsync算法对图形中文件的压缩表示进行编码,然后对其进行拓扑排序以实现就地属性。[...]

因此,这似乎是rsync --inplace正在执行的技术细节。根据本文开头:

我们对rsync进行了修改,以便它通过就地重建执行文件同步任务。[...]代替使用临时空间,对目标文件的更改在当前版本已经占用的空间中进行。该工具可用于在空间受限的情况下同步设备。

@dataless的答案可以清楚地看出,这意味着--inplace正在使用相同的存储空间,但是它仍然可以将整个文件复制到该空间中。具体来说,当从本地文件系统进行复制或复制到本地文件系统时,rsync将采用该--whole-file选项。但是,另一方面,如果它跨网络系统,则采用该--no-whole-file选项。


1
嗯,答案是什么?
Xen2050

我很抱歉。我没有给予足够的重视。用@dataless的答案,这应该可以清除一切。
对角线
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.