天天看点

UBIFS文件系统搭建与配置(Micro2440 + linux 2.6.39)

1. UBIFS文件系统配置

a) 内核配置

        2.6.27以后,ubifs被整合进内核树中,本文档所使用的2.6.39内核中已经包好UBIFS的相关代码,因此直接进行make menuconfig配置即可。

        Device Drivers  --->

                <*> Memory Technology Device (MTD) support  ---> 

                <*>   Enable UBI - Unsorted block images  ---> 

        File systems  --->

                [*] Miscellaneous filesystems  --->

                <*>   UBIFS file system support

                [*]     Extended attributes support

                [*]     Advanced compression options

                [*]       LZO compression support 

                [*]       ZLIB compression support

b) 创建UBIFS相关设备节点(没有以下两个设备文件的则需要创建,可将命令加到/etc/init.d/rcS中,让其开机自动创建)

        # mknod /dev/ubi_ctrl c 10 63

        # mknod /dev/ubi0 c 251 0  //这个文件没有的,通过cat /proc/devices//查询主设备号,如果主设备号不对,将无法//执行ubimkvol

c) 格式化一空闲分区,用于挂载UBIFS

        # /mtd_tools/flash_eraseall /dev/mtd3

d) 将mtd3分区关联到ubi上(ubiattach可以在mtd-utils工具/busybox中取得,我这里是使用busybox中的)

        # ubiattach /dev/ubi_ctrl -m 3 //最后一个数据表示分区号

        如下图所示,提示“UBI error: ubi_io_write: error -5 while writing 512 bytes to PEB 0:512, written 0 bytes”错误。

UBIFS文件系统搭建与配置(Micro2440 + linux 2.6.39)

        经上网查找原因,在http://www.linux-mtd.infradead.org/faq/ubi.html#L_subpage_verify_fail有对这个问题的专门描述:

        I get "ubi_io_write: error -5 while writing 512 bytes to PEB 5:512"

        If you have a 2048 bytes per NAND page device, and have CONFIG_MTD_NAND_VERIFY_WRITE enabled in your kernel, you will need to turn it off. The code does not currently (as of 2.6.26) perform verification of sub-page writes correctly. As UBI is one of the few users of sub-page writes, not much else seems to be affected by this bug.

        如上所述,我的NAND的页大小是2048B的,需要关闭内核配置CONFIG_MTD_NAND_VERIFY_WRITE。

        Device Drivers  --->

                <*> Memory Technology Device (MTD) support  --->

                         <*>   NAND Device Support  --->

                                [ ]   Verify NAND page writes  

        修改配置后生成uImage并下载至开发板运行,此时已经可以顺利将mtd3分区关联到ubi上。

UBIFS文件系统搭建与配置(Micro2440 + linux 2.6.39)

e) 设定volume 大小(不是固定值,可以用工具改变)及名称(ubimkvol可以在mtd-utils工具/busybox中取得,我这里是使用busybox中的)

        结合上一步(d步)的打印信息可知,这个分区总共有250MiB的空间,有2005片PEB可用,其中要分出一小部分PEB以供UBI运行时使用(具体多少没研究),还剩大部分PEB用来存储数据。因此这里设置volume 大小为240MiB,使用全部250MiB会提示错误。

        # ubimkvol /dev/ubi0 -N root -s 240MiB

f) 挂载/卸载文件系统

        # mount -t ubifs ubi0:root /mnt

        # umount /mnt   

g) 重复挂载

        如果系统重启了,只需要重新执行关联(d步)和挂载(f步)操作即可。如果系统没有重新,则只需要执行f步操作即可。

        # ubiattach /dev/ubi_ctrl -m 3

        # mount -t ubifs ubi0:root /mnt

2. UBIFS文件系统映像制作

