linux上大文件的二进制差异/补丁?

the*_*ejh 16 linux diff patch

我有两个分区映像(A 和 B),我想用它们来创建一个补丁,我可以在另一台计算机上的 A 上应用该补丁,以便在不淹没网络的情况下获得新的 B 映像。我有以下要求:

  • 适用于 Linux
  • 可以创建差异
  • 可以使用差异来修补文件
  • 可以处理二进制文件
  • 可以处理大文件(几百 GB 应该可以工作)
  • 不需要用户交互(只是一个控制台应用程序)
  • 理想情况下,应该能够读取/写入管道(这样我就可以从 gzip 压缩的文件中输入管道并写入一个)

这样的东西存在吗?

njd*_*njd 14

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

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

  • rdiff 的“签名”和“delta”意味着什么?手册页没有说。 (2认同)

afr*_*ier 8

xdelta可以做你想做的一切。不过,公平警告,如果您的图像不是相似,您最终可能会得到一个非常大的补丁,因为 xdelta 使用已定义内存缓冲区的一半来查找差异。更多信息可在TuningMemoryBudget wiki 页面获得。增加缓冲区大小可能会有所帮助。

bsdiff是另一种选择,但它非常需要RAM,并且完全不适合任何大小的磁盘映像。

bsdiff非常需要内存。它需要max(17*n,9*n+m)+O(1)字节的内存,其中n是旧文件m的大小, 是新文件的大小。bspatch需要n+m+O(1)字节。


Vom*_*yle 6

规范答案

关于rdiff这篇文章,librsync 2.0.1 是一个很好的命令功能说明的读物,所以我在下面引用了它以保留这个答案的内容,如果没有别的。

尝试很好地理解 rdiff更新文件的三个步骤是很重要的signaturedeltapatch,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
Run Code Online (Sandbox Code Playgroud)

rdiff-example.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
Run Code Online (Sandbox Code Playgroud)

介绍

rdiff 是一个计算和应用网络增量的程序。rdiff delta 是二进制文件之间的delta,描述了如何自动编辑基础(或旧)文件以生成结果(或新)文件。

与大多数差异程序不同,计算差异时,librsync 不需要访问这两个文件。计算增量只需要旧文件的简短“签名”和新文件的完整内容。签名包含旧文件块的校验和。使用这些校验和,rdiff 在新文件中找到匹配的块,然后计算增量。

与 xdeltas 或常规文本差异相比,rdiff deltas 通常不太紧凑,而且生成速度也较慢。如果在计算 delta 时可以同时存在旧文件和新文件,xdelta 通常会生成一个小得多的文件。如果要比较的文件是纯文本,那么 GNU 差异通常是更好的选择,因为人类可以查看差异并将其应用为不完全匹配。

当两个文件同时存在不方便时, rdiff 就派上用场了。一个例子是这两个文件位于不同的机器上,而您只想传输差异。另一个例子是当其中一个文件被移动到存档或备份媒体时,只留下它的签名。

象征性地

signature(basis-file) -> sig-file

delta(sig-file, new-file) -> delta-file

patch(basis-file, delta-file) -> recreated-file
Run Code Online (Sandbox Code Playgroud)

使用模式

rsync 算法的一个典型应用是将文件 A2 从机器 A 传输到具有类似文件 A1 的机器 B。这可以按如下方式完成:

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

来源