UBIFS是nokia工程师在the university of Szeged大学帮助下开发的新的Flash filesystem。UBIFS可以认为是JFFS2文件系统的下一代。 UBIFS文件系统是专门为大容量FLASH嵌入式移动设备设计的,挂载UBIFS文件系统必须有mtd接口,而普通的PC机通常都不用mtd管理磁盘,所以这里需要用到nandsim模拟器,用一片RAM空间模拟出mtd设备。 UBIFS文件系统挂载,具体步骤如下: ⑴ 加载UBIFS驱动和mtd驱动
1
2
$
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
(加载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两个设备:
1
2
$
ls
/dev/mtd
*
/dev/mtd0
/dev/mtd0ro
⑵ 擦除mtd0分区,操作如下:
1
2
$
sudo
flash_erase
/dev/mtd0
0 0
Erasing 128 Kibyte @ ffe0000 -- 100 % complete
⑶ 将rootfs.ubi装入新建的mtd0分区,用dd命令进行装入,如下:
1
2
3
4
5
6
$
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
⑷ 挂载UBIFS文件系统 完成以上步骤之后,加载ubi模块并attach到mtd0中,便可以像挂载普通的mtd设备一样挂载UBIFS文件系统。 加载ubi模块并attach到mtd0设备:
1
$
sudo
modprobe ubi mtd=0,2048
新建一个挂载点:
通过以下命令进行挂载:
1
2
3
$
sudo
mount
-t ubifs ubi0_0 fsmount/
ls
fsmount/
bin boot dev etc home lib media mnt proc sbin sys tmp usr var
至此在PC机上挂载UBIFS文件系统完成。 重新生成UBI文件系统: 利用mkfs.ubifs工具重新生成文件系统,输入以下命令生成新的UBIFS文件系统:
1
$
sudo
mkfs.ubifs -r fsmount/ -m 2048 -e 126976 -c 2024 -o ubifs.img
mkfs.ubifs 参数说明: -r 建立文件系统的目录 -m 最小的 I/O 传输单元大小 -e 逻辑擦除块大小 -c 最大的逻辑擦除块数 -o 指定输出文件[/mw_shl_code] 其中可以通过以下命令查看最小的I/O传输单元大小和逻辑擦除块大小:
01
02
03
04
05
06
07
08
09
10
11
12
13
$ ubinfo
/dev/ubi0
ubi0
Volumes count: 1
Logical eraseblock size: [color=
#ff0000]126976 bytes, 124.0 KiB[/color]
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: [color=
#ff0000]2048 bytes[/color]
Character device major
/minor
: 250:0
Present volumes: 0
通过以下命令查看最大的逻辑擦除块数:
1
2
3
4
5
6
7
8
$ ubinfo
/dev/ubi0_0
Volume ID: 0 (on ubi0)
Type: dynamic
Alignment: 1
Size: [color=
#ff0000]2024 LEBs[/color] (256999424 bytes, 245.1 MiB)
State: OK
Name: rootfs
Character device major
/minor
: 250:1
利用ubinize工具生成fsimage.ubi文件。首先需要建立ubinize的配置文件ubinize.cfg:
输入以下内容,并保存退出:
1
2
3
4
5
6
7
8
9
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=64MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
vol_alignment=1
输入以下命令生成最终烧写到目标板的文件系统文件fsimage.ubi:
1
$
sudo
ubinize -m 2048 -p 128KiB -o fsimage.ubi ubinize.cfg
ubinize参数说明:
1
2
3
-m 最小输入/输出字节闪存单元的大小
-p FLASH 的物理擦除块的大小
-o 输出的文件
这里和mkfs.ubifs的参数不同, -p的参数为物理擦除块大小,也就是ubi工作在 MTD层之上,所以需要MTD的参数,即物理参数,而ubifs工作在ubi之上,所以需要ubi的参数,即逻辑参数。现在,ubi 备映像已经被保存在了ubi.img中,不仅包含ubifs信息,还包含ubi信息。 至此UBI文件系统制作完成。