我有一张 16GB SD 卡,上面有几个分区(它实际上是 Raspberry Pi 的卡)。我还有其他几张 4GB 卡,我想将主卡克隆到这些卡上。主卡上的 3 个分区是:
- Rasp 启动分区,FAT,60MB
- Linux 分区,ext2,1GB
- 附加“存储”分区,FAT,1GB
如果我使用dd
以下方式创建卡片的图像:
dd if=/dev/sdb of=~/sd-card.bin
那么生成的 .bin 大小为 16GB。有没有办法dd
只复制实际使用的内容,即小于 4GB,以便我可以将dd
其复制到新的 4GB 卡上?或者我应该使用更好的解决方案吗?
答案1
我假设您使用 PC Linux 或 Mac 计算机执行复制,而不是使用 Raspberry Pi 本身。您可能需要添加块大小。
我曾见过通过指定 bs=1M 或 bs=4M 为 Raspberry pi 磁盘使用 1 兆和 4 兆。我认为块大小在写入磁盘时更重要,因为大传输比小传输更快。这不会设置磁盘的块大小,只会影响 dd 使用的传输大小。设置大块大小的一个原因是需要在写入之前擦除闪存。这是自动完成的,但对于大于最小擦除大小的传输来说速度更快。
您可以使用“count”限制 dd 复制的数据总量。“count”以块为单位。如果源磁盘上最后一个分区的末尾在目标的大小之前,您可以执行您想要的操作。
类似这样的操作dd if=/dev/sdb of=~/sd-card.bin bs=1M count=4000
将创建一个大小为 4000MB 的图像。
看http://en.wikipedia.org/wiki/Dd_(Unix)和http://elinux.org/RPi_Easy_SD_Card_Setup了解更多信息。不确定如何找到最后一个分区的末尾或卡的总大小。但是,如果您已经格式化磁盘,您可能知道如何执行此操作。
答案2
扩展威廉的回答fdisk
,可以使用计算器计算最后一个分区的末尾:
$ fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00057540
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 2048 186367 184320 90M c W95 FAT32 (LBA)
/dev/mmcblk0p2 186368 3667967 3481600 1.7G 5 Extended
/dev/mmcblk0p5 188416 3667967 3479552 1.7G 83 Linux
总使用空间(以字节为单位)=最后一个分区的结束扇区 X 扇区大小(此处为 3667967 x 512)。
总已用空间(以 GB 为单位)= 总已用空间(以字节为单位)/1024 3(此处为 1.749023 GB)。
通常,创建一个精简到最后一个有用数据位的图像并不重要,因此在上面的例子中,我将使用 William 描述的方法创建一个 2 GB 的图像先前的答案相同:
dd if=/dev/mmcblk0 of=/path/to/pi_updated.img bs=1M count=2048
图像末尾将包含最后一个有用数据后的一小部分无用内容,但这在原则上与将图像写回到媒体时将被覆盖的无用内容没有什么不同。
这种方法已经在十几个克隆中奏效了。如果说这种方法有什么致命缺陷的话,那么它们还没有浮出水面。