我的系统上连接了 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]#
因此基本上我的 FAT 分区大约有 70 MB,ext2 分区大约有 740MB,其余空间(~7 GB)未分配。现在,当我通过以下方式 dd 我的 USB 硬盘时:
dd if=/dev/sdb of=myimage.img bs=1M
输出文件(myimage.img)大约为8GB,这是dd的正常操作。
问题:我正在寻找一种方法来直接克隆我的 USB 硬盘,而无需未分配的空间,以便我的结果文件大约为 1 GB未压缩而不是 8 GB。我之所以问这个问题是因为输出文件 (myimage.img) 正在被模拟器程序用来启动映像。模拟器可以处理 8 GB 的文件,但我不想浪费我的磁盘空间。
答案1
如果我理解正确的话,您想要创建一个从磁盘起始到最后一个分区结束的映像。
执行此操作的参数dd
是count=
。您的最后一个分区以 103 结尾,计数将需要为 1 extra(104),您的单元大小为 8225280 字节(根据输出fdisk -l
)。因此,您可以简单地这样修改命令:
dd if=/dev/sdb of=myimage.img bs=8225280 count=104
不过,我建议你fdisk -u -l /dev/sdb
改为运行。在这个时代,圆柱体已经不再重要了,所以你最好查看扇区数以避免任何舍入错误。然后你必须运行:
dd if=/dev/sdb of=myimage.img count=...
其中 count 将设置为您fdisk -u -l
在最后一个分区末尾获得的数字加一,而不是以前的 104。默认的块大小为512 字节,这也是输出中将使用的dd
单位。fdisk -u -l
GPT 分区的备份分区表存储在磁盘的末尾,但由于您没有使用 GPT,所以没问题。
答案2
您只需要告诉 dd 只读取您感兴趣的驱动器部分。您正在寻找的参数是count
。
因此,将柱面大小 8,225,280 乘以正在使用的柱面数 103,得到 847,203,840 字节。由于您使用的块大小为 1 兆字节,因此请将该字节转换为兆字节,即 808。
所以你的命令是dd if=... of=... bs=1M count=808