问题: rsync是否能够基于字节进行文件比较?
严格来讲,是的:
- 它是以块为单位进行比较的,但您可以更改块大小。
- 您可以使用 --block-size=1(但这对于基本上所有情况都不合理和不适当)。
默认情况下,在网络上传输时使用基于块的滚动校验和。
使用 --no-whole-file 选项可以强制在本地使用此行为。 (见下文)
声明1. 在此情况下,计算校验和会导致速度降低。
这就是为什么默认情况下禁用本地传输的原因。
使用 --checksum 选项会强制读取整个文件,而不是默认的块对块增量传输校验和检查。
声明2. 现在,rsync 是否会逐字节检查本地源和目标文件,还是使用修改时间和/或大小来确定源文件是否需要备份?
默认情况下,它将使用大小和修改时间。
您可以使用 --size-only、--(no-)ignore-times、--ignore-existing 和 --checksum 的组合来修改此行为。
声明3. 我绝对不希望依靠文件大小或修改时间来决定是否应该进行备份。
然后您需要使用 --ignore-times 和/或 --checksum。
声明4. 如评论中所建议的提供 --ignore-times 不是一个选择。
也许使用 --no-whole-file 和 --ignore-times 正是您想要的? 这将强制使用增量传输算法,但对于每个文件都是如此,而不考虑时间戳或大小。
在我看来,只有在避免无意义的写入非常关键(尤其是要避免无意义的写入,而不是为了系统效率,因为对于本地文件来说进行增量传输实际上并不更有效),
并且有理由相信具有相同修改时间戳和字节大小的文件确实可能不同时,才会使用这些选项的组合。
我认为按修改时间戳和字节大小比较文件是确定更改文件的逻辑第一步。
如果您比较以下两个文件:
文件1(本地): File.bin - 79776451 字节
,修改时间为5月15日07:51
文件2(远程): File.bin - 79776451 字节
,修改时间为5月15日07:51
默认行为是跳过这些文件。 如果您不满意应该跳过这些文件,并希望它们进行比较,您可以使用
--no-whole-file
和 --ignore-times
强制执行块与块之间的比较和差分更新。
因此,在这一点上的总结是:
- 对于最有效的备份和归档,请使用默认方法
- 如果有必要,使用
--ignore-times
和--no-whole-file
强制执行增量更改(块与块校验和,仅传输差异数据)
- 使用
--checksum
和--ignore-times
成为完全偏执而浪费的人。
声明5。 请注意rsync指令中的-b
选项。这意味着在替换之前将备份目标文件。
是的,但这可以按您想要的方式工作,它并不一定意味着每次更新文件时都进行完整备份,并且肯定不意味着会完全传输。
您可以配置rsync:
- 保留一个或多个文件版本
- 使用
--backup-dir
配置它为完整的增量备份系统。
以这种方式进行操作不会浪费空间,除了需要保留差异数据所需的空间外,实际上没有浪费空间。我可以验证这一点,因为我的备份驱动器上几乎没有足够的空间来存储所有以前版本的完整副本。
一些补充信息
为什么增量传输不比本地复制整个文件更有效?
因为您没有跟踪每个文件的更改。如果您实际上有一个增量文件,您可以合并仅更改的字节,但是您首先需要知道这些更改的字节是什么。唯一能知道这一点的方法是通过读取整个文件。
例如:
我修改了一个10MB文件的第一个字节。
我使用带有增量传输的rsync同步此文件。
rsync立即看到第一个字节(或第一个块内的字节)已更改,并继续(默认情况下为--inplace)仅更改该块。
然而,rsync不知道只更改了第一个字节。它将保持校验和直到整个文件被读取。
就所有目的而言:
将rsync视为基于文件时间戳或大小是否更改有条件执行校验和的工具。覆盖此选项为--checksum基本等效于--no-whole-file和--ignore-times,因为两者都将:
无论时间和大小如何,操作每个文件。
读取文件的每个块以确定要同步哪些块。
那么好处在哪里呢?
整个过程是传输带宽和速度/开销之间的权衡。
--checksum是仅通过网络发送差异的好方法。
--checksum同时忽略具有相同时间戳和大小的文件是既仅通过网络发送差异的好方法,也最大化整个备份操作的速度。
有趣的是,将--checksum用作全局选项可能比强制每个文件的增量传输要有效得多。
cmp
的方式——即使是为了生成一个文件列表以管道传输到rsync
,也会将你节省的写入操作换成不必要的读取操作。相比之下,rsync
在检测到更改时至少会停止比较,而使用cmp
进行此操作的开销将被抵消甚至更多。 - hmedia1cmp
、bash
和cp
来制作自己的同步工具。你很快就会明白,出于我现在无法启示你的原因,你无法在所需的效率和准确性平衡方面超越rsync
。请记住,是你提出了这个问题。如果我恰好知道答案,我很乐意提供澄清,但你似乎对需要rsync
如何工作有坚定的信仰,而实际上并没有完全理解它。你接受的答案表明了这种缺乏理解。 - hmedia1