文件系统介绍 --- ubifs
UBIFS(Unsorted Block Image File System)无序区块镜像文件系统是用于固态存储设备上,UBIFS在设计与性能上均较YAFFS2、JFFS2更适合MLC(Multi-Level Cell) NAND FLASH。例如:UBIFS支持凑数(write-back), 其写入的数据会被缓存起来, 直到有必要写入时才写到flash, 这样大大降低分散小区块数量,并提高读写效率。UBIFS文件系统目录存储在flash上,UBIFS 挂载时不需要扫描整个存储器来重新创建文件目录。支持实时压缩,而且可选择性压缩部份文件。另外UBIFS使用日志(journal),可减少对flash index的更新频率。因为UBIFS是直接工作在Raw Flash设备上(如Nandflash),所以他不能工作在SD卡、U盘这些常用的存储设备上,目前的安卓手机上绝大部分都是使用的UBIFS文件系统。关于UBIFS的更多信息请参考: http://www.linux-mtd.infradead.org/doc/ubifs.html
传统的flash文件系统如Jffs2、yaffs2等是工作在MTD设备层之上,而UBIFS则建立在UBI卷层之上,UBI卷层工作在MTD设备层之上。也可以说,UBIFS涉及三个子系统:
1. MTD 子系统,flash驱动直接操作设备,而MTD在flash驱动之上,向上呈现统一的操作接口。所以MTD子系统的使命是:屏蔽不同flash的操作差异,向上提供统一的操作接口;对应drivers/mtd;
2. UBI Subsystem,它工作在MTD设备之上,提供了UBI卷(类似于Linux服务器上的LVM概念),对上层屏蔽了一些直接使用MTD设备需要处理的问题,如wear-leveling(磨损平衡算法)和volume management(坏块管理)功能等;对应drivers/mtd/ubi;
3. UBIFS文件系统,工作于UBI之上。它提供文件的open、read、write等操作;
UBI Volume 与 UBI Device
在UBI中有两个概念:UBI卷与UBI设备
UBI设备相当于磁盘设备(sda、mmcblk0);
UBI卷相当于磁盘上对应分区(sda1,mmcblk0p1);
UBI设备是在MTD设备上创建出来的设备,而UBI卷则是从UBI设备上划分出来的分区;
UBI文件系统制作
mkfs.ubifs 制作 UBIFS 文件系统镜像(不带卷集信息)
mkfs.ubifs -e 0x1f000 -c 568 -m 2048 -d config/ -o config.ubifs -v
-e 0x1f000 : 表示逻辑擦除块(LEB) 的 size,等于物理擦除块-2页
-c 568 : 最多逻辑可擦除块数目为 568(568*128KB=71MB),这个可根据 ubi volume 数量来设置, 实际上是设置此卷的最大容量。(理论上要给bad block坏块预留点空间,制作的时候尽量预留一点出来,-c 指定该分区最大逻辑擦除块数量,该值随着根文件系统分区的大小和该分区的坏块数调整。)
-m 2048 : flash 最小的读写单元, 一般为 flash 的页大小。
-d config/ : 需要制作成 UBI 文件系统的源文件。
-o config.ubifs : 制作出来的镜像名称为 config.ubifs。
-v : 显示制作的详细过程。
制作成功的 UBI 镜像,是没有创建 volume 的,不能直接烧录使用,需要进行创建 volume 步骤
ubinize 制作 UBI 文件系统镜像(带有卷集信息)
ubinize -o config.img -m 2048 -p 128KiB -s 2048 ubinize.cfg -v
-o config.img : 制作出的镜像名称是 config.img。
-m 2048 : flash 最小的读写单元, 一般为 flash 的页大小。
-p 128KiB : 表示物理擦除块(PEB) 的 size, 一般为块大小。
-s 2048 : UBI 头部信息的最小输入输出单元, 一般与最小读写单元(-m 参数)大小一样。
ubinize.cfg : 制作带 volume UBI 格式的镜像所需要的配置文件。
-v : 显示制作过程中的详细参数。
ubinize.cfg 制作
$ touch ubinize.cfg $ vim ubinize.cfg [ubifs] mode=ubi image=config.ubifs vol_id=0 #vol_size=64MiB vol_type=dynamic vol_name=config vol_flags=autoresize vol_alignment=1
mode=ubi : 这是个强制参数, 目前只能是 ubi
image=config.ubifs : 指定 mkfs.ubifs 输出的 UBIFS 镜像文件, 作为源文件。
vol_id=0 : 指定卷的 id 为 0。
vol_size=64MiB : 指定该卷的 size 为 64MiB, 使用该参数的时候要注意当设置了 vol_flags=autoresize, 这个参数将不起作用, 设置成了自动分配 size。 手动指定 size 的时候, 要注意, 参数的大小不能超过当前分区的最大 size。
vol_type=dynamic : dynamic 指示当前卷为动态卷, 是可读可写的。static指示卷为静态卷, 是只读的。
vol_name=config : 指定当前卷的卷名为 config。
vol_flags=autoresize : 指定当前卷为自动分配 size, 当有一个文件系统有两个卷的时候只能有一个为 autoresize。
vol_alignment=1 : 指定对齐方式, 默认为 1。
备注:通过 ubinize 制作的 ubi 文件系统可以直接烧录使用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
2018-07-25 DB9 ------ 接口定义
2017-07-25 TCP ------ TCP四次挥手(断开连接)及断开过程
2017-07-25 TCP ------ RST的产生