2. 根文件系统(Rootfs)概念
根文件系统(Root Filesystem,简称 Rootfs)是嵌入式 Linux 系统启动后挂载的第一个文件系统,它构成了系统运行的基石。理解 Rootfs 的概念、作用及其与内核的关系,是构建可靠嵌入式系统的前提。
2.1 什么是根文件系统
根文件系统是一个包含操作系统启动和运行所必需的全部目录、配置文件和设备节点的文件系统层次结构。它挂载在根目录“/”上,是内核初始化完成后首先访问的文件系统。
关键理解: 根文件系统不是指某个特定的文件系统类型(如 ext4、squashfs),而是指挂载在根目录下的整个文件系统树。它可以是任何支持的文件系统格式,但必须包含
/sbin/init 或内核指定的 init 程序。
2.2 根文件系统的作用
根文件系统在嵌入式 Linux 系统中承担着不可替代的核心作用,主要体现在以下四个方面:
| 作用维度 | 具体说明 | 典型内容 |
|---|---|---|
| 系统初始化 | 提供内核启动后第一个用户态进程(init),完成系统初始化流程 | /sbin/init、/etc/inittab、/etc/init.d/rcS |
| 程序执行环境 | 提供动态链接库、加载器和系统调用接口,使应用程序可运行 | /lib/libc.so、/lib/ld-linux.so |
| 设备与文件管理 | 通过设备节点和挂载点管理硬件设备与存储资源 | /dev、/mnt、/proc、/sys |
| 配置与持久化 | 存储系统配置、用户数据和运行时状态 | /etc、/var、/home |
嵌入式系统特点: 与桌面 Linux 不同,嵌入式 Rootfs 通常被设计为只读(如 squashfs)或 overlayfs 分层结构,以增强系统稳定性和抗意外断电能力。根文件系统的大小通常被严格控制在几 MB 到几百 MB 之间。
2.3 根文件系统与内核的关系
内核与根文件系统是相互依赖但逻辑独立的两个实体。理解它们的关系对于系统调试和定制至关重要。
内核与根文件系统的核心关系可以总结为以下几点:
- 启动依赖: 内核启动的最后阶段必须挂载根文件系统,否则内核会 panic 并停止启动。内核通过
root=启动参数指定根文件系统的位置。 - 功能互补: 内核提供进程调度、内存管理、设备驱动等基础服务;根文件系统提供用户态程序、库文件和配置,使系统具备完整功能。
- 独立构建: 内核和根文件系统可以独立编译和更新。更换根文件系统不需要重新编译内核,反之亦然(除非涉及驱动依赖)。
- 存储分离: 内核通常存储在独立的 boot 分区或 flash 区域,根文件系统可以位于不同的存储介质上(如 NAND Flash、SD 卡、网络文件系统 NFS)。
常见陷阱: 如果内核中缺少根文件系统所在设备的驱动(如 EMMC 控制器驱动、NFS 客户端驱动),内核将无法挂载根文件系统,导致启动失败。这是嵌入式开发中常见的“内核恐慌(Kernel Panic)”原因之一。
2.4 根文件系统的目录结构(FHS 标准)
文件系统层次结构标准(Filesystem Hierarchy Standard,FHS)定义了 Linux 系统中目录的用途和内容布局。嵌入式系统通常遵循 FHS 的子集,并根据实际需求进行精简。
| 目录 | FHS 定义用途 | 嵌入式系统常见内容 | 是否必需 |
|---|---|---|---|
/bin |
基本用户命令(单用户模式可用) | busybox、sh、ls、cp、mount |
是 |
/sbin |
系统管理命令 | init、ifconfig、reboot、fdisk |
是 |
/etc |
系统配置文件 | inittab、fstab、passwd、init.d/rcS |
是 |
/lib |
共享库和内核模块 | libc.so、ld-linux.so、modules/ |
是 |
/dev |
设备节点文件 | console、null、ttyS0、mmcblk0 |
是 |
/proc |
进程和内核信息虚拟文件系统 | 运行时由内核自动挂载 | 是(挂载点) |
/sys |
设备模型和驱动信息虚拟文件系统 | 运行时由内核自动挂载 | 是(挂载点) |
/tmp |
临时文件 | 通常挂载为 tmpfs(内存文件系统) | 推荐 |
/var |
可变数据(日志、锁文件等) | log、run、lock |
推荐 |
/usr |
用户程序和数据(二级层次) | 嵌入式系统常合并到 / 或省略 |
可选 |
/opt |
第三方软件包 | 通常省略 | 可选 |
/home |
用户主目录 | 嵌入式系统通常省略或只含 root |
可选 |
2.5 嵌入式 Rootfs 的目录结构示例
以下是一个典型的嵌入式 Linux 根文件系统目录结构,使用 tree 命令展示:
/
├── bin
│ ├── busybox # BusyBox 多合一命令
│ ├── sh -> busybox # 符号链接到 busybox
│ ├── ls -> busybox
│ ├── cp -> busybox
│ ├── mv -> busybox
│ └── mount -> busybox
├── sbin
│ ├── init -> ../bin/busybox # 系统初始化进程
│ ├── reboot -> ../bin/busybox
│ └── ifconfig -> ../bin/busybox
├── etc
│ ├── inittab # init 进程配置文件
│ ├── fstab # 文件系统挂载表
│ ├── init.d
│ │ └── rcS # 系统初始化脚本
│ ├── passwd # 用户密码文件
│ └── resolv.conf # DNS 解析配置
├── lib
│ ├── libc.so.6 # C 标准库
│ ├── ld-linux.so.3 # 动态链接器
│ └── modules # 内核模块目录
│ └── 5.10.100
│ └── drv.ko
├── dev
│ ├── console # 控制台设备
│ ├── null # 空设备
│ ├── zero # 零设备
│ ├── ttyS0 # 串口设备
│ └── mmcblk0p1 # SD 卡分区
├── proc # procfs 挂载点(空目录)
├── sys # sysfs 挂载点(空目录)
├── tmp # tmpfs 挂载点(空目录)
└── var
├── log
│ └── messages # 系统日志
└── run
└── pid # 进程 PID 文件
构建要点: 上述目录结构中,
/bin、/sbin、/etc、/lib、/dev 是必须存在的核心目录。/proc、/sys、/tmp 只需创建空目录作为挂载点,实际内容由内核或运行时挂载生成。使用 BusyBox 可以大幅减少 /bin 和 /sbin 中的文件数量。
2.6 本章小结
- 根文件系统 是挂载在根目录“/”上的文件系统树,包含系统启动和运行所需的全部文件。
- 核心作用 包括系统初始化、提供程序执行环境、设备管理和配置持久化。
- 与内核的关系 是相互依赖但独立构建的:内核提供基础服务,Rootfs 提供用户空间内容。
- FHS 标准 定义了目录结构规范,嵌入式系统遵循其子集并根据资源限制进行精简。
- 最小 Rootfs 至少需要
/bin、/sbin、/etc、/lib、/dev五个核心目录,以及/proc、/sys两个虚拟文件系统挂载点。