7. SD Boot 使用指南¶
7.1. SD Boot 简介¶
SD boot 配置用于将 boot、rootfs、system、cfg 和 data 等分区打包到一张 SD 卡镜像中。SDK 中 SD 镜像由 build/sd_gen_burn_image.sh 生成,打包入口为 pack_sd_image。当当前板级配置的 STORAGE_TYPE 不是 sd 时,pack_sd_image 会直接返回,不生成 SD 镜像。
7.2. SD Boot 编译流程¶
以下以 cv1842hp_wevb_0014a_sd 为例:
$ source build/envsetup_soc.sh
$ defconfig cv1842hp_wevb_0014a_sd
$ clean_all && build_all
$ pack_sd_image
若需要使用 Buildroot rootfs:
$ source build/envsetup_soc.sh
$ defconfig cv1842hp_wevb_0014a_sd
$ setconfig BUILDROOT_FS=y
$ menuconfig_buildroot
$ savedefconfig_buildroot
$ clean_all && build_all
$ pack_sd_image
pack_rootfs 会生成 ${OUTPUT_DIR}/rawimages/rootfs.sd。在 Buildroot 模式下,SD boot 使用 Buildroot 生成的 rootfs.ext4 作为 rootfs.sd,再由 pack_sd_image 写入 SD 镜像的 rootfs 分区。
7.3. SD 镜像分区布局¶
默认 SD 镜像采用 MBR 分区表,布局如下:
分区 |
文件系统 |
默认大小 |
内容 |
|---|---|---|---|
|
FAT32 |
36 MB |
|
|
ext4 |
40 MB |
rootfs。Buildroot 模式下写入 |
|
ext4 |
20 MB |
system,包含 |
|
ext4 |
12 MB |
cfg。 |
|
ext4 |
剩余空间 |
data。 |
7.4. 修改 SD 分区大小¶
sd_gen_burn_image.sh 支持通过参数修改 SD 镜像总大小和部分分区大小:
$ build/sd_gen_burn_image.sh "$OUTPUT_DIR" [SD_SIZE_MB] [VFAT_MB] [ROOTFS_MB] [SYSTEM_MB] [CFG_MB]
例如生成 1024 MB 镜像,boot 分区 64 MB,rootfs 分区 256 MB,system 分区 128 MB,cfg 分区 32 MB:
$ build/sd_gen_burn_image.sh "$OUTPUT_DIR" 1024 64 256 128 32
参数说明:
参数 |
含义 |
注意事项 |
|---|---|---|
|
SD 镜像总大小 |
不应超过实际 SD 卡容量。 |
|
boot 分区大小 |
需要能容纳 |
|
rootfs 分区大小 |
必须大于 |
|
system 分区大小 |
需要能容纳 |
|
cfg 分区大小 |
data 分区使用剩余空间。 |
注解
Buildroot ext4 rootfs 镜像大小由 BR2_TARGET_ROOTFS_EXT2_SIZE 控制。例如该值为 200M 时,SD rootfs 分区必须大于 200 MB,否则 pack_sd_image 会报 rawimages/rootfs.sd is too large for rootfs partition。
7.5. Buildroot 与 SD Boot¶
Buildroot SD boot 的关键流程如下:
setconfig BUILDROOT_FS=y后,pack_rootfs使用 Buildroot 生成 rootfs。br-rootfs-prepare将 SDK 生成的/system、ko 和/etc/init.d/Sxx脚本准备到 Buildroot overlay。br-rootfs-pack将 Buildroot 的output/images/rootfs.ext4复制为${OUTPUT_DIR}/rawimages/rootfs.sd。pack_sd_image将rawimages/rootfs.sd作为 ext4 rootfs 原始镜像写入 SD rootfs 分区。
由于 SD 镜像已经有实际分区大小,SD boot 下不再通过 flash partition XML 对 rootfs.sd 执行 raw2cimg,否则 Buildroot ext4 镜像可能被 XML 中较小的 ROOTFS 分区限制。
7.6. 烧录与板端验证¶
pack_sd_image 成功后,${OUTPUT_DIR} 下会生成形如 <chip>-sd-YYYYmmdd-HHMM.img 的 SD 镜像。将该镜像写入 SD 卡后,从 SD 卡启动 EVB。
板端检查分区与挂载:
# cat /proc/partitions
# fdisk -l /dev/mmcblk0
# mount
# df -h
若启动失败,请优先检查:
SD 卡实际容量是否大于镜像大小。
boot 分区内是否包含
fip.bin和boot.sd。rootfs 分区大小是否大于
rootfs.sd。Buildroot rootfs 是否包含必要的
/etc/init.d/Sxx脚本。/system是否正常挂载,/system/ko是否包含所需 ko。