1. 课程导入
在嵌入式 Linux 系统中,内核启动完成后,会尝试挂载一个根文件系统(Root Filesystem,简称 Rootfs),并执行其中的第一个用户态程序。这个 Rootfs 并不是简单的“文件夹集合”,而是系统运行所需目录结构、设备节点、配置文件、库文件、初始化脚本和应用程序的集合。没有可用的 Rootfs,内核即使成功启动,也无法进入可交互的用户空间。
Rootfs = 目录骨架 + 设备节点 + 动态库 + 配置 + 初始化系统 + 应用 + 挂载规则。它决定了系统“启动后长什么样、能做什么、如何维护”。
一、Rootfs 在系统中的位置
从启动链路看,BootROM 加载 Bootloader,Bootloader 加载内核与设备树,内核完成驱动初始化后挂载 Rootfs,随后执行 /sbin/init 或 /init,再由 init 拉起服务、登录终端和应用。Rootfs 是内核与用户态之间的“交接面”。
二、Rootfs 的核心作用
- 提供目录规范:遵循 FHS 约定,让程序能找到
/bin、/etc、/lib、/dev等固定路径。 - 承载初始化流程:通过
/etc/inittab、/etc/init.d/rcS或 systemd unit 完成挂载、网络、服务启动。 - 提供运行库与工具:动态链接器、libc、BusyBox 命令集是用户态程序运行的基础。
- 管理设备与内核接口:
/dev、/proc、/sys让用户态访问硬件与内核状态。 - 支持持久化与升级:通过只读根、overlay、分区挂载实现可靠性与可维护性。
三、课程整体框架与实战项目
本课程围绕“从零构建一个可启动、可联网、可部署的嵌入式 Rootfs”展开,共 30 章,分为五个阶段:
| 阶段 | 核心内容 | 产出物 |
|---|---|---|
| 基础认知 | Rootfs 定义、启动链路、目录规范、工具链 | 环境与知识地图 |
| 最小系统 | BusyBox 编译、init 脚本、设备节点、库裁剪 | 可启动最小 Rootfs |
| 功能完善 | 网络配置、SSH、包管理、日志、用户权限 | 可联网可维护系统 |
| 镜像与部署 | 镜像制作、分区、烧录、overlay、OTA 思路 | 可量产镜像 |
| 实战与复盘 | 综合项目、性能优化、故障排查、工程化 | 完整项目交付 |
四、实战项目场景
课程实战项目基于一块 ARM 开发板,构建一个带网络、SSH 登录、Web 状态页和日志回传的嵌入式 Rootfs。最终系统启动后应满足:
# 目标启动日志片段
[ 0.000000] Booting Linux on physical CPU 0x0
[ 1.234567] Run /init as init process
Starting network...
Starting sshd...
Starting web-status...
Login: root
# uname -a
Linux embedded 5.10.0 #1 SMP ARMv7l GNU/Linux
# ls /
bin dev etc lib proc root sbin sys tmp usr var www
建议在课程开始前准备好:交叉编译工具链、QEMU 或真实开发板、串口终端、TF 卡或 NFS 环境。后续章节会逐步补齐这些工具的使用方法。
五、常见误区与学习建议
误区一:把 Rootfs 等同于“复制一个 Ubuntu 根目录”。嵌入式 Rootfs 需要裁剪、交叉编译和启动适配,直接复制往往无法启动或体积过大。
误区二:只关注应用,不关注 init 与挂载顺序。很多“程序跑不起来”的问题,根源在 Rootfs 初始化流程。
误区三:忽略动态库与链接器路径。交叉编译的程序在目标板上运行时报
误区二:只关注应用,不关注 init 与挂载顺序。很多“程序跑不起来”的问题,根源在 Rootfs 初始化流程。
误区三:忽略动态库与链接器路径。交叉编译的程序在目标板上运行时报
not found,常因缺少 /lib/ld-linux.so.3。
学习本课程时,建议每章都动手验证:先让系统“能启动”,再让系统“能登录”,最后让系统“能维护”。Rootfs 构建是一项工程实践,只有把目录、库、脚本、镜像和启动参数串起来,才能真正掌握。