设为首页收藏本站
查看: 12593|回复: 0

UBI文件系统详解

[复制链接]

25

主题

9

回帖

280

积分

中级会员

积分
280
Willian.Mo 发表于 2015-5-27 10:32:54 | 显示全部楼层 |阅读模式
本帖最后由 Willian.Mo 于 2015-6-29 16:49 编辑

    UBIFS是nokia工程师在the university of Szeged大学帮助下开发的新的Flash filesystem。UBIFS可以认为是JFFS2文件系统的下一代。 UBIFS文件系统是专门为大容量FLASH嵌入式移动设备设计的,挂载UBIFS文件系统必须有mtd接口,而普通的PC机通常都不用mtd管理磁盘,所以这里需要用到nandsim模拟器,用一片RAM空间模拟出mtd设备。
UBIFS文件系统挂载,具体步骤如下:

⑴ 加载UBIFS驱动和mtd驱动
[mw_shl_code=bash,true]$ sudo apt-get install mtd-utils
$ sudo modprobe nandsim first_id_byte=0x2c second_id_byte=0xda third_id_byte=0x90 fourth_id_byte=0x95[/mw_shl_code]
(加载nandsim时需要传入的几个参数:first_id_byte、second_id_byte、third_id_byte和fourth_id_byte是需要模拟的目标NANDFLASH的ID,可以从 NandFlash芯片datasheet中可查到四个ID bytes,这里为0x2c,0xda,0x90,0x95)
若执行成功将可以在/dev/目录下找到mtd0和mtd0r0两个设备:
[mw_shl_code=bash,true]$ ls /dev/mtd*
/dev/mtd0 /dev/mtd0ro[/mw_shl_code]
⑵ 擦除mtd0分区,操作如下:
[mw_shl_code=bash,true]$ sudo flash_erase /dev/mtd0 0 0
Erasing 128 Kibyte @ ffe0000 -- 100 % complete[/mw_shl_code]
⑶ 将rootfs.ubi装入新建的mtd0分区,用dd命令进行装入,如下:
[mw_shl_code=bash,true]$ sudo ubiformat /dev/mtd0 -O 2048 -f rootfs.ubi
ubiformat: mtd0 (nand), size 268435456 bytes (256.0 MiB), 2048 eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes
libscan: scanning eraseblock 2047 -- 100 % complete
ubiformat: 2048 eraseblocks are supposedly empty
ubiformat: flashing eraseblock 741 -- 100 % complete
ubiformat: formatting eraseblock 2047 -- 100 % complet[/mw_shl_code]
⑷ 挂载UBIFS文件系统
完成以上步骤之后,加载ubi模块并attach到mtd0中,便可以像挂载普通的mtd设备一样挂载UBIFS文件系统。
加载ubi模块并attach到mtd0设备:
[mw_shl_code=bash,true]$ sudo modprobe ubi mtd=0,2048[/mw_shl_code]
新建一个挂载点:
[mw_shl_code=bash,true]$ mkdir fsmount[/mw_shl_code]
通过以下命令进行挂载:
[mw_shl_code=bash,true]$ sudo mount -t ubifs ubi0_0 fsmount/
ls fsmount/
bin boot dev etc home lib media mnt proc sbin sys tmp usr var[/mw_shl_code]
至此在PC机上挂载UBIFS文件系统完成。


重新生成UBI文件系统:
利用mkfs.ubifs工具重新生成文件系统,输入以下命令生成新的UBIFS文件系统:
[mw_shl_code=bash,true]$ sudo mkfs.ubifs -r fsmount/ -m 2048 -e 126976 -c 2024 -o ubifs.img[/mw_shl_code]
mkfs.ubifs 参数说明:
-r 建立文件系统的目录
-m 最小的 I/O 传输单元大小
-e 逻辑擦除块大小
-c 最大的逻辑擦除块数
-o 指定输出文件[/mw_shl_code]
其中可以通过以下命令查看最小的I/O传输单元大小和逻辑擦除块大小:

[mw_shl_code=bash,true]$ ubinfo /dev/ubi0
ubi0
Volumes count: 1
Logical eraseblock size: 126976 bytes, 124.0 KiB
Total amount of logical eraseblocks: 2048 (260046848 bytes, 248.0 MiB)
Amount of available logical eraseblocks: 0 (0 bytes)
Maximum count of volumes 128
Count of bad physical eraseblocks: 0
Count of reserved physical eraseblocks: 20
Current maximum erase counter value: 1
Minimum input/output unit size: 2048 bytes
Character device major/minor: 250:0
Present volumes: 0[/mw_shl_code]
通过以下命令查看最大的逻辑擦除块数:
[mw_shl_code=bash,true]$ ubinfo /dev/ubi0_0
Volume ID: 0 (on ubi0)
Type: dynamic
Alignment: 1
Size: 2024 LEBs (256999424 bytes, 245.1 MiB)
State: OK
Name: rootfs
Character device major/minor: 250:1[/mw_shl_code]
利用ubinize工具生成fsimage.ubi文件。首先需要建立ubinize的配置文件ubinize.cfg:
[mw_shl_code=bash,true]$ vi ubinize.cfg[/mw_shl_code]
输入以下内容,并保存退出:
[mw_shl_code=bash,true][ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=64MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
vol_alignment=1[/mw_shl_code]
输入以下命令生成最终烧写到目标板的文件系统文件fsimage.ubi:
[mw_shl_code=bash,true]$ sudo ubinize -m 2048 -p 128KiB -o fsimage.ubi ubinize.cfg[/mw_shl_code]
ubinize参数说明:
[mw_shl_code=bash,true]-m 最小输入/输出字节闪存单元的大小
-p FLASH 的物理擦除块的大小
-o 输出的文件[/mw_shl_code]
这里和mkfs.ubifs的参数不同, -p的参数为物理擦除块大小,也就是ubi工作在 MTD层之上,所以需要MTD的参数,即物理参数,而ubifs工作在ubi之上,所以需要ubi的参数,即逻辑参数。现在,ubi 备映像已经被保存在了ubi.img中,不仅包含ubifs信息,还包含ubi信息。


至此UBI文件系统制作完成。



























回复

使用道具 举报

您需要登录后才可以回帖 登录

本版积分规则

Archiver|手机版|小黑屋|米尔科技论坛   

GMT+8, 2024-4-23 21:58 , Processed in 0.050402 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表