一、RootFS 是什么
RootFS 是根文件系统,是 Linux 用户态运行的基础。内核启动后,必须挂载 RootFS,然后启动第一个用户态进程。
RootFS 里通常包含:
- Shell。
- 基础命令。
- 动态库。
- 配置文件。
- 设备节点。
- 启动脚本。
- 应用程序。
没有 RootFS,内核即使启动成功,也无法进入正常用户态。
二、为什么用 Buildroot
Buildroot 是一个用于生成嵌入式 Linux 系统的构建工具。
它可以生成:
- 交叉编译工具链。
- RootFS。
- Linux Kernel。
- U-Boot。
- 第三方库。
- 应用包。
适合:
- 系统相对简单。
- 希望快速生成可用 rootfs。
- 不想一开始就学习复杂 Yocto。
三、Buildroot 基本流程
1 | make menuconfig |
输出通常在:
1 | output/images/ |
说明:
output/images:最终镜像。output/target:目标 rootfs 目录。output/host:主机工具和交叉工具链。
四、配置目标架构
在 make menuconfig 中配置:
1 | Target options |
常见选项:
- Target Architecture。
- Target Architecture Variant。
- Floating point strategy。
- ABI。
这些必须和目标板 CPU 匹配,否则程序无法运行。
五、选择基础包
常用包:
- BusyBox。
- dropbear 或 openssh。
- mtd-utils。
- i2c-tools。
- libgpiod。
- sqlite。
- curl。
- openssl。
入门 rootfs 可以先启用:
1 | BusyBox |
这样系统起来后能登录、能调试 GPIO/I2C。
六、添加自己的应用
简单方式:使用 rootfs overlay。
目录:
1 | board/my_board/rootfs_overlay/ |
在 Buildroot 配置:
1 | System configuration -> Root filesystem overlay directories |
填入:
1 | board/my_board/rootfs_overlay |
生成 rootfs 时,overlay 内容会被复制进去。
七、启动脚本
BusyBox init 常用 /etc/init.d/Sxx 脚本。
S99myapp:
1 |
|
记得加执行权限:
1 | chmod +x S99myapp |
八、生成镜像
常见 rootfs 格式:
- ext4。
- squashfs。
- cpio。
- tar。
- ubifs。
选择哪种格式取决于启动介质:
- SD/eMMC:常用 ext4。
- initramfs:常用 cpio。
- NAND Flash:可能使用 ubifs。
- 只读系统:可用 squashfs。
九、常见问题
9.1 rootfs 太大
处理:
- 移除不必要包。
- strip 二进制。
- 使用 squashfs。
- 关闭 debug 符号。
9.2 应用运行缺库
检查:
1 | ldd /usr/bin/my_app |
确保依赖库被打进 rootfs。
9.3 启动脚本不执行
检查:
- 脚本是否在
/etc/init.d/。 - 文件名是否以
S开头。 - 是否有执行权限。
- shebang 是否正确。
9.4 修改没生效
Buildroot 有缓存。可以针对包清理,也可以重新生成 rootfs。
开发阶段要清楚当前烧录的是哪个镜像,不要改了一个 rootfs,烧了另一个。
十、Buildroot 和 Yocto 怎么选
Buildroot:
- 简单。
- 上手快。
- 适合中小系统。
- 生成整体镜像,不强调包管理。
Yocto:
- 强大。
- 学习成本高。
- 适合复杂产品线。
- 更适合长期可维护发行版。
入门建议先 Buildroot,再根据项目复杂度学习 Yocto。
十一、总结
RootFS 是嵌入式 Linux 用户态的基础。Buildroot 的价值是把工具链、第三方库、系统命令和 rootfs 镜像构建流程统一起来。
先用 Buildroot 做出能启动、能登录、能运行自己应用的系统,再继续深入内核、驱动和 OTA。
- 本文链接: https://blog.hansong.icu/2026/06/21/Embedded_Linux_Buildroot_Rootfs/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。