规范答案

规范答案

我有两个分区映像(A 和 B),我想用它们创建一个补丁,然后将其应用到另一台计算机上的 A 上,这样就可以在不淹没网络的情况下获取新的 B 映像。我有以下要求:

  • 适用于 Linux
  • 可以创建差异
  • 可以使用 diff 来修补文件
  • 可以处理二进制文件
  • 可以处理大文件(几百 GB 就可以了)
  • 无需用户交互(仅需一个控制台应用程序)
  • 理想情况下,应该能够从管道读取/写入管道(以便我可以从 gzip 压缩文件传输到管道并写入其中一个)

有这样的事吗?

答案1

您可能应该看看与 rsync 相关的工具:差分rdiff-备份。该rdiff命令允许您生成补丁文件并将其应用到其他文件。

rdiff-backup命令使用此方法来处理整个目录,但我猜您正在处理单文件磁盘映像,因此rdiff将使用它。

答案2

增量可以做你想做的一切。不过,如果你的图片非常类似地,你最终可能会得到一个非常大的补丁,因为 xdelta 使用定义的内存缓冲区的一半来查找差异。更多信息可参见调整内存预算wiki 页面。增加缓冲区大小可能会有很大帮助。

差异是另一种选择,但它非常RAM 占用巨大,并且完全不适合任何大小的磁盘映像。

差异占用大量内存。它需要max(17*n,9*n+m)+O(1)内存字节数,其中n是旧文件的大小,m是新文件的大小。调度需要n+m+O(1)字节。

答案3

规范答案

关于差分该帖子,librsync 2.0.1 对于命令功能说明来说,是一篇很好的读物,所以我在下面引用了它,以便将内容保留到这个答案中,如果没有别的。

尝试很好地理解 rdiff 非常重要更新文件的三个步骤:签名三角洲, 和修补正如在差分手册页。我还在rdiffGitHub 上找到了一个很有用的命令示例脚本,我将参考和引用它。

本质上...

  1. 使用“起始”或基础文件 [ file1] 并创建一个签名文件从中
    • 这通常比基础/原始文件本身小得多
  2. 随着签名文件将它与另一个文件 [ file2] 进行比较,该文件与你的基础文件类似,但不同(例如最近更新)并创建一个增量文件仅包含两个文件之间的差异
  3. 使用“仅差异”或增量文件并将其与基础文件 [ ] 进行比较,以生成一个新文件,其中包含与两者匹配的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-示例.sh

# $ 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。这可以按如下方式完成:

  1. B 生成 A1 的 rdiff 签名。称之为 S1。B 将签名发送给 A。(签名通常比它描述的文件小得多。)
  2. A 计算 S1 和 A2 之间的 rdiff 增量。将此增量称为 D。A 将增量发送给 B。
  3. B 应用增量来重新创建 A2。如果 A1 和 A2 包含相同字节,则 rdiff 应可节省大量空间。

来源

答案4

差分双模是一个输出两个(二进制)文件之间差异的程序。

相关内容