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

Cha*_*ser 9 sd-card dd raspberry-pi

我有一个 16GB 的 SD 卡,上面有几个分区(它实际上是用于 Raspberry Pi 的卡)。我还有其他几张 4GB 卡,我想将主卡克隆到其中。主卡上的 3 个分区是:

  • Rasp 启动分区,FAT,60MB
  • Linux 分区,ext2,1GB
  • 额外的“存储”分区,FAT,1GB

如果我用来dd通过以下方式创建卡片的图像:

dd if=/dev/sdb of=~/sd-card.bin
Run Code Online (Sandbox Code Playgroud)

那么生成的 .bin 大小为 16GB。有没有一种方法可以dd用来复制实际使用的内容,即 < 4GB,以便我可以将dd其复制到新的 4GB 卡上?或者我应该使用更好的解决方案吗?

Wil*_*haw 9

我假设您使用的是 PC linux 或 mac 计算机来执行复制,而不是树莓派本身。您可能需要添加块大小。

我已经通过指定 bs=1M 或 bs=4M 看到了用于 Raspberry pi 磁盘的 1 和 4 兆字节。我认为写入磁盘时块大小更重要,因为大传输比小传输快。这不会设置磁盘的块大小,它只会影响 dd 使用的传输大小。设置大块大小的原因之一是需要在写入之前擦除闪存。这是自动完成的,但对于大于最小擦除大小的传输会更快。

您可以使用“计数”限制 dd 复制的数据总量。“计数”以块为单位。如果源磁盘上最后一个分区的末尾在目标大小之前,您可以执行所需的操作。

类似的东西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。不确定如何找到最后一个分区的末尾或卡的总大小。但是,如果您已格式化磁盘,您可能会知道如何执行此操作。


小智 5

扩展威廉的答案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
Run Code Online (Sandbox Code Playgroud)

已用空间总量(以字节为单位) = 最后一个分区的结束扇区 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
Run Code Online (Sandbox Code Playgroud)

图像末尾将包含最后有用数据之后的一小部分无用的废话,但这在原理上与将图像写回介质时将被覆盖的无用的废话没有什么不同。

这种方法已经在我的十多个克隆上发挥了作用。如果说这个方法有什么致命的缺陷的话,那么它们还没有浮出水面。