linux文件系统——ubifs之ubifs简介(3)

linux文件系统——ubifs之ubifs简介(3)

ubifs概述

UBIFS 是一种针对 FLASH 重新设计的日志型文件系统。 UBIFS 可看做是JFFS2 的下一代文件系统, UBIFS 对于 JFFS2 中诸如节点存储、 实时压缩(on the fligh compression)、异常断电修复等优秀设计进行了继承,针对 JFFS2 文件系统无法快速挂载大容量 FLASH、写操作较慢的情况进行了的许多重新设计, 使得 UBIFS 在搭载大容量 NAND FLASH 时挂载速度更快, IO 效率更高、可靠性更强。

此外 UBIFS 在 MTD 层之上设计了一层 UBI 层, 其完成逻辑块映射、负载均衡,坏块管理等功能, 对上提供线性平坦的逻辑卷抽象,避免了 JFFS2 文件系统中相关子系统耦合度较高的问题, 减少了代码的复杂度。

UBIFS涉及三个子系统

  • 1)MTD子系统:flash驱动直接操作设备,而MTD在flash驱动之上,向上呈现统一的操作接口。所以MTD子系统的使命是:屏蔽不同flash的操作差异,向上提供统一的操作接口;对应drivers/mtd

  • 2)UBI子系统:UBI子系统是基于MTD子系统的,在MTD上实现nand特性的管理逻辑,向上屏蔽nand的特性;对应drivers/mtd/ubi

  • 3)UBIFS文件系统:是基于UBI子系统的文件系统,实现文件系统的所有基本功能。例如文件的实现,日志的实现;对应fs/ubifs

  • 4)ubi文件系统的结构:
    在这里插入图片描述

    ubifs物理存储

Ubifs通过ubi管理MTD设备,ubi的LEB随机映射PEB,其本身占用一部分PEB,具体文件存储情况分析如下。

  1. Ubi中不管是是逻辑块号还是物理块号都是从0开始的。一般情况下,Nandflash开始处存放bootloader和linux,这样LEB与PEB间存在一个偏移,此偏移由ubifs起始位置确定。

  2. Ubi管理整个flash(属于ubi部分的flash),ubi分区在ubi flash区域之上分配。从MTD层看,整个ubi属于同一mtd分区。

  3. 在ubi中,每个PEB第一页存储EC头,第二页存储VID头,所以LED的0偏移对应PEB的4096偏移。EC头:包含物理擦除块的擦除次数以及其它一些不太重要的信息。64bytesVID头:包含属于这个PEB的卷ID和逻辑块号,及其它信息。512bytes注:每个非坏的PEB都包含一个EC头和VID头,一般EC在一个擦除块的第一页,所以偏移量是0,VID在擦除块的第二页,偏移量为一页大小。这也是逻辑擦除块小于PEB大小的原因,EC头和VID头占用了一些空间(两页大小)。

  4. Ubi通过卷(volume)管理mtd分区,UBI卷分根据用途分为用户卷和内部卷,内部卷外部不可见,现UBI中只有一个内部卷:布局(layout)卷,其余全是用户卷。Layout卷存储卷表(包含每个卷信息,如卷大小、卷更新标记、卷号等),占用两个LEB。除了卷外,ubi还要预留一些空间给其他功能使用,1个PEB用于损耗平衡,1个PEB用于原子LEB修改,一些PEB(1%,用户可配置)用于坏块处理。

  5. Ubi卷存储空间分析。Ubi用户卷上一般分6个区域,sb占一个PEB(该卷的LEB0),master占用两个PEB(改卷的LEB1和LEB2),Journal区占PEB数量不定,LPT占用PEB数量在创建文件系统后确定,孤儿区一般占用一个PEB,其余PEB供main area用。

  6. 应用数据存储。应用数据存储在每个用户卷的main area区,该区设计为B+树(游离树),只有叶子节点存放应用数据(文件、目录、文件数据等),其余为索引节点(用于查找最终数据)。

ubifs上ubi卷划分

UBIFS文件系统运行在UBI系统之上,它会把UBI volume划分为6个部分: 即 super 区,master 区,log 区,lpt 区,main 区及 orphan 区。除 main 区存放文件的数据和索引以外,其余几个区均存放特定的管理信息,且通常是以特定类型的节点的方式存储的。

超级块(superblock area)

超级块(superblock area),使用LEB0区块。它在文件系统创建时建立,占用一片LEB存储uperblock node,一般来说,superblock node保存文件系统很少变化的参数。superblock node仅仅占用LEB0的前4096个字节。superblock几乎不改变,只有一种情况会导致superblock node被重写,就是自动resize时。之所以需要自动resize,是因为创建ubifs文件系统镜像时,并不知道将要mount的UBI bolume的大小,所以当我们将UBIFS镜像安装到UBI上时,UBI的尺寸可能实际上小于UBIFS镜像所需要的最大空间,此时就需要把UBIFS resize以适合UBI volume。存储配置信息,如索引树扇出(indexing tree fanout)、压缩类型等,在mount时被读。

主节点区(master area)

主节点区(master area),占用LEB1和LEB2两个分区。一般情况下,这两个LEBs保存着相同数据,master node尺寸为512 bytes,每次写入master node会顺序的使用LEB的空闲page,直到没有空闲page时,再从offset zero开始写master node,这时会重新unmapped LEBs为另一个erased LEB。注意,master node不会同时unmapped两个LEBs,因为这会导致文件系统没有有效master node,如果此时掉电,系统无法找到有效master node。master区域中每个master node指向一个索引的root node,这样就只需要在挂载的时候扫描master area便可以得到所有文件的信息。主节点存储着所有flash上没有固定逻辑位置的结构的位置(The master node stores the position of all on-flash structures that are not at fixed logical positions.)。

