我读了几篇指南,了解如何将 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 几乎不可能以任何其他方式工作。