大文件的“硬链接”部分,其中只有一小部分发生了变化

大文件的“硬链接”部分,其中只有一小部分发生了变化

我使用 rsync 进行备份:

rsync -a --link-dest=PATHTO/$PREVIOUSBACKUP $SOURCE $CURRENTBACKUP

这样我就可以通过使用硬链接来节省空间。

当我需要备份一个总是在变化的大文件(虚拟机映像)时,就会出现问题。

是否可以不硬链接整个图像,而只硬链接更改的部分?有没有什么工具可以解决这个问题?

答案1

这里可以做很多事情。请注意,它们实际上都没有使用硬链接,因为它们只能指向完整文件。使用btrfs文件系统在这里开辟了一些非常有用的可能性。请注意,btrfs目前(最新版本是 v3.13)仍处于实验阶段。然而,其奶牛(写时复制)能力对于这种事情来说是完美的(当然,前提是在同一文件系统上进行备份是可以接受的)。考虑btrfs安装在 上的文件系统/mnt,您可以使用以下命令创建整个文件系统的原子快照:

btrfs subvolume snapshot /mnt /mnt/snapshot

为了允许部分快照,您必须将要备份的文件放在一个目录中,subvolume而不是一个目录中。例如:

btrfs subvolume create /mnt/subvol
mv stuff /mnt/subvol
btrfs subvolume snapshot /mnt/subvol /mnt/subvol_snapshot

除了使用 之外btfrs,您还可以考虑将虚拟机映像安装在备份的一侧或两侧,并rsync在两个安装点之间使用。

这个博客显示如何.vdi使用安装 Virtual Box 映像qemu-utils。作为 root 的命令(未经测试):

modprobe nbd
qemu-nbd -c /dev/nbd0 <vdi-file>
mount /dev/nbd0p1 /mnt
...
umount /mnt
qemu-nbd -d /dev/nbd0

最后,可能有用的最简单方法是--inplace的选项rsync。从手册页:

--inplace
          This option changes how rsync transfers a file when its data needs to
          be updated: instead of the default method of creating a new copy of the
          file and moving it into place when it is complete, rsync instead writes
          the updated data directly to the destination file.
...
          This option is useful for transferring large files with block-based
          changes or appended data, and also on systems that are disk bound, not
          network bound.

--link-dest当然,这里的问题是,结合使用它(在 <2.6.4 版本中,两者完全不兼容)没有任何好处,rsync因为仍然必须在目的地创建文件的副本。

相关内容