嵌入式Linux文件系统概述

大家好,我是你们的讲师。今天咱们聊聊嵌入式Linux文件系统。说实话,这个主题我讲了快十年,每次都有新感悟。

先问个问题:你拿到一块开发板,烧完uboot和内核,然后呢?系统能跑起来吗?

答案是——不能。内核启动后,它需要挂载一个根文件系统,也就是Rootfs。没有它,系统就像一个人没了骨架,空有大脑却动不了。

什么是Rootfs?

Rootfs,全称Root Filesystem,根文件系统。它不是什么神秘的东西,就是一套目录结构和文件。

我习惯把它比作「房子的地基」。内核是房子的框架,Rootfs就是里面的家具、水电、管道。没有地基,框架再结实也没用。

Rootfs包含什么?

  • /bin、/sbin:用户和系统命令
  • /etc:配置文件
  • /lib:动态库和内核模块
  • /dev:设备节点
  • /proc、/sys:虚拟文件系统挂载点
  • /tmp、/var:运行时数据

内核启动的最后一步,就是调用mount_root()挂载Rootfs。如果这一步失败,你会看到经典的Kernel panic - not syncing: VFS: Unable to mount root fs。嗯,我当年第一次看到这个错误,愣是查了两天资料。

核心要点:Rootfs是内核启动后第一个挂载的文件系统,它提供了用户空间运行所需的一切基础文件。

BusyBox的角色

说到Rootfs,就绕不开BusyBox。它是什么?

BusyBox是一个「瑞士军刀」程序。它把上百个Linux命令(ls、cp、mv、sh、init等)打包成一个可执行文件。每个命令通过符号链接指向BusyBox,BusyBox根据调用名称执行对应功能。

为什么嵌入式系统要用它?

  • 体积小:一个完整的BusyBox才几百KB,而GNU coreutils动辄几MB
  • 功能全:常用命令基本都有,够用
  • 可定制:编译时可以选配需要的命令,不需要的砍掉

我记得有个项目,Flash空间只剩1.5MB。用GNU工具链根本塞不下,换成BusyBox后,还省出300KB放日志。说白了,在资源受限的嵌入式世界,BusyBox就是救星。

小技巧:编译BusyBox时,建议开启CONFIG_FEATURE_INIT和CONFIG_FEATURE_PREFER_APPLETS。前者让BusyBox自带init进程,后者优化符号链接处理。我踩过坑,默认配置在某些内核上会出问题。

文件系统在嵌入式系统中的核心地位

你想想看,嵌入式系统从开机到运行,经历了什么?

  1. Bootloader加载内核
  2. 内核初始化硬件
  3. 内核挂载Rootfs
  4. 执行init进程(通常是/sbin/init)
  5. 启动服务、运行应用程序

第3步和第4步,全依赖文件系统。没有文件系统,内核就是个光杆司令。

文件系统还决定了系统的可靠性、性能和可维护性。举个例子:

  • 用JFFS2或UBIFS,可以承受意外断电
  • 用SquashFS,只读压缩,防篡改
  • 用ext4,性能好但需要日志,不适合小Flash

我曾经在一个工业控制项目里,用了普通的FAT32做Rootfs。结果现场频繁掉电,文件系统损坏,设备变砖。后来换成UBIFS,再没出过问题。选错文件系统,代价很大。

警告:不要在生产环境中使用FAT32或NTFS作为Rootfs。它们没有日志,掉电必损。我见过太多人图省事,最后吃大亏。

知识体系总览

下面这张图,是我梳理的本章知识结构。你可以把它当作整个课程的导航图。

嵌入式Linux文件系统知识体系 Rootfs 根文件系统 BusyBox 瑞士军刀工具集 文件系统类型 JFFS2/UBIFS/SquashFS Rootfs 组成 /bin /sbin /etc /lib /dev /proc /sys /tmp /var /usr /opt BusyBox 特性 单二进制多命令 可裁剪、可配置 体积小、功能全 选型考量 Flash类型与大小 掉电保护需求 读写性能要求 核心结论 Rootfs是系统基础,BusyBox是构建工具 选对文件系统类型,决定系统成败

本章小结

咱们这一章,说白了就三件事:

  • Rootfs是内核启动后必须挂载的根文件系统,它定义了系统的目录结构和基础文件
  • BusyBox是构建最小Rootfs的核心工具,它把上百个命令打包成一个文件,极大节省空间
  • 文件系统类型的选择直接影响系统的可靠性、性能和可维护性,不能随便选

我见过太多新手,一上来就急着写应用代码,结果连系统都起不来。记住:Rootfs是地基,地基不稳,上层建筑再漂亮也是空中楼阁。

下一章,咱们会亲手搭建一个最小的BusyBox环境,从编译到运行,一步步来。到时候你会看到,一个能跑起来的Linux系统,其实没你想的那么复杂。


可可精品资料库