我使用 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
因为仍然必须在目的地创建文件的副本。