这几天都在搞UBIFS文件系统,其实工作上暂时没有要求,但一位朋友在技术群上问道这个问题,考虑一下这个是比较新的东东,android上据说都在用,那么就研究一下吧,上、google找到N多个链接,打开却发现都是统一版本,全是转帖,呵呵,看来原创还是比较困难,大家不稀饭码字,喜欢分享。那么我就将这几天所得码一下字,给需要的朋友参考,也给自己做个备份。理论的东东就不描述,wiki什么的都一大堆,你需要静下心来看,很多问题都是可以从中的角瘩里寻到答案的,这是我的一点小建议。有关ubifs的详细介绍,请参考:http://www.linux-mtd.infradead.org/doc/ubi.htmlhttp://www.linux-mtd.infradead.org/doc/ubifs.htmlhttp://www.openplug.org/plugwiki/index.php/Enabling_UBIFS(这个是你能否启动的最好参考)====================================================================================环境描述:atmel at91sam9g45处理器 (256MByte 8 bit NAND Flash) 、u-boot-1.3.4 、linnux-2.6.30内核(mtd-utils工具(flash_eraseall、ubiattach、ubimkvol等等)准备)
====================================================================================1.最新的lzo是 lzo-2.04.tar.gz, 下载并解压wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.04.tar.gztar zxvf lzo-2.04.tar.gzcd lzo-2.04
配置:./configure --host=i686-linux --target=arm-linux CC=arm-none-linux-gnueabi-gcc --prefix=/usr/local/arm/arm-2010.09/arm-none-linux-gnueabi
编译: make
安装: sudo make install
检查:liblzo2.a 已经拷贝到工具链的lib目录.
====================================================================================
2.zlib目前最新是zlib-1.2.5.tar.gz, 下载并解压.
配置:
CC=arm-none-linux-gnueabi-gcc ./configure --prefix=/usr/local/arm/arm-2010.09/arm-none-linux-gnueabi编译: make
安装: make install
检查: zconf.h 和 libz.a 都安装到了工具链目录.
=====================================================================================3. 使用git下载最新的 e2fsprogs: git clone git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git 但编译会出错:e4defrag.c:213:2: error: #error Your kernel headers dont define __NR_sync_file_range可能原因:版本太新和kernel不匹配,google上说是要打补丁。重新下了一个版本e2fsprogs-1.41.4编译很顺利如下:a.) 配置: e2fsprogs ./configure --host=i686-linux --target=arm-linux CC=arm-none-linux-gnueabi-gcc --prefix=/usr/local/arm/arm-2010.09/arm-none-linux-gnueabib.) 编译: make
c.) 安装:因为我们只需要 uuid 库, 所以不需要完全安装, 查看 Makefile文件, 所以只执行: sudo make install-libs
d.) 检查:可以在工具链目录看到, uuid/uuid.h 文件已经安装. libuuid.a 已经安装.
========================================================================================4.编译mtd-utils.wget http://debian.mirror.inra.fr/debian/pool/main/m/mtd-utils/mtd-utils_20090606.orig.tar.gz(版本为2008的进行如下修改)a.修改mtd-utils的Makefile文件 cp Makefile Makefile.arm cp Makefile Makefile.x86b.修改Makefile.arm文件 vi Makefile.arm 把第8行的 #CROSS=arm-linux- 修改为 CROSS=arm-none-linux-gnueabi-gcc
把第10行的 CFLAGS := -I./include $(OPTFLAGS) 修改为 CFLAGS := -I./include $(OPTFLAGS) -I/usr/local/arm/arm-2007q1/arm-none-linux-gnueabi/include 修改14行为BUILDDIR := .
c.增加mtd-utils的编译脚本 vi mkall 在 mkall中写入: make -f Makefile.$1 clean make -f Makefile.$1 WITHOUT_XATTR=1 vi mkclean 在 mkall中写入: make -f Makefile.$1 clean 保存后修改可执行权限 chmod 777 mkall chmod 777 mkcleand.编译mtd-utils ARM版本 ./mkall arm X86版本 ./mkall x86 清除mtd-utils目标码 ./mkclean arm ./mkclean x86
版本为(20090606):
mtd-utils 与上述的库有区别, 库文件安装到工具链中, 而应用程序(mtd-utils)应该安装到文件系统中. 所以指定 --prefix=/home/vincent/Downloads/install, 手工建立该空文件夹.
a).指定编译参数: export CROSS=arm-none-linux-gnueabi- export DESTDIR=/home/vincent/Downloads/installexport WITHOUT_XATTR=1(不加该行命令,则make出错:sys/acl.h coundn't find)直接编译: make 安装: make install 此时会会有error:/usr/local/arm/arm-2007q1/bin/../lib/gcc/arm-none-linux-gnueabi/4.2.0/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lubicollect2: ld returned 1 exit statusmake[1]: *** [/home/vincent/Downloads/mtd-utils-20090606/arm-none-linux-gnueabi/mkfs.ubifs/mkfs.ubifs] Error 1
没关系,这个是说找不到ubi文件,其实这个只是生成mkfs.ubifs工具所需要的,我们制作ubifs文件系统是在PC机上(X86)平台制作,所以不生成也罢,即使生成了也不可用。
b).检查1:/home /vincent/install/usr/sbin 是否已经拷贝了所有mtd-utils的工具(一般情况下是OK的)。
检查2:file flash_eraseall flash_eraseall: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.14, not stripped
有两点不符合要求, 第一是使用动态库, 第二是没有strip.
查看Makefile 和 common.mk 文件, 发现有 CFLAGS ?= -O2 -g 编译选项,
所以再加上一个选项: export CFLAGS="-static -O2 -g"
重新运行make & make install
c).去掉调试信息, 在 /home/vincent/Downloads/install/usr/sbin 运行 arm-none-linux-gnueabi-strip *
再次检查:file flash_eraseall flash_eraseall: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.14, stripped
完成, 编译出来的工具如: flash_eraseall, ubimkvol, ubiattach 等都可以独立运行于android平台.
============================================================================================5.mtd-utils工具(mkfs.ubifs、ubinize)准备git-clone git://git.infradead.org/mtd-utils.gitcd mtd-utils/make这里会爆很多个错误,大部分都是找不到库文件什么的,eg>/usr/bin/ld: cannot find -lxxx的错误有很多, 首先我们可以最简单的判断一下:
这类情况一般是由于缺乏某某库文件, 又或者可能是由于已存在的库问题版本不对造成的一般都是解决的办法就是安装缺乏的devel包就可以解决, 当然还有其他的未知因素.排查此类问题,先看看是找不到什么库,确定程序需要这个库,然后去了解系统默认会去调用哪些库,最后排查库是不是存在还是路径不对。
我机子上主要出现两个:/usr/bin/ld: cannot find -llzo /usr/bin/ld: cannot find -luud
根据提示安装库: sudo apt-get install liblzo2-dev sudo apt-get install uuid-devNOTE:这时候不能用交叉编译,一定要用gcc.mkfs.ubifs子目录下生成我们需要的mkfs.ubifs工具.ubi-utils/new-utils子目录下生成我们需要的ubinize工具.
至此,我们所有要用到的ubifs相关的东西都齐了。==============================================================================在制作UBI镜像时,需要首先确定以下几个参数:可以使用ubiattach工具查看,所有工具都可以用 command+-h(eg.ubiattach -h) 获得help message. MTD partition size; //对应的FLASH分区大小(6 MiB ) flash physical eraseblock size; // FLASH物理擦除块大小(131072 bytes (128 KiB)) minimum flash input/output unit size; //最小的FLASH输入输出单元大小 (2048) for NAND flashes - sub-page size; //对于nand flash来说,子页大小(512) logical eraseblock size.//逻辑擦除块大小(129024 bytes)
制作ubifs镜像:mkfs.ubifs -r nfs_6045 -m 2048 -e 129024 -c 48 -o ubifs.imgubinize -o ubi.img -m 2048 -p 128KiB -s 512 ./ubinize.cfg参数解释: -r:制定文件内容的位置 -m:页面大小 -e:逻辑擦除块大小 -p:物理擦除块大小 -c:最大的逻辑擦除块数量 对我们这种情况,文件系统最多可以访问卷上的129024*812=100M空间 -s:最小的硬件输入输出页面大小,如:k9f1208为256(上下半页访问)
ubinize.cfg文件内容:vi ubinize.cfg 1 [ubifs] 2 mode=ubi 3 image=ubifs.img 4 vol_id=0 5 vol_size=6MiB 6 vol_type=dynamic 7 vol_name=nfs_6045 8 vol_flags=autoresize
1.使用步骤:a).首先先让系统启动进入到shell模式,可以采用yaffs2&jffs2或者NFS模式(只要能启动的都OK),这里我采用NFS模式;b).Format the NAND with your new image 这一步很重要,先前没有运行这个格式化命令,总是报error搞得很郁闷。 root# ubiformat /dev/mtd5 -s 512 -f ubi.imgc).Attach the image to the UBI subsystem 匹配image root# ubiattach /dev/ubi_ctrl -m 5d).挂载: root# mount -t ubifs ubi0:nfs_6045 /mnt/ubi/但是有个问题还未解决:我MTD分区为7个,MTD4分区为6MiB但是attach不上的,MTD5、MTD6分别为8MiB和236MiB都可以成功挂载,原先是考虑到分区容量太小,但仔细查看ubi.img size is 5.7MiB,也不会超过,下次有时间再改MTD4 size ,验证一下估计是否正确。
e).烧录:uboot->setenv bootargs console=ttySAC0,115200n8 ubi.mtd=5 root=ubi0:nfs_6045 rootfstype=ubifssaveenvreboot 后即挂载到UBIFS根文件系统了。 参考网上资料:1. http://www.hao32.com/webserver/258.html 2.http://hi.baidu.com/3444542/blog/item/95bea529777da3f298250a52.html 3.在ubuntu 10.04上交叉编译编译 mtd-utils. NOTE: 网上文章有说需要移植u-boot支持UBIFS,我做了很多修改,最终还是没完成,例如按照u-boot中的README文档中所述的添加了UBIFS宏,然后u-boot就启动不了了,查了资料是说u-boot变大了,size超过320K,查看u-boot的每月的邮件列表也看过一些补丁,但还是没能完全解决,于是干脆不理他,采用上述方式可以避开u-boot的问题,当然有心的朋友可以继续朝这条道研究研究,我时间不够,花费太多,又得挨老板的屌了。