我的 SD 卡有两个分区,我已使用 dd 实用程序将其提取为 .img 文件。现在我想将这些分区刷写到容量更大的 SD 卡上。如何将两个不同的 img 文件作为不同的分区刷写到 SD 卡上,而不会让第二个文件覆盖第一个文件?
答案1
该问题的答案取决于您如何精确复制分区。
如果您复制了分区所在的整个驱动器(例如dd if=/dev/mmcblk0 of=./sd.img
),那么您只需将单个 .img 文件刷入新卡,然后根据需要更改分区和文件系统大小即可。但是,这听起来不像您面临的情况。
我相信从你的帖子中可以看出你做了更多类似的事情dd if=/dev/mmcblk0p1 of=./sd_part1.img; dd if=/dev/mmcblk0p2 of=./sd_part2.img
。如果是这样的话,你有两个分割映像,而不是驱动器映像。两者有些相似,但工作方式不同。
以下是针对那些不知道的人对驱动器分区的快速解释 - 如果您已经知道这一点,请跳至“问题”部分。
驱动器基本上充当系统可以访问的一大块空间。从技术上讲,能只需将文件系统直接放到驱动器上(我过去也这样做过),但这样做会导致驱动器上只有一个文件系统。这通常不足以满足许多用途,因此您通常不会直接格式化驱动器,而是分割首先是驱动器。分区基本上是充当其自己的“微型”驱动器的空间块。
为了让系统知道分区在哪里结束,驱动器上会直接存储一些数据,这些数据位于所有分区之外,用于存储分区相关数据。这些数据称为分区表。
以下是对其外观的快速可视化。
(Simplified GPT partition setup illustration)
The Drive (/dev/sda)
|--------------------------------------------------------------------------|
|---------------|/dev/sda1 |/dev/sda2 |/dev/sda3 |----------------------|
|Partition table|Partition 1|Partition 2|Partition 3|Backup partition table|
问题
如果复制整个驱动器,则会捕获分区表和所有分区。如果复制每个单独的分区,您将丢失分区表,必须从头开始重新创建。
因此,如果您为每个单独的分区都制作了映像,那么棘手的部分就出现了 - 您必须对驱动器进行重新分区,以便每个要恢复的 .img 文件都有一个分区。每个分区必须与原始分区大小相同或更大,以便您可以将每个分区映像刷新到新创建的分区中。
解决方案
请注意,以下是一般指南 - 您可能需要对其进行调整以适合您的特定设置。
此外,我们假设您的 SD 卡位于 /dev/mmcblk0 - 如果不是,请将本指南中所有出现的 /dev/mmcblk0 替换为 SD 卡的实际路径。
请注意,如果您的 SD 卡位于 /dev/sdX(其中 X 是任意字母),则分区将被命名为 /dev/sdX1、/dev/sdX2 等。这与 /dev/mmcblkX 的工作方式略有不同,其中分区名为 /dev/mmcblkXp1 等。考虑到这一点,否则可能无法正常工作。
首先,如果新 SD 卡上已有分区,请卸载它们(您可以通过运行 来查看 SD 卡上是否已安装分区lsblk
)。假设您的 SD 卡位于 /dev/mmcblk0,您可以使用以下 Bash 单行命令执行此操作:for i in 1 2 3 4 5 6 7 8 9; do sudo umount /dev/mmcblk0p$i; done
如果在执行此操作时收到任何“目标忙”消息,请关闭可能正在访问 SD 卡的所有打开的程序。看到大量“未指定挂载点”消息是正常的。
一旦卸载了所有现有分区,就该对新 SD 卡进行分区了。我个人更喜欢使用fdisk
- 如果您已经熟悉其他分区实用程序,则可以改用它。运行sudo fdisk /dev/mmcblk0
以开始分区过程。
进入 fdisk 后,您需要知道 SD 卡最初是使用 MBR 还是 GPT 分区方案进行分区的。如果您不知道,请尝试根据 SD 卡的用途确定使用哪种方案。如果这没有帮助,请假设 GPT 是正确的分区方案,并希望获得最佳效果。
如果您使用的是 GPT,请键入g
并按下Enter- 这将在 SD 卡上创建一个新的 GPT 分区表。如果使用的是 MBR,请键入o
并按下Enter。
接下来,创建两个分区中的第一个。输入n
并按Enter。接受所有默认设置,直到系统要求您输入“最后一个扇区” - 此时您可以指定分区大小。
一旦系统要求您输入最后一个扇区,请确定第一个分区的大小 - 我们假设它是 16 GiB。使新分区的大小相同如果第一个分区上的文件系统可以扩展,则稍微大一些。要创建一个新的 16 GiB 分区,请键入+16G
并按Enter。如果您想要将其设为 17 GiB,请键入+17G
而不是+16G
。
(请注意,末尾应仅使用一个“G” - 如果使用“GB”,则 fdisk 将使新分区比您预期的要小一些,这是由于直线和二进制千兆字节之间的差异。)
完成后,再次输入n
并按Enter。这次只需接受所有默认设置。这将使最后一个分区填满 SD 卡的其余部分。
完成后,最后输入w
并按下Enter一次 - 这会将您的更改写入 SD 卡。
完成后,您现在应该有 /dev/mmcblk0p1 和 /dev/mmcblk0p2 分区。现在您可以使用dd
将每个单独的 .img 文件刷入相应的分区。您可以sudo dd if=./sd_part1.img of=/dev/mmcblk0p1 bs=4M
对第一个分区和sudo dd if=./sd_part2.img of=/dev/mmcblk0p2 bs=4M
第二个分区执行类似的操作。(该bs=4M
部分导致dd
以 4 兆字节块的形式写入目标驱动器,这可能会加快写入过程。)
我们还没有完成——我们所做的分区是大概比我们现在放入的文件系统更大。最后一步是调整文件系统的大小以填充分区,让您充分利用额外的空间。如何执行此操作将因文件系统类型而异(可能根本无法执行),但对于 ext4 文件系统,您可以使用 执行此操作sudo resize2fs /dev/mmcblk0pX
,将 X 替换为您希望定位的分区号。
完成所有这些操作后,您的克隆 SD 卡应该已经接近完成。如果您使用的任何内容都依赖于分区的 UUID,则可能需要调整配置文件,以便它们引用新分区而不是旧分区。完成这些操作后,您就大功告成了!