使用 dd 和 conv=sparse 创建分区或完整磁盘映像?

使用 dd 和 conv=sparse 创建分区或完整磁盘映像?

由于某种原因,关于使用 dd 创建“较小”图像文件的问题或答案似乎并不多,conv=稀疏选项。

因此,当使用 dd 创建图像时,我可以安全地使用例如dd if=/dev/sda of=/media/储存设备/sda.img conv=sparse获取在目标上使用(更少)空间的图像文件?

不知道这是否重要,但在这种情况下,源将是具有 EXT4 文件系统的 SSD,并且仅使用了 15%(因为它很新),并且目标也将使用 EXT4 fs。

或者这可能是一个相当糟糕的想法(在某些情况下)并且可能会导致问题(以后,例如当我需要恢复它时)?

我还想知道当目标是网络挂载或文件系统时这是否会起作用?

目标是获取一个分区或(更好的是)整个磁盘的映像文件,该文件不会占用比所需更多的空间,同时保持其易于安装和使用。

额外的压缩实际上并不是需要或想要的,而且我猜它通常也会使生成的图像不再可安装,所以我可以没有它。

我知道 Clonezilla 可以做一些事情,比如只保存使用过的扇区,但我不喜欢它的局限性,例如由于图像格式限制,无法浏览或安装该图像(当然 dd 在每个系统上都已经可用。)

提前谢谢了

答案1

我发现实现此目的的最简单方法是使用适当的工具(Linux 上为 fstrim,Windows 上无论该工具叫什么)修剪驱动器上的所有分区,然后使用压缩器将 gpt 分区表转储到文件中gdiskdd每个分区通过压缩器(我通常使用 zstd 以提高速度)并将输出的压缩图像与分区表转储一起保存。您将每个分区映像压缩到使用空间的大小以下,稍后将映像重新发送到空驱动器上是微不足道的。我对每一台全新的笔记本电脑都这样做,在删除驱动器并安装 Linux 之前获取干净的出厂映像,如果我需要将机器送去保修或决定出售它,将其恢复到出厂状态很简单。

答案2

无法回答conv=sparse使用是否明智/安全,但dd如果您“准备”源磁盘,则与压缩(我使用 zstd)一起使用将获得稀疏结果。

我拍摄了一张安装了 Win 11 的 256GB SSD 的图像。

在 Windows 中,我修剪了 NTFS 分区,将所有可用空间写入零,然后再次进行修剪:

修剪:defrag C: /L

Windows 内部零可用空间:(sdelete -z C:来自 sysinternals)

dd我使用和从 Linux 制作了一个图像ztd

dd bs=1024K if="/dev/nvme0n1" | pv --size 256060514304 | zstd --quiet --force -o "/mnt/data/image.img.zst"

图像是用大约150-350MB/秒

之后,当运行到源磁盘的空闲空间时,数据被处理为1.2GB:-) 并且图像文件仅增加了约 100KB,占用了剩余的 220GB 可用空间。

我认为这和“真正的”稀疏一样好。图像文件的大小为19.3GB。W11 安装大小为 48GB(如果您在 Windows 安装中删除页面文件,您可能会节省一些额外的 MB/GB)。

恢复图像

zstd --quiet --stdout --decompress "/mnt/disk1/image.img.zst" | pv | dd bs=1024K of="/dev/nvme0n1"

额外信息:
在 Linux 中将已安装的分区清零cat /dev/zero | pv > /mnt/dis1/zero.dat
另一个示例:W10 LTSC,安装大小 (C:) 18.2GB(无页面文件):
dd 的图像大小:6.26GB
dism 的图像大小:6.28GB

相关内容