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:用户空间程序与资源,可独立分区或与根合并。
三、只读与可写分区:稳定性的关键设计
嵌入式产品最怕“写坏 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 智能终端的分区设计
假设一台 RK3588 边缘计算终端,要求 7×24 小时运行、支持 OTA、掉电不丢配置。推荐方案:
- rootfs 使用 squashfs 只读挂载,压缩后约 300MB,减少 eMMC 占用。
- /data 使用 ext4,挂载参数 noatime,data=ordered,存放配置、日志、数据库。
- /tmp、/run 使用 tmpfs,避免频繁写 eMMC。
- /etc 通过 overlayfs 叠加,默认配置只读,用户修改写入 /data/etc。
- OTA 只更新 rootfs 与内核分区,/data 保留,升级失败可回滚。
六、误区与复盘
| 常见误区 | 后果 | 正确做法 |
|---|---|---|
| rootfs 直接挂成 rw | 掉电易损坏,OTA 风险高 | 核心分区只读,数据独立可写 |
| 把日志写进 /var 且未挂 tmpfs | eMMC 寿命快速下降 | /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 优化才有稳固的落脚点。