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 分区表,布局如下:

分区

文件系统

默认大小

内容

p1

FAT32

36 MB

fip.binboot.sd,以及可选的 yoc.bin

p2

ext4

40 MB

rootfs。Buildroot 模式下写入 rawimages/rootfs.sd

p3

ext4

20 MB

system,包含 /system、媒体库、/system/ko 等内容。

p5

ext4

12 MB

cfg。

p6

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_SIZE_MB

SD 镜像总大小

不应超过实际 SD 卡容量。

VFAT_MB

boot 分区大小

需要能容纳 fip.binboot.sd 等启动文件。

ROOTFS_MB

rootfs 分区大小

必须大于 rawimages/rootfs.sd 的实际大小。

SYSTEM_MB

system 分区大小

需要能容纳 /system 下的库、应用和 ko。

CFG_MB

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 的关键流程如下:

  1. setconfig BUILDROOT_FS=y 后,pack_rootfs 使用 Buildroot 生成 rootfs。

  2. br-rootfs-prepare 将 SDK 生成的 /system、ko 和 /etc/init.d/Sxx 脚本准备到 Buildroot overlay。

  3. br-rootfs-pack 将 Buildroot 的 output/images/rootfs.ext4 复制为 ${OUTPUT_DIR}/rawimages/rootfs.sd

  4. pack_sd_imagerawimages/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.binboot.sd

  • rootfs 分区大小是否大于 rootfs.sd

  • Buildroot rootfs 是否包含必要的 /etc/init.d/Sxx 脚本。

  • /system 是否正常挂载,/system/ko 是否包含所需 ko。