我有两个分区映像(A 和 B),我想用它们创建一个补丁,然后将其应用到另一台计算机上的 A 上,这样就可以在不淹没网络的情况下获取新的 B 映像。我有以下要求:
- 适用于 Linux
- 可以创建差异
- 可以使用 diff 来修补文件
- 可以处理二进制文件
- 可以处理大文件(几百 GB 就可以了)
- 无需用户交互(仅需一个控制台应用程序)
- 理想情况下,应该能够从管道读取/写入管道(以便我可以从 gzip 压缩文件传输到管道并写入其中一个)
有这样的事吗?
答案1
您可能应该看看与 rsync 相关的工具:差分和rdiff-备份。该rdiff
命令允许您生成补丁文件并将其应用到其他文件。
该rdiff-backup
命令使用此方法来处理整个目录,但我猜您正在处理单文件磁盘映像,因此rdiff
将使用它。
答案2
答案3
规范答案
关于差分该帖子,librsync 2.0.1 对于命令功能说明来说,是一篇很好的读物,所以我在下面引用了它,以便将内容保留到这个答案中,如果没有别的。
尝试很好地理解 rdiff 非常重要更新文件的三个步骤:签名,三角洲, 和修补正如在差分手册页。我还在rdiff
GitHub 上找到了一个很有用的命令示例脚本,我将参考和引用它。
本质上...
- 使用“起始”或基础文件 [
file1
] 并创建一个签名文件从中
- 这通常比基础/原始文件本身小得多
- 随着签名文件将它与另一个文件 [
file2
] 进行比较,该文件与你的基础文件类似,但不同(例如最近更新)并创建一个增量文件仅包含两个文件之间的差异- 使用“仅差异”或增量文件并将其与基础文件 [ ] 进行比较,以生成一个新文件,其中包含与两者匹配的
file1
另一个文件 [ ] 的更改。file2
快速命令(每rdiff-example.sh
)
rdiff signature file1 signature-file ## signature base file1
rdiff delta signature-file file2 delta-file ## delta differences file2
rdiff patch file1 delta-file gen-file ## compare delta to file1 to create matching file2
# $ rdiff --help # Usage: rdiff [OPTIONS] signature [BASIS [SIGNATURE]] # [OPTIONS] delta SIGNATURE [NEWFILE [DELTA]] # [OPTIONS] patch BASIS [DELTA [NEWFILE]] # Options: # -v, --verbose Trace internal processing # -V, --version Show program version # -?, --help Show this help message # -s, --statistics Show performance statistics # Delta-encoding options: # -b, --block-size=BYTES Signature block size # -S, --sum-size=BYTES Set signature strength # --paranoia Verify all rolling checksums # IO options: # -I, --input-size=BYTES Input buffer size # -O, --output-size=BYTES Output buffer size # create signature for old file rdiff signature old-file signature-file # create delta using signature file and new file rdiff delta signature-file new-file delta-file # generate new file using old file and delta rdiff patch old-file delta-file gen-file # test diff -s gen-file new-file # Files gen-file and new-file are identical
介绍
rdiff 是一个用于计算和应用网络增量的程序。rdiff 增量是二进制文件之间的增量,描述如何自动编辑基础(或旧)文件以生成结果(或新)文件。
与大多数 diff 程序不同,librsync 在计算 diff 时不需要访问两个文件。计算增量只需要旧文件的简短“签名”和新文件的完整内容。签名包含旧文件块的校验和。使用这些校验和,rdiff 在新文件中找到匹配的块,然后计算增量。
rdiff delta 通常比 xdelta 或常规文本 diff 更不紧凑,生成速度也更慢。如果在计算 delta 时可以同时存在旧文件和新文件,xdelta 通常会生成小得多的文件。如果要比较的文件是纯文本,那么 GNU diff 通常是更好的选择,因为 diff 可以被人类查看并应用为不精确匹配。
当不方便同时保存两个文件时,rdiff 就派上用场了。一个例子是两个文件位于不同的机器上,而您只想传输差异部分。另一个例子是其中一个文件已移至存档或备份媒体,只留下其签名。
象征性地
signature(basis-file) -> sig-file delta(sig-file, new-file) -> delta-file patch(basis-file, delta-file) -> recreated-file
使用模式
rsync 算法的一个典型应用是将文件 A2 从机器 A 传输到具有类似文件 A1 的机器 B。这可以按如下方式完成:
- B 生成 A1 的 rdiff 签名。称之为 S1。B 将签名发送给 A。(签名通常比它描述的文件小得多。)
- A 计算 S1 和 A2 之间的 rdiff 增量。将此增量称为 D。A 将增量发送给 B。
- B 应用增量来重新创建 A2。如果 A1 和 A2 包含相同字节,则 rdiff 应可节省大量空间。
答案4
差分双模是一个输出两个(二进制)文件之间差异的程序。