a) 下载较新版本的mtd-utils(旧版本没有ubi-utils)

       官方:http://git.infradead.org/mtd-utils.git 

       网盘:http://pan.baidu.com/s/1gd3Rk11 (mtd-utils-1.5.0.tar.bz2)

       如何编译mtd-utils-1.5.0这里就不作详细说明,直接解压后make即可,然后把生成的可执行文件(mkfs.ubifs)复制至/usr/bin中。这里需要注意一点的是,编译mtd-utils之前需要安装libacl-deve、lzo-devel、libuuid-devel,Cent OS可以使用yum来安装。

b) 使用mkfs.ubifs制作UBIFS镜像

       # mkfs.ubifs -m 2048 -c 1950 -e 129024 -r ./NFS -o fs_micro2440.uboot.ubifs

       以上命令的含义为将./NFS文件夹制作为UBIFS文件系统镜像,输出的镜像名为fs_mini.uboot.ubifs,-m参数指定了最小的I/O操作的大小,也就是NAND FLASH一个page的大小,-e参数指定了逻辑擦除快的大小,-c指定了最大的逻辑块号。通过此命令制作的出的UBIFS文件系统镜像可在u-boot下使用ubi write命令烧写到NAND FLASH上。

       命令的参数根据实际的NAND进行调整,可以在分区关联到ubi时的输出信息中获取参数(即ubiattach命令,上面d步),这里对主要的参数进行说明一下:

              -m: 最小的I/O操作的大小(也就是NAND FLASH的一个page的大小)

              -c : 最大逻辑擦除块的数量(文件系统总容量/逻辑擦除块大小)

                     我这个板子文件系统最多可以访问卷上的129024*1950=240M空间

              -e : 逻辑擦除块的大小

              -r : 要制作成镜像的根文件系统的路径

              -o : 最终制作成的根文件镜像的文件名

c) 配置ubinize.cfg

       在当前目录新建ubinize.cfg文件,并输入以下内容:

[ubifs]

mode=ubi

image=fs_micro2440.uboot.ubifs

vol_id=0

vol_size=240MiB

vol_type=dynamic

vol_alignment=1

vol_name=root

vol_flags=autoresize

d) 转换成FLASH烧写格式

       # ubinize -o fs_micro2440.flash.ubifs -m 2048 -p 128KiB -s 512 ubinize.cfg

       使用ubinize命令可将使用mkfs.ubifs命令制作的UBIFS文件系统镜像转换成可直接在FLASH上烧写的格式(带有UBI文件系统镜像卷标)。通过此命令生成的ubi.img可直接使用NAND FLASH的烧写命令烧写到FLASH上。

       命令的参数根据实际的NAND进行调整,可以在分区关联到ubi时的输出信息中获取参数(即ubiattach命令,上面d步),这里对主要的参数进行说明一下:

              -o : 最终制作成的根文件镜像的文件名

              -m: 页面大小 

              -p: 物理擦除块大小 

              -s: 最小的硬件输入输出页面大小 (sub-page size)

e) 测试镜像是否能成功挂载

       # /mtd_tools/flash_eraseall /dev/mtd3

       # /mtd_tools/nandwrite -a -p /dev/mtd3 ./fs_micro2440.flash.ubifs

       # ubiattach /dev/ubi_ctrl -m 3

       # mount -t ubifs ubi0:root /mnt  

UBIFS文件系统搭建与配置(Micro2440 + linux 2.6.39)

f) 通过UBIFS启动根文件系统

       到这里,已经可以知道制作的UBIFS镜像可以正常启动,并已把镜像通过MTD的FLASH工具烧写到NAND FLASH中(linux mtd3分区),现在可以修改Linux启动参数,让其挂载此分区为rootfs。

       # setenv bootargs 'mem=64M console=ttySAC0,115200 mac=00:60:6E:42:BA:80 ubi.mtd=3 root=ubi0_0 rootfstype=ubifs ip=192.168.2.123:192.168.2.222:192.168.2.1:255.255.255.0:::eth0:off '

UBIFS文件系统搭建与配置(Micro2440 + linux 2.6.39)

继续阅读