littlefs简介 📅 2026/8/27 8:13:46 概述littlefs 是一个专为微控制器和嵌入式系统量身定制的具备故障安全特性的文件系统。它仅包含两个源文件lfs.c 和 lfs.h加上一个工具层lfs_util.c 和 lfs_util.h却能提供完整的类 POSIX 文件 API并具备断电恢复能力、动态磨损均衡以及严格受限的 RAM 占用——这些特性对于运行在仅有千字节级内存且闪存会随时间磨损的硬件上至关重要。littlefs 为何而生嵌入式系统面临着桌面端文件系统从未考虑过的一系列限制。闪存的擦除次数有限——通常为 10,000 到 100,000 次——因此简单的写入模式可能会永久损坏存储介质。电源随时可能在无预警的情况下断开这意味着任何未完成的写入更新都可能导致整个文件系统损坏。此外RAM 的容量以千字节计因此文件系统不能分配与文件数量或目录深度成正比的内存。littlefs 通过其核心设计原则同时解决了这三大限制。该库使用纯 C99 编写并可通过任何兼容的编译器进行编译README.md使其几乎可以移植到市面上所有的微控制器架构上。它基于 BSD-3-Clause 许可证发布LICENSE.md。核心设计原则littlefs 围绕三大基础保证构建这使其区别于其他嵌入式文件系统断电恢复能力littlefs 中的所有文件操作均采用**写时复制COW**策略。当更新数据或元数据时littlefs 会将新版本写入新的位置然后再提交指针更改以原子操作的方式将旧版本替换为新版本。如果在写入过程中的任何时刻发生断电文件系统只需回退到最后一次已知的正常状态——无需使用恢复工具或重放日志。即使是 rename 和 remove 等操作也是原子性的README.md。动态磨损均衡littlefs 中的所有存储分配都通过一个公共的块分配器进行该分配器会跟踪擦除次数并基于概率机制淘汰擦除次数过多的块。通过限制每个分配周期内允许对单个块执行的擦除次数由block_cycles配置参数控制该分配器能够在整个存储介质上均匀分布磨损而无需使用开销高昂的静态磨损均衡表。受限的 RAM/ROM 占用RAM 占用是严格受限的——它不会随着文件系统中文件数量的增加或目录层级的加深而增长。该文件系统不包含无界递归所有动态内存均限制在几个可配置的缓冲区read_buffer、prog_buffer、lookahead_buffer内用户可以静态提供这些缓冲区从而完全避免堆分配。极简的源码体积使得 ROM 占用保持得很小两个文件总共约 5,000 行 C 代码。在 littlefs 中你控制着所有的内存分配。将配置结构体中的.read_buffer、.prog_buffer和.lookahead_buffer设置为静态分配的数组可以从文件系统中彻底消除malloc/free——这对于没有堆的系统来说至关重要。架构概览littlefs 是一个基于块的文件系统分为两个不同的层级并共享一个公共的块分配器。底层使用紧凑的写时复制结构称为 CTZ 跳表存储文件数据。上层使用小型的仅追加日志称为元数据对存储目录元数据。这两者共同构成了设计文档中所描述的“双层蛋糕”结构README.md。块设备抽象层是关键的扩展点。littlefs 并不内嵌闪存驱动程序而是接收一个 struct lfs_config 结构体其中包含四个函数指针——read、prog、erase 和 sync——它们直接映射到底层存储硬件的能力lfs.h。这使得 littlefs 能够在 NOR 闪存、NAND 闪存、SD 卡、EEPROM 甚至用于测试的 RAM 支持的虚拟磁盘上运行。bd/ 目录下提供了三个参考块设备实现RAM 支持的设备bd/lfs_rambd.c、文件支持的设备bd/lfs_filebd.c以及用于测试的全功能模拟设备bd/lfs_emubd.c。代码仓库结构该仓库刻意保持精简。整个文件系统仅由根目录下的四个源文件组成测试和基准测试的辅助工具则放在子目录中。目录 / 文件用途lfs.c/lfs.h核心文件系统—— 整个实现及公共 APIlfs_util.c/lfs_util.h工具层—— CRC、数学运算、内存抽象、断言bd/块设备后端—— 用于测试的 RAM、文件和模拟设备tests/测试套件—— 20 多个基于 TOML 的测试排列组合覆盖断电、损坏和边缘情况benches/基准测试—— 针对文件、目录和超级块操作的性能测量scripts/测试/基准工具—— 用于运行、性能分析和结果可视化的 Python 脚本runners/C 测试运行器—— 执行测试/基准 TOML 文件的测试桩代码DESIGN.md设计原理 —— 深入探讨每一个架构决策SPEC.md磁盘上规范 —— 面向工具开发的字节级格式详细信息公共 API 概览littlefs 提供了一个类 POSIX 的 API任何使用过标准 C 文件 I/O 的人都会觉得非常熟悉。最大的区别在于所有的文件系统对象都由你分配——库内部没有隐藏的堆分配。文件系统生命周期函数用途lfs_format()擦除并初始化块设备以供 littlefs 使用lfs_mount()挂载文件系统使其准备好进行操作lfs_unmount()释放资源不会刷新数据请先关闭文件文件操作函数用途lfs_file_open()/lfs_file_close()使用标志位LFS_O_RDONLY、LFS_O_CREAT等打开和关闭文件lfs_file_read()/lfs_file_write()读取/写入数据写入操作在sync或close时提交lfs_file_sync()将待处理的写入刷新到存储中lfs_file_seek()/lfs_file_tell()/lfs_file_rewind()文件内定位lfs_file_size()/lfs_file_truncate()查询或修改文件大小目录与常规操作函数用途lfs_mkdir()/lfs_remove()/lfs_rename()创建、删除以及原子重命名文件和目录lfs_stat()查询文件类型、大小和名称lfs_dir_open()/lfs_dir_read()/lfs_dir_close()遍历目录项lfs_getattr()/lfs_setattr()原子地为文件附加任意自定义属性文件系统级操作函数用途lfs_fs_size()查询文件系统当前使用的块数lfs_fs_traverse()遍历每个已分配的块适用于垃圾回收或完整性检查lfs_fs_gc()执行维护一致性检查、元数据压缩、分配器填充lfs_fs_grow()将文件系统扩展到更大的块数量面向资源受限构建的特性标志littlefs 可以通过一组预处理器宏进行编译以牺牲部分特性来换取更小的 ROM/RAM 占用使其能够适配 RAM 低至1 KB的设备宏作用LFS_READONLY禁用所有写操作 —— 将 API 表面减半LFS_NO_MALLOC移除对malloc/free的依赖 —— 需要静态缓冲区LFS_NO_ASSERT从二进制文件中剥离所有调试断言LFS_NO_DEBUG剥离调试日志LFS_NO_WARN剥离警告日志LFS_NO_ERROR剥离错误日志LFS_THREADSAFE通过lock/unlock回调添加针对每次操作的锁机制LFS_MIGRATE包含从 littlefs v1 迁移的逻辑LFS_CONFIG宏允许你提供一个自定义的头文件以覆盖所有默认配置——从LFS_MALLOC和LFS_FREE到LFS_ASSERT和 CRC 实现。这就是你将 littlefs 集成到具有自身内存管理机制的 RTOS 环境中的方式。配置概览littlefs 的所有行为都由传递给lfs_mount()或lfs_format()的单一struct lfs_config结构体控制。该结构体包含三类字段块设备操作—— 四个必需的函数指针read、prog、erase、sync用于使 littlefs 适配你的特定硬件lfs.h。几何参数—— 底层存储的尺寸read_size/prog_size—— 最小读取/编程粒度单位字节block_size—— 单个可擦除块的大小block_count—— 可擦除块的总数可调权衡参数—— 用于平衡内存、性能和磨损的参数cache_size—— 内部块缓存的大小越大 磁盘访问越少lookahead_size—— 用于发现空闲块的位图大小1 字节跟踪 8 个块block_cycles—— 触发磨损均衡前的擦除阈值通常为 100–1000inline_max—— 可直接存储在目录元数据中的最大文件大小compact_thresh—— 垃圾回收期间的元数据压缩阈值包含每个字段、其默认值、约束条件和权衡取舍的完整参考文档请见配置参考。生态系统与采用情况littlefs 已在嵌入式行业得到广泛采用。最简单的入门方式是通过Mbed OS它将 littlefs 作为LittleFileSystem类内置并为大多数常见的存储类型提供了块设备驱动程序。其生态系统还包括语言绑定Rust (littlefs2-rust)、Python (littlefs-python)、JavaScript、Nim 和 OCaml镜像工具mklittlefsESP8266/RP2040、mklfsLua RTOS、littlefs-toy通用 CLI调试工具littlefs-fuse在 Linux 上挂载镜像、littlefs-disk-img-viewer基于 Web 的查看器主机集成pico-littlefs-usb通过 USB 模拟 FAT12以便在 PC 上免驱访问有关与替代方案的更深入比较请参阅 Littlefs 与 SPIFFS 和 FAT 的对比。后续步骤本概述从最高层面对 littlefs 进行了介绍。接下来的步骤取决于你的需求动手实践跟随快速入门指南在模拟块设备上挂载、读取和写入你的第一个文件。配置浏览配置参考了解每一个可调参数及其权衡取舍。对比阅读 Littlefs 与 SPIFFS 和 FAT 的对比了解 littlefs 与替代方案相比有何优势。架构深入架构概述了解元数据对、CTZ 跳表和块分配器是如何协同工作的。块设备了解模拟块设备如何用于测试然后阅读实现自定义后端以将 littlefs 连接到你自己的闪存硬件。