我有一张 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
命令,其中设备名称和文件名设置为您当前的需求。
第二行将 的块大小设置为dd
SD 卡的扇区大小。它几乎肯定是 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=progress
将dd
在“进展”时更新终端。否则,您只会有一个终端等待命令完成,感觉就像永远一样。
最后:如果您确信所复制的内容是标准的,具有正确对齐的分区并且正好是 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 命令,使复制在第二个分区的末尾结束。