做嵌入式/物联网项目,常常把数据存到 NOR/NAND/EMMC/SD 卡里。问题来了:掉电会不会把文件系统搞挂?擦写次数有限,长时间写同一区块会不会把闪存提前报废?内存、ROM 本来就少,怎么才能用上“类似 POSIX”的文件 API?littlefs 就是为这些现实痛点量身打造的,小而稳、靠谱、专门为闪存设计的文件系统。
它是什么
,开源且用 C 写成,面向嵌入式闪存设备。
它解决了哪些实际问题(实用角度)
-
• 随机掉电不怕挂:所有文件操作都有强拷贝写(copy-on-write)保证,掉电后会回到上一次已知的“好状态”,不会把整个分区变成砖头。
-
• 闪存寿命管理:动态磨损均衡,能在块间分配擦写,避免某一块被反复写死,支持检测坏块并绕开。
-
• 内存确定、可控:RAM 占用是有界的(不会随文件系统变大而飙升),你可以用静态缓冲区避免动态分配,适合资源受限的 MCU。
-
• 接口友好:提供类似 POSIX 的文件/目录接口(open/read/write/close/rename/remove),上手快,逻辑直观。
-
• 可移植性强:C99 实现,能在任何支持 C 的编译器上跑,且块设备读写由你提供,支持各种底层 Flash/SD/模拟设备。
安装与快速上手(概念 + 最小示例)
littlefs 本体是一个库,通常以源码方式集成到你的工程里(把 lfs.c / lfs.h 加到工程)。核心就是你要提供一个“块设备抽象”——也就是四个函数:read、prog(写/编程)、erase、sync,以及设备的几何参数(读写粒度、块大小、块数等)。
最简单工作流程:
-
1. 把 littlefs 源码加入工程(lfs.c / lfs.h)。
-
2. 实现并传入配置 struct(lfs_config),里面填上你的 flash 操作函数和设备参数(read_size、prog_size、block_size、block_count、cache_size、lookahead_size、block_cycles 等)。
-
3. lfs_t(状态结构)在你的代码里分配。
-
4. 调用 lfs_mount(&lfs, &cfg),如果失败说明是第一次使用,可以先 lfs_format(&lfs, &cfg) 再 mount。
-
5. 常用操作:lfs_file_open / lfs_file_read / lfs_file_write / lfs_file_close / lfs_unmount 等。示例(伪代码)就是官方的 boot_count 例子:每次启动把 boot_count 读出来加 1,写回,保证掉电也不会丢数据。
简要示例流程(说明逻辑,不粘代码):
-
• 配置块设备参数 -> mount(失败就 format + mount)
-
• open 文件(LFS_O_CREAT)-> read 旧数据 -> 修改 -> rewind/write -> close(写入在 close 或 sync 时才真正提交)
-
• unmount(释放资源)
优点(实战友好)
-
• 极强的断电恢复能力,适合常掉电或电池供电场景。
-
• 专为 Flash 设计的磨损均衡,延长寿命。
-
• 运行内存可控,适合 32KB/64KB 这类 MCU。
-
• API 简单,易于集成。
-
• 开源(BSD-3-Clause),可商用且可修改。
-
• 支持在 PC 上做测试(自带模拟块设备和测试套件),方便开发调试。
缺点与局限
-
• 不是为高吞吐量或大容量文件系统设计的:如果要处理几十 GB 或高并发写入,可能不合适。
-
• 元数据与日志结构复杂度:实现底层块设备接口时,如果底层有缓存或 DMA,必须保证 sync 把缓存冲到底层,否则会破坏一致性。
-
• 写放大 / 空间利用:在某些模式下会产生写放大(copy-on-write 的代价),需要根据应用评估写负载和寿命。
-
• 对于需要复杂权限、锁或高级 POSIX 特性的场景(比如完整的 mmap 支持、复杂锁机制),littlefs 不提供。
-
• 对坏块处理依赖你的 prog/erase 返回值能力更好,但即便不能提前检测,littlefs 也会读回来做完整性校验。
适合谁用(什么时候选它)
-
• MCU、传感器、可穿戴设备、低功耗物联网节点。
-
• 需要在频繁断电或电源不稳环境下保存关键数据(日志、配置、计数器)。
-
• 闪存管理是痛点、希望尽量延长闪存寿命的项目。
总结
littlefs 是为嵌入式场景量身打造的“小而强健”的文件系统:如果你要在有限 RAM、有限擦写寿命和可能掉电的环境下做持久化存储,它几乎是首选。不是万能,但在它擅长的领域里,能省你一大堆时间和头发。
项目地址:https://github.com/littlefs-project/littlefs