4.4.2. 集成用户软件进系统镜像
在
将
文件 添加 到 根 文件系统 的 system分区这种
方式 适用 于 需要 直接 与 系统文件 一同 部署 的 文件,例如 系统 库、系统 配置文件 等。通过 将 文件 放入 system分区,可以确保 它们 在 设备 启动 时 即可 被 加载 和 使用。 新增
一个 独立 的 分区 存放 自定义 文件 通过
创建 新 的 分区 并 将 自定义 文件、程序 存放 其中,可以 实现 更 高 的 灵活性 和 模块化。新 分区 会 生成 独立 的 镜像文件,方便管理 和 更新,同时 也 能 避免 对根 文件系统 的 影响。
这
4.4.2.1. 将文件添加到根文件系统的 system 分区
system 分区将system/buildroot/prebuilt/boot-utils-runtime 下。在system 镜像system 分区build/mk_system.sh 脚本
function build_unpack()
{
... ( 省略 ) ...
# 合并自动启动配置项
if [ -d "${SYSTEM_ORIG_DIR}/boot-utils-runtime" ]; then
rm -rf "${SYSTEM_BUILD_DIR}"/etc/dropbear
cp -arf --remove-destination ${SYSTEM_ORIG_DIR}/boot-utils-runtime/* "${SYSTEM_BUILD_DIR}"
fi
}
注意事项:
system分区的 容量 具体 大小 可能 因 软件 版本 有所不同。如果 添加 的 文件 导致 分区 总 大小 超过 预设 容量,镜像 生成 将 失败。为 避免 此 问题,可以 通过 修改 分区表 来 调整 system分区的 大小。详细 方法 请 参考分区 配置 。
在system 分区
4.4.2.2. 新增独立分区存放自定义文件
为app 分区app 分区
注意事项
关于
分区表 最后 一个 分区 如果
新增 的 分区 位于 分区表 的 最后 一个 分区 之后(例如 在 userdata分区之后),需要 注意 以下 行为: 系统启动
时, U-Boot阶段会 根据 硬件 存储设备(如 eMMC 或 NAND Flash)的 实际 容量,自动 将 最后 一个 分区 扩展 至 存储设备 的 末尾,以 最大化 利用 存储空间。 首次
启动 时, Kernel检测到 最后 一个 分区 未 被 格式化 或 没有 有效 的 文件系统 时,会 自动 执行 格式化 操作。
userdata分区默认设置 系统
镜像 制作 时, userdata分区通常 是 最后 一个 分区,不 包含 数据,且 分区 大小 设置 较 小(默认 50MB),以 减小 镜像 体积。 启动
后, U-Boot会自动 扩展 userdata分区到 剩余 存储空间,首次 进入 系统 时会 格式化 该 分区。 如果
在 userdata之后新增 分区,请 调整 userdata的大小 以 满足 实际 需求。
关于
空 分区 如果
新增 分区 在 镜像 制作 时为 空(无 有效 数据,如 userdata或private),需要在 系统 首次 启动 时 进行 格式化。 格式化
逻辑 可以 参考 /etc/init.d/S65mountall脚本,将新 分区 名 添加 到 force_format_part_list变量中,例如: force_format_part_list="app userdata log private"
实现步骤
1. 修改分区表
在device/horizon/x5/board_cfg/soc/x5-soc-debug-gpt.json 为例,添加
"app": {
"fs_type": "ext4",
"part_type": "GOLDEN",
"size": "700m"
},
fs_type:分区文件系统 类型,设置 为 ext4。size:分区大小,单位 为 MB(示例 为 700m)。
有关
2. 准备分区内容
创建app),并startup.sh 的
# 在 BSP 源码根目录下执行以下命令
mkdir app
cd app
echo "#!/bin/sh" > startup.sh
echo 'echo "This is the test code"' >> startup.sh
chmod 777 startup.sh
若/app 和 /userdata 目录startup.sh 程序/etc/init.d/S99auto_startup 服务
3. 验证生成分区镜像
参考
./build/mk_app.sh
生成out/product/app.img。若
4. 集成编译脚本
在 xbuild.sh 中
在
avail_func中添加 分区 选项: avail_func=("all" "lunch" "miniboot" "uboot" "factory" "boot" "hbre" "system" "app" "pack" "otapackage")
定义
build_app函数:function build_app { is_exist=$(get_part_exist app) if [ "$is_exist" = "0" ]; then return fi build_component "app" "${HR_LOCAL_DIR}/mk_app.sh" "$@" }在
整体 编译 逻辑 中 加入 app分区:if [ -d "${HR_TOP_DIR}/app" ]; then build_app "$opt" fi
以上./bd.sh app 或 ./mk_app.sh 编译app.img。
5. 自动挂载新分区
在system/buildroot/prebuilt/boot-utils-runtime/etc/hb-fstab 文件app 分区
/dev/block/platform/by-name/app /app ext4 defaults 0 1
以下
设备
路径 (/dev/block/platform/by-name/app)指定
分区 设备 的 路径。 根据
设备 和 分区 配置,此 路径 可能 有所不同,请 确保 与 实际 设备 路径 一致。
挂载
点 (/app)指定
分区 挂载 的 目标目录。 系统启动
时,分区 内容 将 挂载 到 此 目录 下。 需要
确保 该 目录 已 在 镜像 制作 过程 中 创建,否则 系统 将 无法 挂载 分区,可能 导致 启动 失败。例如 在 mk_system.sh的build_unpack函数中 添加 目录 创建 逻辑: mkdir -p ${SYSTEM_BUILD_DIR}/{app,log,userdata,usr/hobot,data,private}
文件系统
类型 (ext4)指定
分区 的 文件系统 类型。 根据
分区 的 实际 文件系统 格式 选择 合适 的 值(如 ext4、vfat等)。此处
必须 与 分区表 中 配置 的 fs_type一致。
挂载
选项 (defaults)使用
默认 挂载 选项。 defaults是一个 预定 义 的 选项 集合,它 包括 了 以下 特性: rw(读写模式) :允许对 分区 进行 读写操作。 suid(允许设置 :允许用户 ID) 执行 文件 的 SUID(Set User ID)和 SGID(Set Group ID)权限。这 允许 某些 程序 在 执行 时以 文件 所有者 的 权限 运行。 dev(允许设备 :允许文件) 分区 中 存在 设备 文件(如 /dev目录中 的 文件)。 exec(允许执行 :允许文件) 在 分区 中 执行 文件。 auto(自动挂载) :允许分区 在 系统启动 时 自动 挂载。 nouser(不允许 :只有 root 用户普通用户 挂载) 或 具有 特定 权限 的 用户 才能 挂载 该 分区。 async(异步 I/O):允许异步 I/O 操作,提高 性能。
在
app分区的 挂载 配置 中, defaults选项的 具体 含义 如下: 分区
设备 /dev/block/platform/by-name/app将以 读写 模式 挂载 到 挂载 点 /app。分区
中 的 文件 可以 设置 SUID/SGID 权限,以 支持 特定 程序 的 权限 需求。 分区
中 的 文件 可以 被 系统 执行,确保 应用程序 的 正常 运行。 分区
将 在 系统启动 时 自动 挂载,无需 手动 干预。 只有 root 用户
或 具有 特定 权限 的 用户 可以 挂载 该 分区,以 增强 系统 的 安全性。 I/O 操作
将 以 异步 方式 执行,从而 提高 分区 的 性能 表现。
defaults选项可以 确保 分区 在 挂载 时 具备 基本 的 读写 和 执行 权限。 如果
需要 自定义 挂载 参数,可 根据 需求 替换 为 实际 参数。例如: ro:只读挂载。 rw:读写挂载(默认)。 noexec:禁止执行 分区 中 的 二进制 文件。 nosuid:禁止设置 SUID 和 SGID 标志 位。
备份
标志 (0)指定
该 分区 是否 需要 dump备份。设置
为 0表示不 备份,是 通常 设置 为 0。
文件系统
检查 (顺序 1)指定
系统启动 时 检查 文件系统 的 顺序。 0表示不 检查 该 分区。 非零值
表示 检查 顺序,数字 越小,优先级 越高。
6. 打包分区进系统镜像
完成pack 到
使用
./bd.sh
如果userdata 分区),可以xbuild.sh 脚本truncate_fill_image 函数
# FIXME: If there is actual data in the partition behind the mirror, pack will be skipped.
# 先固定跳过 log 和 userdata 分区,要优化成根据配置来找到最后一个有数据的分区
case "${part_name}" in
log*|userdata*|app*)
rm -f "${HR_TARGET_PRODUCT_DIR}/${part_name}".img
;;
esac
完成app 分区)将out/product/app.img 是否
验证
完成
系统启动
时 如果 用户 通过 串口 连接 设备,那么 可以 在 串口 的 打印 日志 上 看到 This is the test code的日志 输出,说明 /app/startup.sh已经运行。 使用
fdisk -l查看分区表,确认 app分区存在,大小 为 700MB(分区大小 需要 和 实际 的 分区表 配置 对齐)。 使用
mount确认分区 已 挂载 至 /app。使用
ls /app查看分区 内容,确认 startup.sh存在并 可 执行。 示例
输出: # ls /app/ startup.sh lost+found