我使用 dd 备份我的 ubuntu,但是备份镜像太大

我使用 dd 备份我的 ubuntu,但是备份镜像太大

我使用命令 dd if=/dev/sda | gzip > /media/test/system_backup.img.gz 备份我的磁盘。但是 system_bakcup.img.gz 高达 5GB,而当我压缩此文件时,system_backup.img 只有 3.5GB,请帮帮我!

答案1

这种备份技术的一个缺陷是,不管分区上实际存储了多少数据,你都可能会复制大量垃圾数据。为什么?因为当你向驱动器添加更多文件然后删除它们时,旧文件的数据不会消失(除非你明确覆盖该内存)。它们都还在那里。当你执行块设备复制(即使用 dd 复制数据)时,它根本不知道你已删除的泰坦尼克号 DVD 的残余部分不再是你想要的东西。它只是漫无目的地复制字节。即使你不关心那张 DVD,gzip 也不知道这一点,所以它会压缩这张不可压缩的 DVD,尽管它本质上是垃圾。

如何修复此问题?

嗯,你可以进行文件级备份,

tar -zcvf /media/test/system_backup.tar.gz /wherever/sda/is/mounted

但是如果您要进行文件级备份,则应该研究增量备份方案。

如果您想坚持使用块级备份选项,也许您可​​以通过确定驱动器上剩余的空间然后使用(例如 1 GB 的可用空间)将零写入空白空间:

dd if=/dev/zero of=/path/on/drive/zeros.bin bs=1M count=1024

然后,如果您运行相同的备份命令,它应该更小(重复的零很容易压缩)。

但即便如此,您仍然会复制不需要的垃圾(即所有那些零)。如果您可以保证所需的所有数据都在分区的开头(这取决于文件系统,可能需要碎片整理),您可以将备份大小限制为已用空间量,因此类似于(例如,已用空间为 2GB)

dd if=/dev/sda bs=1M count=2048 | gzip > /media/test/system_backup.img.gz

您可以使用 dh 来获取已用的空间量:

 df -m /dev/sda | tail -n 1 | tr -s ' ' | cut -d ' ' -f 2

您可以将其包含在 dd 命令中,例如

dd if=/dev/sda bs=1M count=`df -m /dev/sda | tail -n 1 | tr -s ' ' | cut -d ' ' -f 3` | gzip > /media/test/system_backup.img.gz

只是一些想法,你必须尝试一下才能知道它是否真的有效。:-)

编辑:一些额外的说明(通过查找我在手册页中使用的标志,您不会找到任何内容):

在 dd 命令中,bs 指定复制的块大小。从硬盘驱动器复制时,以与驱动器缓存大小相同的块进行复制是最有效的。不过,您不必太担心这一点。事实上,您实际上不必指定块大小,但如果您不知道默认值,则很难确定需要复制多少块才能复制正确数量的数据。为了方便,我选择了 1MB 块,计数标志指定要复制多少块(因此 10 个块复制 10 MB 的数据)。

df 命令将给出存储设备的使用率。-m 选项以 MB 为单位显示(而不是默认的 KB)。仅输入该命令,tail、tr 和 cut 命令的必要性就应该很明显(tail 获取最后一行,tr 删除为格式化而插入的多余空格,cut 按空格拆分输出并返回第三个元素(索引为 0、1、2),即已使用的空间。

答案2

您应该使用 Live CD/DVD/USB 来执行此操作,以确保图像一致

您的驱动器可能充满了已删除的数据模式,导致映像比需要的更大。如果是这种情况,您也可以使用 dd 修复此问题。

1)dd if=/dev/zero of=/delete.me

这将创建一个全是零的文件(高度可压缩),并将一直运行直到磁盘已满,此时它将因空间不足而失败。这是可以的。

2)创建完零文件(delete.me)后,使用以下命令删除它

rm /delete.me

3)再次尝试备份。由于以前使用的空间现在将被清零,最终结果应该是一个较小的图像。

答案3

除非您知道在备份时磁盘没有任何改动,否则您不应该这样做,否则生成的图像不仅会很大而且会不一致,此外在某些情况下几乎无法用于恢复目的。

为了解决这个问题,您可以使用 LVM-2 的快照,但更明智的做法是不要一次又一次地备份整个磁盘。

答案4

另一种解决方案dd if=/dev/zero of=/delete.me是使用:

apt-get install secure-delete
sudo sfill -lvz /home

在您拨打dd电话之前。

此函数的作用是将磁盘上的所有可用字节转换为 0。信息这里

在我使用 64GB SD 卡的 raspbian raspberry pi4 上,这个方法奏效了。我的ddgzip 图像从 50GB 增加到了 800MB。不过,运行大约需要 4 个小时。

相关内容