创建分区的映像(仅使用的空间)

创建分区的映像(仅使用的空间)

我有一个sdb1大小为 3.3 GB 的分区。从 3.3 GB 开始,仅使用了 1.9 GB,其中 1.2 GB 是空白空间。我想创建该分区的映像。但我希望图像只有已用空间,即 1.9 GB

现在,当我使用 dd 运行命令时:

dd if=/dev/sdb1 of=/home/data/Os.img bs=1M status=progress

我看到 dd 正在制作 3.3 GB 的映像,但我不希望未分配的空间成为操作系统映像的一部分。

所以我尝试了不同的解决方案。我找到了一个解决方案:

dd if=/dev/sdb1 of=/home/data/OS.img bs=1M count=1946 status=progress

该解决方案创建了 1.9 GB 的映像,因为我定义了 1M 的块大小,计数为 1946,总共将提供 1.9 GB。

问题 我无法确定这个 dd 命令是否只创建了已用空间的映像,或者它只是创建了一个大小为 1.9 GB 的映像,其中同时存在已用空间和未使用空间?

还有其他方法可以仅为已使用的空间创建图像吗?

答案1

这已得到答复这里

首先制作分区的图像。

然后使用losetup挂载镜像。由于它不是磁盘而是分区,因此不需要 partscan 标志。

# lsblk
# losetup --find foo.img

查找新创建的循环设备

# lsblk
loop1    7:1    0   4096M  0 loop 

通过写入一个大的空文件将剩余空间清零。

# mount /dev/loop1 /mnt
# dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M
# rm /mnt/filler
# umount /dev/loop1

现在压缩图像。

# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz

到目前为止,分区映像已经完成。

如果分区上有 ext4 文件系统,您可以使用以下命令调整其大小调整2fs大小到最小尺寸。这会将所有数据移动到第一个块。

e2fsck -f /dev/loop1
resize2fs -M /dev/loop1

答案2

您可以使用克隆属并创建一个 Clonezilla 映像,它是一个包含一组文件的目录,其中最大的文件被压缩。 Clonezilla 足够聪明,可以只复制分区中标记为由文件系统使用的块,这使得它比dd.这还意味着,与复制可用驱动器空间相比,图像将更小。

但是当你将镜像的内容恢复到分区中时,目标必须是[至少]相同大小的分区,因此如果你希望恢复操作后目标的大小更小,则必须使用另一种方法。


如果您希望在映像和恢复操作后获得较小的分区大小,则应在文件级别进行操作。你可以

  • 创建一个 tarball,整个文件系统的[压缩] tarfile,

  • 使用所需大小的文件系统创建一个新分区

  • 从 tarball 中提取包含所有文件的目录树。

从另一个操作系统启动,使要复制的分区不处于活动状态,并tar以提升的权限运行,例如

  • 将目录更改为要复制的分区的顶部

    sudo tar -cvzf /path-to/file.tar.gz .
    

当您恢复时(也从另一个操作系统启动)

  • 将目录更改为要从 tar 文件中提取的分区的顶部

    sudo tar -xvf /path-to/file.tar.gz
    

请注意此结果与克隆操作的结果之间的重要区别,

  • 分区的UUID将会不同。如果复制的分区包含系统分区,则必须将 UUID 更改为原始分区的 UUID,或者更改对 和 中 UUID 的引用/etc/fstab/boot/grub/grub.cfg匹配新的 UUID。

相关内容