4. 文件系统选型分析:按设备类型与存储介质选对路
做文件系统适配这些年,我最大的感触就是:没有最好的文件系统,只有最合适的。你想想看,一个跑在IoT传感器上的文件系统,跟一个跑在旗舰手机上的,需求能一样吗?
这一章,咱们就聊聊怎么根据设备类型和存储介质,选出那个“对的人”。
4.1 选型的核心维度:先看介质,再看场景
我个人习惯把选型拆成两个维度来看:
- 存储介质:NOR Flash、NAND Flash、eMMC、UFS
- 设备类型:IoT设备、手机、平板、车机
说白了,介质决定了文件系统的底层能力边界,设备类型决定了上层需求。两者一交叉,答案就出来了。
核心原则:小存储追求“省”,大存储追求“快”,只读分区追求“稳”。
4.2 IoT设备:小存储的生存之道
IoT设备的特点是啥?Flash小(通常512KB~16MB)、CPU弱、可能还没掉电保护。我在项目中遇到过不少客户,拿着一个2MB的NOR Flash,非要跑JFFS2,结果光元数据就占了1/3空间,应用根本放不下。
4.2.1 LittleFS:小存储的王者
LittleFS是我在IoT项目中最常用的文件系统。它专为微控制器设计,特点很鲜明:
- 写放大极小:元数据开销只有几十字节
- 掉电安全:基于日志结构的写入,不怕突然断电
- 无动态内存分配:适合资源受限环境
举个例子,一个温湿度传感器,每5分钟存一条记录,Flash只有1MB。用LittleFS,元数据开销不到1%,能存好几年的数据。换成FAT,光文件分配表就得占几十KB。
我的经验:LittleFS的目录结构是扁平的,不支持嵌套太深。如果你需要多层目录,建议用SPIFFS或者直接上ROMFS。
4.2.2 SPIFFS:另一种选择
SPIFFS也是IoT场景的常客。它比LittleFS更老牌,但有个坑——碎片化问题。我曾经在一个项目中,SPIFFS跑了半年后,可用空间从80%降到了30%,全是碎片。后来换成LittleFS,问题就解决了。
所以我的建议是:新项目优先选LittleFS,除非你有历史包袱。
4.3 手机与平板:大存储的博弈
手机和平板的存储介质通常是eMMC或UFS,容量从32GB到1TB不等。这时候,文件系统的关注点就变了:
- 性能:随机读写要快,不能卡UI
- 空间利用率:大文件和小文件都要高效
- 兼容性:要支持权限、链接、扩展属性
4.3.1 EROFS:只读分区的利器
EROFS是华为贡献给OpenHarmony的只读文件系统。说实话,我第一次看到它的压缩率时,确实被惊到了。
为什么需要只读文件系统?你想想看,系统分区、vendor分区、product分区,这些在出厂后就不会变了。用EROFS,可以把它们压缩存储,节省大量空间。
| 特性 | EROFS | ext4(只读挂载) |
|---|---|---|
| 压缩率 | 约40%~60% | 无压缩 |
| 随机读性能 | 接近原生 | 原生 |
| 挂载时间 | 毫秒级 | 秒级 |
| 空间节省 | 显著 | 无 |
我记得有个项目,系统分区原本用ext4需要2.5GB,换成EROFS后,只用了1.2GB。省下来的空间,全给了用户数据分区。
注意:EROFS是只读的,不能用于用户数据分区。数据分区还是得用ext4或F2FS。
4.3.2 F2FS:数据分区的性能担当
F2FS是三星为NAND Flash设计的文件系统。它在手机上用得很多,因为随机读写性能比ext4好不少。
为什么会这样?因为F2FS了解Flash的特性。它把Flash分成了多个segment,写入时尽量顺序写,减少垃圾回收的开销。ext4呢?它最初是为磁盘设计的,对Flash的优化不够深入。
我做过一个对比测试:在UFS 3.1上,F2FS的随机写性能比ext4高出约30%。对于App安装、拍照存图这种场景,体验提升很明显。
4.4 选型决策表:一张图说清楚
下面这张SVG图,是我根据多年经验总结的选型决策流程。你可以把它当作一个快速参考:
4.5 避坑指南:我踩过的那些坑
做文件系统适配这么多年,我踩过的坑真不少。挑几个典型的说说:
- 坑一:LittleFS的目录深度。我曾经在一个项目中,用LittleFS存配置文件,目录嵌套了4层。结果写入时直接报错。后来查文档才发现,LittleFS默认只支持单层目录。解决方案?要么改配置,要么换方案。
- 坑二:EROFS的压缩算法选择。EROFS支持lz4和lz4hc两种压缩算法。lz4hc压缩率更高,但压缩时间也长。我有个项目,用lz4hc压缩系统分区,编译时间从5分钟变成了30分钟。后来改成lz4,时间降下来了,空间也只多了5%。
- 坑三:F2FS的GC问题。F2FS的垃圾回收(GC)在空间不足时会很频繁,导致卡顿。我建议给F2FS分区预留10%~15%的空白空间,这样GC压力会小很多。
我的习惯:每次选型前,我都会先跑一个benchmark。用fio或者iozone,模拟真实负载,看看文件系统的表现。数据说话,比经验靠谱。
4.6 总结:选型三句话
嗯,说了这么多,其实核心就三句话:
- 小存储(IoT):LittleFS + ROMFS,省空间、保安全
- 大存储(手机/平板):EROFS(只读)+ F2FS(数据),性能与空间兼得
- 特殊场景(车机/工控):SquashFS(只读)+ UBIFS(数据),可靠性优先
当然,实际项目中总会有各种变数。比如有些IoT设备用的是NAND Flash,那LittleFS就不太合适了,得用SPIFFS或者直接上UBIFS。所以,理解原理比记住结论更重要。
下一章,咱们会深入EROFS的源码,看看它到底是怎么做到高压缩率和低延迟的。到时候,我会带着大家手把手分析代码。
公众号:蓝海资料掘金营,微信deep3321