1. 课程导入

在嵌入式 Linux 系统中,内核启动完成后,会尝试挂载一个根文件系统(Root Filesystem,简称 Rootfs),并执行其中的第一个用户态程序。这个 Rootfs 并不是简单的“文件夹集合”,而是系统运行所需目录结构、设备节点、配置文件、库文件、初始化脚本和应用程序的集合。没有可用的 Rootfs,内核即使成功启动,也无法进入可交互的用户空间。

Rootfs = 目录骨架 + 设备节点 + 动态库 + 配置 + 初始化系统 + 应用 + 挂载规则。它决定了系统“启动后长什么样、能做什么、如何维护”。

一、Rootfs 在系统中的位置

从启动链路看,BootROM 加载 Bootloader,Bootloader 加载内核与设备树,内核完成驱动初始化后挂载 Rootfs,随后执行 /sbin/init 或 /init,再由 init 拉起服务、登录终端和应用。Rootfs 是内核与用户态之间的“交接面”。

嵌入式 Linux 启动链路与 Rootfs 位置 BootROM 固化启动代码 Bootloader U-Boot / SPL Linux Kernel 驱动 + 设备树 Rootfs 挂载 / 执行 init 用户应用 服务 / 终端 / UI Rootfs 内部核心组成 目录骨架 /bin /etc /dev /proc 设备与伪文件 /dev /sys /tmp 库与配置 libc / 动态库 / 配置 初始化系统 init / systemd / busybox 应用 业务程序 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 初始化流程。
误区三:忽略动态库与链接器路径。交叉编译的程序在目标板上运行时报 not found,常因缺少 /lib/ld-linux.so.3。

学习本课程时,建议每章都动手验证:先让系统“能启动”,再让系统“能登录”,最后让系统“能维护”。Rootfs 构建是一项工程实践,只有把目录、库、脚本、镜像和启动参数串起来,才能真正掌握。