我有一个生成嵌入式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 足以容纳您要复制的内容,您可以按照以下步骤操作:
- 手动对适当的 SD 卡进行分区,但将分区留空(但在其上创建所需的文件系统)
- 将整个 SD 卡(例如
/dev/sdb
)复制到您的系统dd if=/dev/sdb of=empty.image bs=4M
- 每次您必须创建新的 SD 卡时,请将空映像复制到新映像:
cp empty.image new.image
- 现在在该文件上创建一个循环设备:(
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 sfdisk
或https://superuser.com/questions/332252/creating-and-formating-a-partition-using-a-bash-script)。这意味着:创建空文件 (sa)、创建循环设备(无分区,不带-P
)、使用 分区该设备sfdisk
、分离循环设备、重新附加循环设备(带分区-P
)并继续。