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”错误。
经上网查找原因,在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上。
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
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 '