Linux JFFS2文件系统工作原理、优势与局限有哪些?
摘要:在嵌入式Linux设备中,经常使用jffs2文件系统来作为参数区的文件系统格式。至于为什么要使用jffs2来作为参数区的文件系统,我猜大部分人都没有做过多的思考。你的jffs2文件系统使用是否正确、合理?如果你存储文件某天突然不见了,你要怎
liwen01 2024.06.23
前言
在嵌入式Linux设备中,经常使用jffs2文件系统来作为参数区的文件系统格式。至于为什么要使用jffs2来作为参数区的文件系统,我猜大部分人都没有做过多的思考。
jffs2在2001年被设计出来,距今已过二十多年,现在在嵌入式设备中它还在被大量使用、说明这套设计本身是没有问题。
但是,你是否有思考过,你的jffs2文件系统使用是否正确、合理?如果你存储文件某天突然不见了,你要怎么分析?是flash有坏块,还是被jffs2垃圾回收处理掉了?亦或是应用程序误删除了?又要怎样才能把它恢复回来?
先问几个问题:
如果jffs2系统中数据频繁更新会有什么影响?
如果jffs2系统分区比较大会有什么影响?
如果分区全部写满有什么影响?
如果出现文件或是数据丢失,可以恢复回来不?
(一)闪存文件系统分类
图1.1 闪存文件系统层次结构
我们前面介绍的FAT32、exFAT、ext4文件系统,在闪存存储设备中,它们是通过FTL中间层使它们适用于闪存。
但是在嵌入式设备开发中,我们有时候是直接基于闪存来使用,比如上面提到的,在flash中划分为一个分区来用存储参数。
jffs 有三个版本,jffs1出来后一两年就被jffs2替代了,而jff3好像是有被定义,但是还未实现。
jffs1与jffs2 并不兼容,基本上属于重新实现,它们都是基于linux操作系统,flash存储介质的一种文件系统。虽然支持移植,但并未看到Linux系统之外的其它系统有在使用jffs文件系统。
关于存储介质、文件系统、分区、格式化等内容,可以查看前面的文章。
文件系统(一):存储介质、原理与架构 文件系统(二):分区、格式化数据结构 文件系统(三):嵌入式、计算机系统启动流程与步骤 文件系统(四):FAT32文件系统实现原理 文件系统(五):exFAT 文件系统原理详解 文件系统(六):一文看懂linux ext4文件系统工作原理 文件系统(七):文件系统崩溃一致性、方法、原理与局限
(二)JFFS1介绍
JFFS 文件系统是2000年由 Axis Communications针对nor flash 设计的一个日志文件系统(Log-structured File System)。
它是基于日志文件系统(LFS)原理设计的一款文件系统,关于LFS可以查看文章:《文件系统(七):文件系统崩溃一致性、方法、原理与局限》
(1)数据存储
图2.1 jffs1数据分布
第一版本的JFFS是一个纯日志结构文件系统,包含数据和元数据的节点,按顺序存储在闪存芯片上,严格线性地遍历可用的存储空间。
挂载时系统会扫描整个存储介质,读取并解释每个节点。原始节点中存储的数据提供了足够的信息来重建整个目录层次结构和每个inode在介质上的数据范围的物理位置的完整映射。
(2)垃圾回收
采用日志文件系统,随着数据的增、删、改操作,jffs文件系统的空间会被慢慢使用完,这个时候就需要启动垃圾回收机制了。
图2.2 jffs1数据回收
在jffs1系统中,垃圾回收也是完全按照线性规则来回收,大致步骤如图2.2 jffs1数据回收:
状态1:数据按序存储。这个时候并未开始垃圾回收
状态2:开始垃圾回收,将最早节点中的有效数据移动到后面,标记原来数据为无效数据(脏数据)
状态3:重复状态2操作,直到脏数据空间达到可擦除的最小单位。
状态4:将脏数据擦除,标记为空。
(3)缺点
从上面的数据分布和垃圾回收机制,我们可以看出jffs v1版本的实现存在一些严重缺陷:
垃圾回收线性进行,通过写入新节点以允许它擦除日志中最旧的块,即使被垃圾回收的块仅包含干净的节点。
如果文件系统中存在大量的静态数据、垃圾回收的时候也会移动所有的静态数据,虽然每个块被擦除的次数完全相同、但这也意味着块被擦除的次数比实际需要的要多。
JFFS 不支持压缩,在资源紧张的嵌入式系统中,这是一个比较重要的需求
针对jffs1中的缺陷,就有了jffs的第二个版本,也就是jffs2。
