我有一个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。