创建没有未分配分区的 USB 驱动器的映像

mod*_*est 13 dd clone

我的系统上连接了 8GB USB 驱动器,如下所示:

[root@host]# fdisk -l /dev/sdb

Disk /dev/sdb: 8462 MB, 8462008320 bytes
255 heads, 63 sectors/track, 1028 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x5c0894d9

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1           9       72261    e  W95 FAT16 (LBA)
/dev/sdb2              10         103      755055   83  Linux
[root@host]# 
Run Code Online (Sandbox Code Playgroud)

所以基本上我的 FAT 分区大约是 70 MB,ext2 分区大约是 740MB,其余的空间(~ 7 GB)是未分配的。现在,当我通过以下方式添加 USB 硬盘时:

dd if=/dev/sdb of=myimage.img bs=1M
Run Code Online (Sandbox Code Playgroud)

输出文件(myimage.img)在8GB左右,这是dd的正常运行。

问题:我正在寻找的是一种在没有未分配空间的情况下直接克隆我的 USB 硬盘驱动器的方法,以便我的结果文件大约为 1 GB未压缩而不是 8 GB。我问的原因是因为模拟器程序正在使用输出文件 (myimage.img) 来启动映像。模拟器可以处理 8 GB 的文件,但我不想浪费我的磁盘空间。

chu*_*utz 15

如果我理解正确,您想创建一个从磁盘开始到最后一个分区结束的映像。

执行此操作的参数ddcount=. 您的最后一个分区以 103 结束,并且计数需要额外增加 1 (104) 并且您的单位大小为 8225280 字节(根据fdisk -l输出)。所以你可以简单地以这种方式修改你的命令:

dd if=/dev/sdb of=myimage.img bs=8225280 count=104
Run Code Online (Sandbox Code Playgroud)

但是,我建议您fdisk -u -l /dev/sdb改为跑步。圆柱在这个时代不再真正相关,所以如果你看到扇区数以避免任何舍入错误,你会更好。然后你将不得不运行:

dd if=/dev/sdb of=myimage.img count=...
Run Code Online (Sandbox Code Playgroud)

其中 count 将设置为您fdisk -u -l在最后一个分区末尾获得的数字加 1,而不是以前的 104。 默认块大小为dd512 字节,这也是单位fdisk -u -l将在输出中使用。

GPT 分区的备份分区表存储在磁盘的末尾,但由于您没有使用 GPT,所以不会有问题。


lon*_*eck 2

您只需告诉 dd 只读取您感兴趣的驱动器部分。您要查找的参数是count

因此,将柱面大小设置为 8,225,280,乘以使用的柱面数量 103,得到 847,203,840 字节。由于您使用的是 1 兆字节的块大小,因此将该字节转换为兆字节,即 808。

所以你的命令是dd if=... of=... bs=1M count=808