如果实际分区合适,我可以使用 dd 将较大的 SD 卡克隆到较小的 SD 卡吗?

如果实际分区合适,我可以使用 dd 将较大的 SD 卡克隆到较小的 SD 卡吗?

我有一张 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

图像末尾将包含最后一个有用数据后的一小部分无用内容,但这在原则上与将图像写回到媒体时将被覆盖的无用内容没有什么不同。

这种方法已经在十几个克隆中奏效了。如果说这种方法有什么致命缺陷的话,那么它们还没有浮出水面。

相关内容