我目前正在开发一个Xen备份系统,但是遇到了以下问题:
我有两种备份方法:
dd
从 LVM 快照执行,然后tar
将其挂起,然后远程 rsync- 挂载 LVM 快照并将所有内容 rsync 到远程位置
现在第二个选项允许我使用, rdiff-backup
这样我就可以保存增量备份并节省大量空间,而第一个选项的存储空间确实很大。
现在我有两个问题:
- 有没有办法在使用时不出现“空白”
dd
?假设我有一个 50GB 的 LVM 卷,但只使用了 3 GB,那么在使用时dd
将创建一个 50 GB 的映像(因此浪费了 47 GB)。tar
可以解决这个问题,但需要很多额外的时间(我基本上没有时间) - 这些
img
创建的文件能dd
以某种方式逐步保存吗?
答案1
压缩空白处
让我们从快照中回顾一下基础知识。首先,我要请您看看为什么要打包一个文件。停下来想一想 tar 的作用是什么以及为什么要这样做。
$ dd if=/dev/zero of=zero bs=$((1024*1024)) count=2048
2048+0 records in
2048+0 records out
2147483648 bytes transferred in 46.748718 secs (45936739 bytes/sec)
$ time gzip zero
real 1m0.333s
user 0m37.838s
sys 0m1.778s
$ ls -l zero.gz
-rw-r--r-- 1 user group 2084110 Mar 11 16:18 zero.gz
由此可见,压缩在原本空白的空间上为我们带来了大约 1000:1 的优势。无论系统是否支持稀疏文件,压缩都可以正常工作。还有其他算法可以更严格地压缩,但就原始整体性能而言,压缩gzip
更胜一筹。
Unix 实用程序和稀疏文件
假设一个支持稀疏文件的系统,dd
有时会有一个节省空间的选项。奇怪的是,我的 Mac 包含一个dd
带有conv=sparse
标志的版本,但 HFS+ 文件系统不支持它。相反,我用于测试的全新 Debian 安装支持 ext4 中的稀疏文件,但该安装dd
没有标志。去想想吧。
因此,另一个练习:
我将 /dev/zero 复制到与上述相同的文件中。它占用了文件系统上的 2G 空间,如 、 和 所证实du
。df
然后ls
我使用cp
它,发现有 2 个文件占用了 4GB 空间。所以,是时候尝试另一个标志了:
`cp --sparse=always sparse sparse2`
使用它可以强制 cp 接受常规文件,并在看到一长串零时使用稀疏分配。现在我有 2 个文件,根据 报告占用 4GB ls
,但根据du
和 报告仅占用 2GB df
。
现在我有一个稀疏文件,cp 会表现如何?是的。cp sparse2 sparse
结果显示ls
每个文件占用了 2GB 的空间,但du
显示它们在文件系统上占用了零个块。结论:一些实用程序会尊重已经稀疏的文件,但大多数会将整个文件写回。cp
除非你强迫它尝试,否则 Even 不知道将写入的文件恢复为稀疏文件。
接下来,我创建了一个 1MB 的文件,并将其设为稀疏条目,然后尝试在 中编辑它vim
。尽管只输入了几个字符,但我们又回到了使用整个文件。快速搜索找到了类似的演示:https://unix.stackexchange.com/questions/17572/what-is-the-interaction-of-the-rsync-size-only-and-sparse-options
结论不明确
所以我的想法是:
- 使用 LVM 进行快照
- 跑步零自由针对快照
- 使用
rsync -S
稀疏文件复制导致 - 如果您不能使用 rsync,请在您通过网络传输时对快照进行 gzip 压缩,然后
cp --sparse=always
针对未展开的图像运行以创建稀疏副本。
差异备份
块设备上的差异备份的缺点是,内容可能会发生一些移动,并产生大量难以处理的差异。StackOverflow 上有一些讨论:https://stackoverflow.com/questions/4731035/binary-diff-and-patch-utility-for-a-virtual-machine-image得出的结论是最佳用途是 xdelta。如果您要这样做,请再次尝试先将空白空间清零。
答案2
您的两个问题...
dd 只是将扇区作为图像。没有办法告诉它跳过空白点;它将创建您正在复制的驱动器的忠实图像。但是,如果您通过压缩实用程序(如 zip 或 7z)重定向输出,空白应该会缩小它以获得几乎相同的效果。它仍然需要时间(因为 dd 实用程序仍在复制空白),但存储的大小因子将大大减少;我有一个来自 VMWare 的 100+gb 磁盘映像,由于未使用的空间,它压缩到大约 20gb。
至于增量保存,据我所知没有。dd 如何知道哪些已更改,哪些未更改?它实际上不是为此而设计的。增量保存很可能必须使用 rdiff-backup 或 rsync 等实用程序并压缩它们,并在文件级别完成。
答案3
tar
无法修复浪费的空间,除非它恰好充满了零(通常不会)。按照 Jeff 的建议运行工具将可用空间清零会导致快照占用大量数据,花费大量时间并占用大量快照后备存储空间。你不想挂载快照或那样的原因是什么rsync
?rdiff-backup
你可能还会看看dump
哪些可以快速备份快照而无需挂载它(如果它是 ext[234] )并执行多级增量备份。对于具有许多小文件的文件系统,它可以比 tar 或 rsync 快得多。它还可以进行多线程压缩。