rootfs overlay 灵活自定义
1. 需求是什么 (What you need)
在 Rockchip 平台开发时会有需要:
- 把定制文件加入 rootfs
例如iqfiles, 自启动脚本, 闭源程序 - 不修改 Buildroot 源码
不改 package, 不改 Kconfig, 不动 external tree - 让系统打包时自动把这些自定义文件放进最终镜像
不需要额外手动复制, 不需要后处理 - 能覆盖系统默认文件
包括/etc,/usr/lib,/usr/bin之类的目录
因此我们需要一个稳定、可控、可预测的 rootfs 自动修改方案(每一次编译都会应用修改)。
2. 为什么选择 rootfs overlay (Why)
2.1 因为 Buildroot 的 package 系统不保证每个文件都能通过 Kconfig 添加
比如我遇到的问题: rkaiq iqfile
- Buildroot menuconfig 里配置选项默认为空, 不知道怎么修改不会影响默认配置
- Kconfig 的字符串配置无法将 iq 文件放到目录
- Rockchip 的 rkaiq Makefile 逻辑复杂怕踩坑影响正常运行
所以 直接用 overlay 放文件比修改 package 安全太多。
2.2 overlay 是 Buildroot 设计的正规扩展方式
它就是为 产品化定制文件 准备的官方推荐方案:
- 固件
- 配置文件
- system scripts
- sensor iqfiles
- overlay GUI 文件
- systemd/busybox 启动脚本
2.3 overlay 的优先级最高, 能覆盖 package 安装的文件
rootfs final files = installed package files + overlay files
overlay 最后执行 → 最终生效
这保证了:
- 不需要 patch rkaiq
- 不需要改 rockchip buildroot
- 不需要 hack install hooks
放进 overlay 的内容就是最终 rootfs 的内容。
2.4 overlay 不会影响 sysroot 和编译流程
不会破坏:
- 交叉编译工具链
- host build
- target 构建规则
- package install 逻辑
这是它比 post-build 或自定义 package 更安全的原因。
2.5 overlay 是可维护、可版本控制的
只需修改 buildroot 配置 BR2_ROOTFS_OVERLAY, 就可以指定overlay位置, 可以做到用 git 做版本管理
3. 示例使用 (How)
3.1 创建 overlay 目录 (推荐放在 Rockchip board 下)
路径:
buildroot/board/rockchip/rk356x/fs-overlay/
把需要直接放到 rootfs 里的内容复制到当前目录
目录结构示例:
.
├── etc
│ ├── EdgeVision
│ │ ├── EdgeVision
│ │ ├── coco_80_labels_list.txt
│ │ └── yolov5s_relu.rknn
│ ├── iqfiles
│ │ └── imx415_CMK-OT2022-PX1_IR0147-50IRC-8M-F20.json
│ └── profile.d
│ └── start.sh
└── usr├── bin│ ├── restart_rknn.sh│ ├── rknn_server│ ├── start_rknn.sh│ └── taskset└── lib└── librknnrt.so
3.2 在 defconfig 启用 overlay
检查:
BR2_ROOTFS_OVERLAY="board/rockchip/rk356x/fs-overlay"
如果没有, 加进去:
echo 'BR2_ROOTFS_OVERLAY="board/rockchip/rk356x/fs-overlay"' >> configs/xxx_defconfig
验证:
grep BR2_ROOTFS_OVERLAY output/.config
3.3 overlay 的文件权限不会自动修复, 要手动 chmod
例如我的自启动脚本:
chmod +x board/.../fs-overlay/etc/profile.d/start.sh
注意: 如果自启动脚本对系统服务有依赖, 比如qt 建议把脚本放到 /etc/profile.d/ 下, 另外建议使用&后台运行脚本避免其他脚本堵塞等待
3.4 overlay 自动复制规则
执行 make 时, Buildroot 会:
cp -a board/.../fs-overlay/* -> ${TARGET_DIR}/
注意:
- 目录必须完全匹配 rootfs 结构
- overlay 中的软链接不安全 (不要用)
- overlay 覆盖原文件(不会自动追加)
- 可以使用
BR2_ROOTFS_POST_BUILD_SCRIPT指定脚本追加内容到文件(overlay覆盖完成后运行)
- 可以使用
3.5 修改 overlay 后必须刷新 Buildroot 缓存
修改 overlay 文件但 make 不会自动检测, 必须手动删 stamp:
rm output/build/buildroot-fs-overlay-stamp
3.6 overlay 不适合放 /dev 内容
因为 Buildroot 会重新创建 devnodes。
3.7 overlay 覆盖 busybox 配置要极度小心
不要放:
fs-overlay/etc/inittab
fs-overlay/etc/fstab
会导致 boot 失败。
总而言之, 就是通过最简单的复制粘贴实现覆盖/修改rootfs
