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

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

我读了几篇指南,了解如何将 btrfs 快照与 rsync 结合起来,形成一个具有历史记录的高效备份解决方案。然而,这一切都取决于它是否rsync --inplace只修改实际更改的文件部分,或者它是否按顺序覆盖整个文件。如果它写入整个文件,那么 btrfs 似乎总是会创建该文件的新副本,这会使这个想法效率大大降低。

答案1

总结- 您需要选项--inplace,并且如果在本地文件系统之间复制,您还需要--no-whole-file

如果您向 rsync 传递两个本地路径,它将默认使用“--whole-file”,而不是增量传输。Rsync 假设它可以写入一个全新的文件并取消链接旧文件,这比读取两个文件并计算更改的块要快。如果它不计算更改,则 btrfs 不会观察到块级更改。因此,--no-whole-file除了 之外,--inplace您还需要 。如果您请求“-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”验证它是否重新使用了 inode,但请注意它发送了整个 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

答案2

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

   --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.

答案3

rsync 的增量传输算法处理是否传输整个文件或仅传输不同的部分。这是在两台机器之间 rsync 文件以节省带宽时的默认行为。可以使用--whole-file(或-W) 覆盖此操作以强制rsync传输整个文件。

--inplace处理rsync在传输过程中是否创建临时文件。默认行为是创建临时文件。这提供了一种安全措施,即如果传输中断,目标计算机中的现有文件将保持完整/不变。--inplace覆盖此行为并指示rsync直接更新现有文件。这样,如果传输中断,您将面临目标计算机中文件不一致的风险。

答案4

从手册页中:

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 几乎不可能以任何其他方式工作。

相关内容