1. rootfs 概述:嵌入式系统的基石

各位做嵌入式的朋友,咱们今天聊聊 rootfs。很多人觉得 rootfs 不就是个文件系统嘛,有啥好讲的?

说实话,我早年也这么想。直到有一次,一个产品因为 rootfs 布局不合理,启动慢了 3 秒,客户直接拒收。从那以后,我才真正重视起这个「小东西」。

1.1 什么是 rootfs

rootfs,全称 root filesystem,根文件系统。它是 Linux 内核启动后挂载的第一个文件系统。

你可以把它理解成操作系统的「家」。内核是骨架,rootfs 就是血肉。没有 rootfs,内核就是个空壳子,啥也干不了。

核心定义:rootfs 是 Linux 系统启动后,挂载在根目录 "/" 上的文件系统。它包含了系统运行所需的所有文件、目录、配置、库和应用程序。

我习惯把 rootfs 比作一个工具箱。内核提供了「手」和「脚」,rootfs 提供了「扳手」「螺丝刀」「锤子」。没有工具,光有手脚也干不了活。

1.2 rootfs 在嵌入式系统中的作用

嵌入式系统跟 PC 不一样。PC 有硬盘、有 BIOS、有完整的 UEFI。嵌入式系统呢?可能只有一块 Flash 芯片,甚至直接从内存启动。

rootfs 在嵌入式系统里承担了三个关键角色:

  • 系统启动的载体 —— 内核启动后,需要从 rootfs 加载 init 进程、加载驱动模块、执行初始化脚本。没有 rootfs,内核会 panic。
  • 应用程序的运行环境 —— 你的业务代码、第三方库、配置文件,全在 rootfs 里。rootfs 的布局直接影响程序加载速度。
  • 资源管理的边界 —— 嵌入式系统资源有限。rootfs 的大小、压缩方式、挂载参数,直接决定了内存占用和存储效率。

举个例子。我在做一个 IoT 网关项目时,rootfs 用了 64MB 的 squashfs。结果客户要求 OTA 升级包不能超过 10MB。怎么办?只能从 rootfs 下手,把不必要的库砍掉,把日志目录挂到 tmpfs 上。最终 rootfs 压缩后只有 6MB,完美过关。

1.3 rootfs 与内核的关系

很多人搞不清内核和 rootfs 的分工。我简单说一下:

组件 职责 典型大小 更新频率
Linux 内核 硬件抽象、进程调度、内存管理、驱动 2~10 MB 低(驱动变更时)
rootfs 用户态程序、库、配置、脚本、数据 4~256 MB 高(业务迭代时)

内核和 rootfs 是「分工合作」的关系:

  • 内核负责「管资源」—— CPU、内存、外设
  • rootfs 负责「用资源」—— 跑应用、存数据、做业务

内核启动时,会通过 root= 参数指定 rootfs 的位置。可以是 /dev/mmcblk0p2(SD 卡分区),也可以是 root=/dev/nfs(网络挂载),甚至可以是 initrd(内存盘)。

小技巧:调试阶段我习惯用 NFS rootfs。代码改了直接编译,重启就能看到效果,不用反复烧写 Flash。但量产时一定要换成只读文件系统,防止意外断电损坏。

1.4 为什么 rootfs 会影响性能

这个问题问得好。很多人觉得 rootfs 就是个存储,能有多大影响?

影响大了去了。我列几个真实场景:

  1. 启动速度 —— rootfs 的挂载方式决定了内核从启动到执行业务代码的时间。initramfs 比块设备快,squashfs 比 ext4 快。选错了,启动慢 5 秒很正常。
  2. 内存占用 —— 嵌入式系统内存通常只有 64MB~512MB。rootfs 如果用了 tmpfs 或 ramfs,会吃掉大量内存。我曾经见过一个产品,rootfs 占掉 30MB 内存,导致业务程序 OOM 被杀。
  3. I/O 性能 —— Flash 存储有写入寿命限制。rootfs 如果频繁写日志、写临时文件,会加速 Flash 老化。用 overlayfs 把只读层和可写层分开,能显著延长设备寿命。
  4. 文件访问效率 —— rootfs 的文件数量、目录深度、inode 分配方式,都会影响 open()、stat() 等系统调用的速度。一个目录下放了 10000 个文件,光 ls 就要卡半天。

避坑指南:我曾经在一个项目里,把日志文件直接写在 rootfs 的 /var/log 下。结果设备运行半年后,Flash 的某个块反复写入导致坏块,系统频繁崩溃。后来我把日志目录挂载到 tmpfs 上,问题解决。记住:嵌入式设备的 rootfs,能只读就只读。

1.5 rootfs 的性能影响因素全景图

下面这张图,是我自己总结的 rootfs 性能影响因素。每次做新项目,我都会对着这张图过一遍:

rootfs 性能影响因素全景图 rootfs 性能 存储介质 NAND Flash / eMMC / SD 文件系统类型 squashfs / ext4 / ubifs / tmpfs 挂载参数 noatime / nodiratime / ro 目录布局 文件数量 / 目录深度 / 链接 压缩方式 gzip / lz4 / zstd / lzo 读写策略 overlayfs / 日志策略 / 同步 每个因素选错,都可能让系统性能下降 10%~50%

你看,rootfs 不是简单的「存文件」这么简单。它涉及存储介质、文件系统类型、挂载参数、目录布局、压缩方式、读写策略六个维度。每个维度选错了,性能都会打折扣。

1.6 本章小结

rootfs 是嵌入式系统的基石。它决定了系统启动速度、内存占用、I/O 性能和稳定性。

我见过太多团队,花大把时间优化内核、优化算法,却忽略了 rootfs。结果呢?启动慢、内存不够、Flash 损坏,各种问题层出不穷。

从下一章开始,我们会深入每个细节。你会学到:怎么选文件系统、怎么配挂载参数、怎么设计目录结构、怎么选压缩算法。每一个知识点,都是我在项目里踩过坑、填过坑之后总结出来的。

记住一句话:rootfs 优化做得好,嵌入式系统性能差不了。这是性价比最高的优化手段,没有之一。