2. 根文件系统(Rootfs)概念

根文件系统(Root Filesystem,简称 Rootfs)是嵌入式 Linux 系统启动后挂载的第一个文件系统,它构成了系统运行的基石。理解 Rootfs 的概念、作用及其与内核的关系,是构建可靠嵌入式系统的前提。

2.1 什么是根文件系统

根文件系统是一个包含操作系统启动和运行所必需的全部目录、配置文件和设备节点的文件系统层次结构。它挂载在根目录“/”上,是内核初始化完成后首先访问的文件系统。

关键理解: 根文件系统不是指某个特定的文件系统类型(如 ext4、squashfs),而是指挂载在根目录下的整个文件系统树。它可以是任何支持的文件系统格式,但必须包含 /sbin/init 或内核指定的 init 程序。
根文件系统在系统启动中的位置 硬件平台 Bootloader Linux 内核 根文件系统 (Rootfs) 用户空间应用 内核启动后挂载 Rootfs,然后执行 /sbin/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 根文件系统与内核的关系

内核与根文件系统是相互依赖但逻辑独立的两个实体。理解它们的关系对于系统调试和定制至关重要。

内核与根文件系统的协作关系 Linux 内核 进程调度 内存管理 文件系统驱动 设备驱动 网络协议栈 系统调用接口 根文件系统 /sbin/init (PID 1) /lib (动态库) /etc (配置文件) /dev (设备节点) /bin (用户命令) /tmp (运行时数据) 系统调用 内核提供基础服务,Rootfs 提供用户空间程序和配置;两者通过系统调用接口交互

内核与根文件系统的核心关系可以总结为以下几点:

  • 启动依赖: 内核启动的最后阶段必须挂载根文件系统,否则内核会 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 可选
嵌入式 Linux 根文件系统典型目录结构 / (root) /bin /sbin /etc /lib /dev /tmp /var busybox sh, ls, cp init ifconfig inittab fstab libc.so ld-linux console ttyS0 tmpfs 运行时数据 log run /proc /sys 嵌入式 Rootfs 精简原则 • 只包含系统运行必需的目录和文件,去除 /usr/share/doc、/usr/man 等非必要内容 • /proc 和 /sys 是虚拟文件系统,只需创建空挂载点,内容由内核动态生成 • 使用 BusyBox 合并命令,将 /bin、/sbin、/usr/bin 等目录的命令统一到一个可执行文件中

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 两个虚拟文件系统挂载点。