日志区间(Journal/log area)

日志区间(Journal/log area,或commit area),从LEB3开始,占用空间不确定。UBIFS使用日志的目的是为了减少对flash index(main area区的文件的索引,实际索引)的更新频率,因为更新文件系统时,一旦添加叶子节点,整个文件系统的索引节点都要定期更新,这样的话会非常影响效率。因此采用日志区间,当添加叶子节点时,会先将其添加到日志中,只更新内存中的节点,不再提交到flash中,然后再定期提交日志,这样的话,效率会有极大的提高。当需要修改索引树叶节点时并不会马上更新flash上的索引树,首先要更新RAM中的TNC(索引在内存中的copy),同时将更新信息以日志方式记录在flash中(增加新的bud),等到commit时再更新闪存上的索引树。日志由log和bud(芽)组成,log记录日志位置,log包含两种类型的节点:commit开始节点(UBIFS_CS_NODE)、引用节点(UBIFS_REF_NODE)。commit开始节点记录commit过程的开始,引用节点记录bud的数量。日志有多个head,日志LEBs可以不连续。

UBI文件系统日志区是建立在Flash上的,每当文件系统运行时,都会将日志区这个结构映射到内存中,我们称为TNC树(也是B+树)。当我们要对文件系统节点修改、写数据的时候,先在内存TNC树做标记,等到commit的时候把修改的数据统一写到Flash中。TNC树是日志区在内存中的一个拷贝。内存紧张时TNC可被压缩。

LEB属性树区(LPT area)

LEB属性树区(LEB Properties Tree area,LPT area),跟随在log area之后,其大小在创建文件系统后确定(比main区indexing树小的多),LPT使用B+树(游离树)结构。LPT area 包含LEB Properties树,LPT area eraseblock表(ltab),以及saved LEB numbers表(lsave)。LPT area的大小在文件系统创建时就已经确定了,通过LEB 尺寸和文件系统最大LEB count自动计算出LPT area占用的LEB数目。LPT area类似一个小型的自包含文件系统,它有自己的LEB properties,也就是LEB properties area的LEB properties(ltab)。LPT area有自己的垃圾收集器。LPT area要求不能耗光自己的空间,能够快速访问和update,以及算法上的可扩展性。

UBIFS存储Flash上每个LEB信息(LEB类型:indexing或data,free和dirty space大小),整个flash信息(free和dirty space大小)等,方便UBIFS了解LEB信息。通过此区域可找到可用的LEB,可找到dirty LEB(供GC回收)等。

孤儿区(orphan area)

孤儿区(orphan area),在LPT area和main area之间,使用固定数目的LEBs,一般来说占用一个LEB就够了,debug时额外占用一个LEB。orphan area记录已经删除的文件的索引号(inode number)。orphan area的意义在于删除过程unclean unmount发生,已经删除的孤儿inodes必须被删除,这就要求扫描整个index来查找他们,或者在某处保存一个列表,ubifs就是在orphan area保存这样一个列表。

main area

main area,最后一个area,保存文件系统index node和non-index node,存储实际数据。UBIFS包含几种类型的non-index节点:file inode, directory entry,extend attribute entry和file data node。UBIFS维护着一棵wandering tree,叶子节点保存着文件信息,它们是文件系统的有效节点。树的内部节点是index node保存着到children的索引。所以wandering tree可以视为两个部分,顶部保存树结构的索引节点(index nodes),底部则是真正文件数据的leaf node(叶子节点)。

参考资料

UBIFS - UBI File-System

UBIFS介绍 - MTD网站

ubifs概述

ubifs物理存储

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UBIFS是一种支持压缩的文件系统,可以在存储文件系统时进行压缩,从而减小文件系统的大小,提高系统的性能。UBIFS支持多种压缩算法,包括LZO、LZ4和ZLIB等。以下是在UBIFS中使用压缩文件系统的一些步骤: 1.在内核配置中开启UBIFS压缩选项。需要在内核配置中开启CONFIG_UBIFS_FS_LZO和CONFIG_UBIFS_FS_ZLIB选项,以支持LZO和ZLIB压缩算法。 2.在ubinize.conf文件中设置压缩选项。ubinize.conf是一个ubinize命令的配置文件,用于将多个文件或文件系统打包成一个UBI镜像文件。在ubinize.conf文件中,可以通过设置compress选项来指定压缩算法和压缩级别,如下所示: ``` [fs] mode=ubi image=my_image.ubi vol_id=0 vol_type=dynamic vol_name=rootfs vol_flags=autoresize filesystem=ubifs image_size=100MiB compress=lzo compress_level=6 ``` 在上面的示例中,使用LZO压缩算法,并设置压缩级别为6。 3.在生成UBI镜像文件时使用压缩选项。使用ubinize命令生成UBI镜像文件时,需要使用-c选项指定ubinize.conf配置文件,并使用-m选项指定压缩选项,如下所示: ``` ubinize -c ubinize.conf -m ``` 在上面的示例中,使用ubinize.conf文件中的压缩选项进行压缩。 需要注意的是,在使用UBIFS压缩文件系统时,需要根据实际需求和NAND Flash的容量来确定文件系统的大小和压缩算法,以确保系统的正常运行。同时,还需要对文件系统进行特殊的处理和配置,避免数据的丢失和损坏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值