ntfsclone 映像的增量备份

ntfsclone 映像的增量备份

我正在尝试使用 Linux 上的 ntfsclone 对 Windows 分区进行压缩增量备份。目前,我正在使用以下命令制作完整的 ntfsclone 映像:

sudo ntfsclone -s -t -o - /dev/sda2 | xz -zc > new-backup.ntfsclone.xz

我想要做的是通过使用以前的备份和 ntfsclone 输出流创建增量文件来执行增量备份,而不是在每次备份会话中创建一个新的 ntfsclone 映像。

我知道创建二进制文件的差异并不容易,并且有几种工具(rdiff、xdelta、bsdiff 等)可用于此目的;但是,它们都要求两个源文件存在于磁盘上,并且不能直接从输出流比较数据。


换句话说,是否有任何针对二进制流的解决方案可以执行类似以下命令的操作?

diff -u <(xz -dc old-backup.ntfsclone.xz) \
<(sudo ntfsclone -s -t -o - /dev/sda2) \
| xz -zvc > new-backup.ntfsclone.delta.xz

显然,上述命令不起作用,但我希望能够解压缩旧映像,将其与 Windows 分区的 ntfsclone 表示进行比较,并通过一步从比较中创建压缩的增量映像。


一些条件如下:

  • 过程必须使用ntfs克隆
  • 增量版本必须可修补直接地到磁盘
  • 最好一切都在一个步骤中完成

还可以(并且可能是更好的选择)通过将 ntfsclone 映像还原到管道并通过直接与 进行比较来创建差异文件/dev/sda2,因为这可能会创建较小的输出文件,但这样做会使过滤未分配的磁盘空间变得复杂。

(也就是说,我们必须将未使用的磁盘空间清零,或者采取某种措施diff -u <(xz -dc old-backup.ntfsclone.xz | ntfsclone -r -t -o - -) <(sudo ntfsclone -t -o - /dev/sda2) | xz -zc > new-backup.img.delta.xz来阻止存档所有已删除的文件数据。真恶心!)

有谁愿意接受吗?


笔记:一个叫做ntfsddup经过魏东确实存在可以实现几乎完全实现这一点的东西,但我很难让它工作。该软件位于非常早期阶段,需要大量工作。


答案1

我成功使用了一个名为 bup(基于 git)的工具,它可以高效地存储仅有细微差别的大型二进制文件。它与 nfs 配合使用效果也很好,这对我来说很方便,因为我有一个 nfs 服务器,里面有大量空间可以保存数据:

例如,从我的笔记本电脑备份 ntfs 映像 (diaz)

export BUP_DIR=/mnt/t3/big1/diaz/ntfsbup
ntfsclone -s -o - /dev/sda2 | bup split -n sda2.img

恢复(至不同的驱动器):

bup join sda2.img | ntfsclone -r -O /dev/sdb9 -

或先前版本:

bup join sda2.img^ | ntfsclone -r -O /dev/sdb9 -

或者

bup join sda2.img~2 | ntfsclone -r -O /dev/sdb9 -

答案2

不久前,我编写了一个程序,可以在 ntfsclone 映像之间创建有效的增量。

https://github.com/koljanowak/ntfscloneimgdelta

这特别简单,因为 ntfsclone 映像的文件格式非常简单。它们本质上只是一系列字节,表示“1:这是下一个 ntfs 簇”,后面跟着一个 ntfs 簇,或者“0:下一个簇未使用”,后面什么都没有。我的增量文件使用完全相同的文件格式,添加了第三个情况“2:两个映像中的下一个簇相同”,后面什么都没有。

Usage: ntfscloneimgdelta delta OLDFILE [NEWFILE [DELTA]]
       ntfscloneimgdelta patch OLDFILE [DELTA [NEWFILE]]

OLDFILE 和 NEWFILE 不需要按时间顺序升序排列,您只需交换它们即可创建反向增量。这样,您就可以始终将最新备份作为完整转储,并将较旧的转储作为增量保留。

省略文件名或用“-”替换它们将使用 stdin 或 stdout。这样,您可以一次性对分区进行新的转储,并在此转储和上一次转储之间创建反向增量。

相关内容