如何获取仅包含实际分区而没有分区后空白空间的 SD 卡映像?

如何获取仅包含实际分区而没有分区后空白空间的 SD 卡映像?

我有一张 16 GB 的 SD 卡(具体来说是 PinePhone 的可启动 Mobian SD 卡),有两个分区,总共 6 GB。剩余空间未分配。如何获取 SD 卡的 6 GB 映像?

答案1

使用一个稍微脆弱的命令,可以根据要求将驱动器的第一部分复制到映像文件。但是,有几件事需要注意:

  • 由于需要从命令行直接访问设备文件,因此必须执行整个命令root(如在sudo su使用解决方案之前的命令一样)。
  • 备份分区表(如果是 GPT 分区表)将要不是被复制
  • “技巧”取决于分区表是否完整——未分配的空间真的是未分配,不是您不想复制的某些分区。
  • 分区(或多个分区)收集在最前面。如果它们有间隙,则将复制该间隙。
  • 这取决于您的系统是否安装了该fdisk命令(可能)和该bc命令(可能)。两者都是标准的,如果需要,可以从您的默认存储库安装。
  • chown该图像文件将归 root 所有,因此如果您需要用户拥有完全访问权限,则必须这样做。

以下是完整的命令,按行拆分以便于阅读

dd if=/dev/sdx of=Mobian.img\
    bs="$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)"\
    count="$(echo "$(fdisk -o end -l /dev/sdx | tail -1) + 1"|bc)"\
    status=progress

细分:

首先,/dev/sdx需要进行更改以反映正确的设备名称,除非您碰巧有其他 23 个先前连接的磁盘。

第一行是预期的dd命令,其中设备名称和文件名设置为您当前的需求。

第二行将 的块大小设置为ddSD 卡的扇区大小。它几乎肯定是 512 字节。如果您 100% 确定它是 512,则可以将该行替换为bs=512。如果您想确保安全,并让该命令将来在任何设备上都可用,请将多余的内容保留在那里。操作如下:

  • fdisk -l /dev/sdx报告有关设备的数据
  • grep sector'sector' 在输出中出现两次
  • tail -1只获取最后一行包含“sector”的内容
  • cut -d' ' -f6在字段之间使用空格只能获得第 6 个字段(扇区大小,以字节为单位)

第三行告诉您要复制dd多少个“块” bs=。同样,如果您恰好知道该数字的确切值,请使用该数字代替命令。为了“面向未来”,我再次保留了完整的命令:

- `fdisk -o end -l /dev/sdx` list the partition information about the device, and only output the ending sector ID of each `-o end`
- `tail -1` it don't matter how many there are, we only need the last sector of the last partion.
- `echo "... + 1" | bc` add one to the last sector ID. Uses the `bc` command, which is in integers unless told otherwise. Sectors are numbered from zero, to to copy sector #10 we have to copy 10 + 1 sectors (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

第四行是娱乐价值。一张好卡,速度等级 10,将需要近 4 分钟才能读取 6 GB 的数据。选项status=progressdd在“进展”时更新终端。否则,您只会有一个终端等待命令完成,感觉就像永远一样。

最后:如果您确信所复制的内容是标准的,具有正确对齐的分区并且正好是 6 GiB,则可以使用以下简单命令:

dd if=/dev/sdx of=Mobian.img bs=1048576 count=6145 status=progress

当然,一旦他们制作了新图像,而您切换到该图像,那么简短版本就毫无意义了。顶部的原始版本将继续有效。它还适用于您以后可能需要复制的其他“图像”。

奖金:

如果您因为某种原因不喜欢dd,您可以使用相同的数字收集步骤并应用命令head

head -c $(\echo "\
    "$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)" *\
    ("$(fdisk -o end -l /dev/sdx | tail -1)" + 1)" | bc)\
    /dev/sdx > Mobian.img

作为一行代码:

head -c $(\echo " "$(fdisk -l /dev/sdx | grep sectors | tail -1 | cut -d' ' -f6)" * ("$(fdisk -o end -l /dev/sdx | tail -1)" + 1)" | bc) /dev/sdx > Mobian.img'

答案2

您可以使用 linux dd 命令。您可以选择单独读取两个分区,然后将它们连接起来,或者进行一些计算来确定第二个分区的最后一个扇区。然后,您可以使用 bs(块大小)和 count(块数)参数运行 dd 命令,使复制在第二个分区的末尾结束。

相关内容