Sha*_*n26 5 linux partition dd disk-image
我有一个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
Run Code Online (Sandbox Code Playgroud)
我看到 dd 正在制作 3.3 GB 的图像的行为虽然我不希望未分配的空间成为操作系统图像的一部分。
所以我尝试了不同的解决方案。我找到了一个解决方案:
dd if=/dev/sdb1 of=/home/data/OS.img bs=1M count=1946 status=progress
Run Code Online (Sandbox Code Playgroud)
这个解决方案创建了一个 1.9 GB 的图像,因为我定义了一个 1M 的块大小,计数为 1946,总共将提供 1.9 GB。
问题 我无法确定此 dd 命令是否仅制作了已用空间的映像,还是仅创建了大小为 1.9 GB 的映像,其中既有已用空间,也有未使用空间?
有没有其他方法可以只为已用空间创建图像?
您可以使用Clonezilla并创建一个 Clonezilla 映像,这是一个包含一组文件的目录,其中最大的文件被压缩。Clonezilla 足够聪明,可以仅从分区中复制标记为文件系统使用的块,这使其比dd. 这也意味着图像将小于如果还复制可用驱动器空间。
但是当你将镜像的内容恢复到一个分区时,目标必须是一个[至少]相同大小的分区,所以如果你希望恢复操作后目标的大小更小,则必须使用另一种方法。
如果您想在映像和还原操作后使用更小的分区,您应该在文件级别工作。你可以
创建一个 tarball,整个文件系统的 [压缩] tarfile,
使用所需大小的文件系统创建一个新分区
从 tarball 中提取包含所有文件的目录树。
例如,从另一个操作系统启动,以便要复制的分区处于非活动状态,并tar以提升的权限运行
将目录更改为要复制的分区的顶部
sudo tar -cvzf /path-to/file.tar.gz .
Run Code Online (Sandbox Code Playgroud)还原时(也从另一个操作系统启动)
将目录更改为要从 tarfile 中提取的分区的顶部
sudo tar -xvf /path-to/file.tar.gz
Run Code Online (Sandbox Code Playgroud)请注意此结果与克隆操作的结果之间的重要区别,
/etc/fstab并/boot/grub/grub.cfg匹配新的 UUID。这已在此处得到解答。
首先制作分区的图像。
然后使用losetup挂载镜像。由于它不是磁盘而是分区,因此您不需要 partscan 标志。
# lsblk
# losetup --find foo.img
Run Code Online (Sandbox Code Playgroud)
查找新创建的循环设备
# lsblk
loop1 7:1 0 4096M 0 loop
Run Code Online (Sandbox Code Playgroud)
通过写入一个大的空文件将剩余空间清零。
# mount /dev/loop1 /mnt
# dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M
# rm /mnt/filler
# umount /dev/loop1
Run Code Online (Sandbox Code Playgroud)
现在压缩图像。
# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz
Run Code Online (Sandbox Code Playgroud)
到目前为止的分区映像。
如果分区上有 ext4 文件系统,您可以使用resize2fs将其调整为最小大小。这会将所有数据移动到第一个块。
e2fsck -f /dev/loop1
resize2fs -M /dev/loop1
Run Code Online (Sandbox Code Playgroud)