文章摘要: 本文描述了UBI文件系统的移植与应用。

UBIFS (Unsorted Block Image File System)无排序区块镜像文件系统,由IBM与Nokia的工程师Thomas Gleixner,Artem Bityutskiy所设计,专门为了解决MTD(Memory Technology Device)设备所遇到的瓶颈,用于大容量固态存储设备。


1.添加MTD,NandFlash,UBI驱动支持(内核)

Device Drivers  ---> 
    <*> Memory Technology Device (MTD) support  --->  
        [*]   MTD partitioning support
        <*>   NAND Device Support  --->  
            <*>   NAND Flash support for Samsung S3C SoCs 
        <*>   Enable UBI - Unsorted block images  --->  

注意事项:
如果在配置选项中找不到选项,可先修改.config文件中的CONFIG_MTD_UBI=y,再重make menuconfig即可;
如果不添加这里的选项,则后续的配置中找不到UBIFS选项;


2.添加UBI文件系统支持(内核)

File systems  --->  
    [*]Miscellaneous filesystems  ---> 
        <*>   UBIFS file system support  

      

修改UBOOT添加UBI支持(未验证,主流模式是通过MTD工具)
1.制作根文件系统

#mkfs.ubifs -r root/ -m 2048 -e 129024 -c 2364 -o root-fs.img 

2.擦除 root 分区
[uboot]#nand erase root
3.对 root 分区进行 ubi 格式化
[uboot]#ubi part root
4.将文件系统下载到内存
[uboot]#tftp 0x30008000 ubifs.img
5.将文件系统烧写到 rootfs 中
[uboot]#ubi.write 0x30008000 rootfs 0x339600


利用MTD工具,直接在开发板上配置UBI文件系统
1.首先交叉编译MTD工具,得到mkfs.ubifs工具;
2.使用nfs启动系统,执行以下命令挂载ubifs:

#flash_eraseall /dev/mtd2
#ubiattach /dev/ubi_ctrl -m 2                  
#ubimkvol /dev/ubi0 -N rootfs -s 50 MiB
#mount -t ubifs ubi0_0 /mnt/ubifs 

或者

#mount -t ubifs ubi0:rootfs /mnt/ubifs

3.在开发板中执行命令,将文件系统复制至ubifs目录下即可(可以直接解压至此)。

注意事项:
flash_eraseall 擦除flash;
ubiattach 用来关联ubi;
ubimkvol 用来创建ubi文件系统,-N指定卷标的名称,挂载时候要用到;

如果只是挂载已存在的ubi文件系统,只需用ubiattach 和 mount即可(不用再擦除和创建文件系统了);

这里的/dev/mtd2和-m 2是根据分区表中配置的,
-s 50 MiB是指文件系统的大小,需要比分区小几M(用来保存ubifs信息);
-N rootfs是设置卷标(可任意),挂载时候可通过文件名来挂载ubi0:rootfs
这些参数需要调整的与实际相同

如果不能识别MiB参数,原因待查(没有空格??).


内核没有配置,选中如下选项即可

[*]  Extended attributes support 
[*]  Advanced compression options 
[*]  LZO compression support 
[*]  ZLIB compression support  

具体是哪个稍后再试(啥意思,时间长了我自己都忘记了)。


设置启动参数:

[uboot]#setenv bootargs 'ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs console=ttySAC0,115200 wvga calibration rw' 

常见问题:

[root@localhost /]# mount -t ubifs ubi0_0 /mnt/ubifs
UBIFS error (pid 961): init_constants_early: too few LEBs (1), min. is 17
mount: mounting ubi0_0 on /mnt/ubifs failed: Invalid argument

此问题是由于说明分区太小了,不足于容纳UBI文件系统,经过检测发现是由于ubimkvol不认识MiB单位,造成了文件系统实际只有50Byte.