基于ATMEl at91sam9g45 平台的UBIFS文件系统制作详细过程


这几天都在搞UBIFS文件系统,其实工作上暂时没有要求,但一位朋友在技术群上问道这个问题,考虑一下这个是比较新的东东,android上据说都在用,那么就研究一下吧,上CSDN、google找到N多个链接,打开却发现都是统一版本,全是转帖,呵呵,看来原创还是比较困难,大家不稀饭码字,喜欢分享。那么我就将这几天所得码一下字,给需要的朋友参考,也给自己做个备份。理论的东东就不描述,wiki什么的都一大堆,你需要静下心来看,很多问题都是可以从中的角瘩里寻到答案的,这是我的一点小建议。
有关ubifs的详细介绍,请参考:
http://www.linux-mtd.infradead.org/doc/ubi.html
http://www.linux-mtd.infradead.org/doc/ubifs.html
http://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.gz
tar zxvf lzo-2.04.tar.gz
cd 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-gnueabi
b.) 编译:
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.x86
b.修改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 mkclean
d.编译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/install
export 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 -lubi
collect2: ld returned 1 exit status
make[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.git
cd 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-dev
NOTE:这时候不能用交叉编译,一定要用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.img
ubinize -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.img
c).Attach the image to the UBI subsystem 匹配image
   root# ubiattach /dev/ubi_ctrl -m 5
d).挂载:
   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=ubifs
saveenv
reboot 后即挂载到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的问题,当然有心的朋友可以继续朝这条道研究研究,我时间不够,花费太多,又得挨老板的屌了。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值