通过脚本创建双分区SD卡镜像

通过脚本创建双分区SD卡镜像

我有一个生成嵌入式Linux系统的系统。系统输出三个文件:

  • 包含 rootfs(不包括内核模块)的 tarball
  • 包含内核模块的 tarball
  • u图像

该系统部署在 1 GB SD 卡上,其中 10 MB 分配给 FAT 启动分区,其余分配给 ext4 根分区。

系统的最佳输出格式是可以使用 dd 写入 SD 卡的映像文件。现在,该映像文件是通过手动分区和格式化 SD 卡、提取/复制其上的文件,然后使用 dd 读取卡的内容来创建的。它有效,但过程可能会容易得多。

我知道可以创建一个代表该卡的循环文件系统,在其上创建文件系统,然后提取/复制其中的文件。我已经尝试过,它在一定程度上有效,但还不够好。这个问题似乎与分区和SD卡的“几何形状”有关(如硬盘的几何形状,据我所知,这对于存储卡来说应该不重要),如如果分区应该特定于卡的型号,但我不是该领域的专家,只能说更多。

从两个 tarball 和 uImage 获取可以使用 dd 复制到 SD 卡上的图像的正确方法是什么?

答案1

如果您确定 SD 卡的大小始终与您实际拥有的 SD 卡相同(或更大),并且 1G 足以容纳您要复制的内容,您可以按照以下步骤操作:

  1. 手动对适当的 SD 卡进行分区,但将分区留空(但在其上创建所需的文件系统)
  2. 将整个 SD 卡(例如/dev/sdb)复制到您的系统dd if=/dev/sdb of=empty.image bs=4M
  3. 每次您必须创建新的 SD 卡时,请将空映像复制到新映像:cp empty.image new.image
  4. 现在在该文件上创建一个循环设备:(losetup -f -P new.image-P重要,因为这将强制内核读取分区信息)。

这将创建一个新的循环设备(例如/dev/loop0和分区 /dev/loop0p1.../dev/loop0pn。现在可以像任何“普通”分区一样安装和使用它们。完成工作后,losetup -d /dev/loop0使用 调用创建的图像并将其复制到 SD 中dd if=new.image of=/dev/sdb bs=4M。所有这些步骤都可以被编写。

编辑:

而不是上面的 2) 和 3):

您也可以只复制分区块(如果它是 MBR)并保留它 ( dd if=/dev/sdb of=empty_MBR bs=512 count=1);然后对于新的 SD,创建一个空文件 ( truncate -s 1G empty.file),它只是一个稀疏文件(大小=0),复制分区表 ( dd if=empty_MBR of=empty.file),创建循环设备 ( losetup -f -P empty.file),格式化分区,然后按如上所示进行操作。

编辑2:

如果您甚至不想保留小 MBR 文件,您也可以使用sfdisk脚本(请参阅man sfdiskhttps://superuser.com/questions/332252/creating-and-formating-a-partition-using-a-bash-script)。这意味着:创建空文件 (sa)、创建循环设备(无分区,不带-P)、使用 分区该设备sfdisk、分离循环设备、重新附加循环设备(带分区-P)并继续。

相关内容