2. 嵌入式文件系统基础

在 RK3588 这类高性能嵌入式平台上,文件系统并不是“把文件放进存储芯片”这么简单。它决定了系统能否可靠启动、升级是否安全、掉电后数据是否损坏,以及产品量产后的维护成本。理解文件系统类型、根文件系统结构、只读与可写分区、存储介质差异和启动流程,是后续定制 rootfs 与优化的前提。

一、核心原理:文件系统是内核与存储之间的抽象层

Linux 的文件系统分为两大层次:一类是具体文件系统,如 ext4、F2FS、UBIFS、YAFFS2、squashfs、overlayfs;另一类是虚拟文件系统 VFS。VFS 向上为应用提供统一的 open/read/write/ioctl 接口,向下对接不同文件系统驱动和块设备。嵌入式系统常见的存储介质包括 eMMC、UFS、SPI NAND、SPI NOR、SD 卡等,它们对文件系统的选择有直接影响。

从读写特性看,文件系统可分为三类:可写文件系统(ext4、F2FS、UBIFS)、只读压缩文件系统(squashfs、cramfs)和联合/叠加文件系统(overlayfs)。RK3588 典型方案是:rootfs 使用 squashfs 或 ext4,数据分区使用 ext4/F2FS,通过 overlayfs 把只读根与可写层合并,实现“根只读、数据可写”的稳定结构。

二、Linux 根文件系统结构:目录不是随便放的

根文件系统遵循 FHS(Filesystem Hierarchy Standard)。嵌入式系统虽然会裁剪,但关键目录职责必须清晰:

  • /bin、/sbin:基础命令与系统管理命令,常由 BusyBox 提供。
  • /etc:配置文件,如 fstab、init.d、网络配置、用户配置。
  • /lib、/usr/lib:动态库与内核模块依赖库,RK3588 上常见 libmali、libvpu 等。
  • /dev:设备节点,由 devtmpfs 或 mdev/udev 动态生成。
  • /proc、/sys:内核运行时接口,分别反映进程与设备/驱动状态。
  • /tmp、/run:临时文件与运行时状态,通常挂载为 tmpfs。
  • /root、/home:root 与普通用户主目录,量产设备常裁剪或只读。
  • /mnt、/media:外部存储或调试挂载点。
  • /usr:用户空间程序与资源,可独立分区或与根合并。
RK3588 启动时,内核先挂载 rootfs,再执行 /sbin/init 或 /init。若 /etc/fstab 中把 /tmp 配成 tmpfs,可显著减少对 eMMC 的写入,延长寿命。

三、只读与可写分区:稳定性的关键设计

嵌入式产品最怕“写坏 rootfs”。因此常见做法是把系统核心分区设为只读,把需要持久化的数据放到独立可写分区。只读分区可用 squashfs 压缩,节省空间并防止误改;可写分区用 ext4 或 F2FS,兼顾性能与掉电恢复。若应用需要修改 /etc 下配置,可用 overlayfs 将只读根与可写 data 层叠加。

# 典型 RK3588 分区挂载示例
/dev/mmcblk0p5  /        squashfs  ro,noatime          0 0
/dev/mmcblk0p6  /data    ext4      rw,noatime,data=ordered 0 2
tmpfs           /tmp     tmpfs     rw,nosuid,nodev     0 0
tmpfs           /run     tmpfs     rw,nosuid,nodev     0 0
overlay         /etc     overlay   lowerdir=/etc,upperdir=/data/etc,workdir=/data/etc-work 0 0

只读与可写分区的边界要在设计阶段确定:日志、数据库、用户配置、OTA 备份放 /data;系统库、内核模块、默认配置放只读分区。这样 OTA 升级时只替换只读分区,用户数据不受影响。

四、常见存储介质与启动流程

RK3588 支持 eMMC、UFS、SD、SPI NOR/NAND 等启动介质。eMMC 容量大、性能好,适合主系统;SPI NOR 常用于存放 BootROM 之后的 SPL/U-Boot;SD 卡多用于开发调试。不同介质的擦写寿命、坏块管理和访问粒度不同,因此文件系统选择也不同:NOR 常用 squashfs/JFFS2,NAND 常用 UBIFS,eMMC/UFS 常用 ext4/F2FS。

典型启动链路为:BootROM → SPL → U-Boot → Linux Kernel → 挂载 rootfs → init → 应用。文件系统在“挂载 rootfs”阶段正式介入。若 rootfs 损坏或挂载参数错误,系统会停在 kernel panic 或 init 失败。因此量产前必须验证掉电重启、OTA 回滚和只读分区完整性。

RK3588 文件系统分层与启动链路 启动流程 BootROM SPL U-Boot Linux Kernel 挂载 rootfs init/应用 根文件系统结构(FHS) /bin /sbin /lib /etc /usr /dev /proc /sys /tmp /run /data(可写) /mnt /media 只读:/bin /lib /usr /etc 默认配置 可写:/data /tmp /run /var 日志 存储介质与文件系统匹配 eMMC / UFS ext4 / F2FS SPI NAND UBIFS SPI NOR squashfs / JFFS2 SD 卡 ext4 / exFAT 只读根 + overlayfs 可写层 lowerdir=只读 rootfs,upperdir=/data/overlay

五、案例与场景:RK3588 智能终端的分区设计

假设一台 RK3588 边缘计算终端,要求 7×24 小时运行、支持 OTA、掉电不丢配置。推荐方案:

  1. rootfs 使用 squashfs 只读挂载,压缩后约 300MB,减少 eMMC 占用。
  2. /data 使用 ext4,挂载参数 noatime,data=ordered,存放配置、日志、数据库。
  3. /tmp、/run 使用 tmpfs,避免频繁写 eMMC。
  4. /etc 通过 overlayfs 叠加,默认配置只读,用户修改写入 /data/etc。
  5. OTA 只更新 rootfs 与内核分区,/data 保留,升级失败可回滚。
关键检查点:mount 输出中 rootfs 是否为 ro;/data 是否独立分区;overlay 的 upperdir 是否位于可写分区;掉电重启后 /data 是否可正常挂载。

六、误区与复盘

常见误区后果正确做法
rootfs 直接挂成 rw掉电易损坏,OTA 风险高核心分区只读,数据独立可写
把日志写进 /var 且未挂 tmpfseMMC 寿命快速下降/var/log 挂 tmpfs 或限制大小
NAND 上使用 ext4坏块与擦写问题导致损坏NAND 使用 UBIFS
忽略 fstab 挂载顺序overlay 依赖分区未就绪,启动失败确保 /data 先挂载,再挂 overlay
OTA 覆盖 /data用户配置丢失升级脚本排除 /data

复盘时建议用 mount、df -h、cat /proc/mounts 和 dmesg | grep -i mount 四条命令确认实际挂载状态。文件系统设计不是“能启动就行”,而是要在掉电、升级、长期运行三种压力下都保持可恢复。掌握这些基础后,后续的 rootfs 裁剪、只读化改造和 overlayfs 优化才有稳固的落脚点。