我有两个分区映像(A 和 B),我想用它们来创建一个补丁,我可以在另一台计算机上的 A 上应用该补丁,以便在不淹没网络的情况下获得新的 B 映像。我有以下要求:
这样的东西存在吗?
njd*_*njd 14
您可能应该看看与 rsync 相关的工具:rdiff和rdiff-backup。该rdiff
命令允许您生成补丁文件并将其应用于其他文件。
该rdiff-backup
命令使用这种方法来处理整个目录,但我猜您正在处理单文件磁盘映像,因此rdiff
将使用该方法。
xdelta可以做你想做的一切。不过,公平警告,如果您的图像不是很相似,您最终可能会得到一个非常大的补丁,因为 xdelta 使用已定义内存缓冲区的一半来查找差异。更多信息可在TuningMemoryBudget wiki 页面获得。增加缓冲区大小可能会有所帮助。
bsdiff是另一种选择,但它非常需要RAM,并且完全不适合任何大小的磁盘映像。
bsdiff非常需要内存。它需要
max(17*n,9*n+m)+O(1)
字节的内存,其中n
是旧文件m
的大小, 是新文件的大小。bspatch需要n+m+O(1)
字节。
关于rdiff这篇文章,librsync 2.0.1 是一个很好的命令功能说明的读物,所以我在下面引用了它以保留这个答案的内容,如果没有别的。
尝试很好地理解 rdiff更新文件的三个步骤是很重要的:signature、delta和patch,如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
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)# $ 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 delta 是二进制文件之间的delta,描述了如何自动编辑基础(或旧)文件以生成结果(或新)文件。
与大多数差异程序不同,计算差异时,librsync 不需要访问这两个文件。计算增量只需要旧文件的简短“签名”和新文件的完整内容。签名包含旧文件块的校验和。使用这些校验和,rdiff 在新文件中找到匹配的块,然后计算增量。
与 xdeltas 或常规文本差异相比,rdiff deltas 通常不太紧凑,而且生成速度也较慢。如果在计算 delta 时可以同时存在旧文件和新文件,xdelta 通常会生成一个小得多的文件。如果要比较的文件是纯文本,那么 GNU 差异通常是更好的选择,因为人类可以查看差异并将其应用为不完全匹配。
当两个文件同时存在不方便时, rdiff 就派上用场了。一个例子是这两个文件位于不同的机器上,而您只想传输差异。另一个例子是当其中一个文件被移动到存档或备份媒体时,只留下它的签名。
象征性地
Run Code Online (Sandbox Code Playgroud)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 delta。将此增量称为 D。 A 将增量发送给 B。
- B 应用增量来重新创建 A2。在 A1 和 A2 包含相同字节运行的情况下, rdiff 应该显着节省空间。
归档时间: |
|
查看次数: |
17563 次 |
最近记录: |