ubifs文件系统的制作过程&&遇到的问题及解决方案总结---
一、移植环境 §主机:vmware-redhat5????? §开发板:mini2440--256MB nandflash §kernel:2.6.29???? 编译器:arm-linux-gcc-4.3.2.tgz???? §uboot: u-boot-2008.10 ? 二、制作ubifs镜像 步骤1:将文件系统制作成 ubifs镜像文件,需要使用mkfs.ubifs工具,该工具可以在网址:http://git.infradead.org/mtd-utils.git?,下载mtd-utils工具包源码编译后获得。 在安装mtd-utils之前首先在系统中安装如下两个软件: (因为原先我看一些博文给的地址都不可访问,只好按名称东下一个西下一个,编译后都出错没法解决,特此提醒,后来暮然回首,在我的以前做过的文件系统中找到了以下三个经编译后可成功生成ubifs命令工具,(现放我资源里,提供给大家)请放心下载) ? a.安装libacl,(我资源里)下载地址:http://download.csdn.net/detail/yx_l128125/4243336? 输入命令:rpm? -ivh? libacl-2.2.23-5.4.e14.i386.rpm b.安装lzo-2.05,(我资源里)下载地址:http://download.csdn.net/detail/yx_l128125/4243343? 执行如下命令: #??? tar?? zxvf?? lzo-2.05.tar.gz #??? cd? lzo-2.05 #?? ./configure #?? make #? ?make install c.安装 mtd-utils.tar.gz? (我资源里)下载地址:http://download.csdn.net/detail/yx_l128125/4243333 #? tar? zxvf mtd-utils.tar.gz # cd? mtd-utils # ./configur # make # make install ? 步骤2.使用上述安装命令后,mkfs.ubifs被安装到了/usr/local/usr/sbin目录下,可使用命令:export PATH=$PATH:/usr/local/usr/sbin将该路径包含进环境变量, 然后使用命令:mkfs.ubifs? -m 2048? -c?2048 -e? 126976? -r? /nfsroot/rootfs? -o?? rootfs.bin,将根文件系统所在目录rootfs制作为ubifs镜像文件rootfs.bin,将该文件拷贝到/tftpboot/目录下等待下载烧写。(注意,你在哪执行这个命令,生成的.bin镜像就在执行此命令的当前目录下生成) 【注意点:1.上面制作的ubifs镜像文件使用的命令参数是根据开发板所使用的NAND Flash来确定的,我的NAND Flash容量是256MB,可以适应命令:mkfs.ubifs? -h 来查看各个命令选项的意思,我这里只简单的介绍一下: -r :要制作成镜像的根文件系统的路径 -m:最小的I/O操作的大小(也就是NAND FLASH的一个page的大小) -e : 逻辑擦除块的大小 -p :物理擦除块的大小 -c :最大逻辑擦除块的数量 -o :最终制作成的根文件镜像的文件名 注意点:2.我原来用mkfs.ubifs? -m 2048? -c?2048 -e? 126976? -r? /nfsroot/rootfs? -o?? rootfs.bin 制作成的镜像,启动内核时有错,我曾经的出错现象:http://www.arm9home.net/read.php?tid-19717.html??但是发现启动内核时打印此出错信息: UBI error: validate_ec_hdr: bad VID header offset 512,expected 2048 我现在还不太懂为什么“-e? 126976”而不是大多数制作ubifs文件系统写的 “-e? 129024?”如果大家知道请通知我,不胜感激!】 ? 步骤3.通过Jlink或者H-JTAG将u-boot.bin先烧进norflash,之后连接好串口线和网线,从norflash启动开发板。 步骤4.设定好网络相关的环境变量,重点是先设置好ipaddr和serverip(因为下面用到tftp协议下载)之后用sav命令保存环境变量; 之后用命令:tftp? 31000000? u-boot.bin???? 下载uboot.bin到内存地址31000000处。 步骤5:使用命令:nand erase 0 60000,将nand flash的前0x60000字节空间擦除掉。在使用命令:nand write 31000000?? 0?? 60000,将内存31000000处的u-boot.bin烧写到nand flash中。 步骤6:使用命令:tftp? 31000000 uImage?????使用命令: nand erase 80000?? 300000,将nand flash的kernel分区擦除掉,在使用命令:nand write? 31000000 80000? 300000,将内存31000000处的uImage烧写到nand flash中。 步骤7:使用命令:mtdparts default???使用默认分区对Nand Flash进行分区。使用命令:nand? erase root,擦除root分区。使用命令:ubi part? root? 2048??,激活root分区进行ubi格式化。最后使用命令:ubi?? create? rootfs?,创建rootfs分区。 【注意点:原来我用命令:? ubi???? part? root?来激活root分区进行ubi格式化,但是启动内核时出现报错信息(看红字部分),所以按这篇博文http://blog.chinaunix.net/space.php?uid=20632682&do=blog&id=82414改成:ubi part? root? 2048??? 之后就没有报错了 UBI error: validate_ec_hdr: bad VID header offset 512,expected 2048 步骤8:使用命令:tftp 31000000? rootfs.bin?下载rootfs到默认内存地址31000000处,使用命令:ubi?? write 31000000? rootfs?? $filesize,将内存31000000处大小为$filesize的rootfs.bin通过ubi方式烧写到nand flash的对应分区中。 步骤9: 设置启动变量: bootargs,(bootargs是uboot传给内核的参数,使用命令:set?? bootargs? "ubi.mtd=3? root=ubi0:rootfs?? rootfstype=ubifs? console=ttySAC0? init=/linuxrc?? rw " ?设置启动命令:bootcmd,(bootcmd 是uboot启动的命令,输入命令:set? bootcmd? " nand? read 31000000 ? 80000??$filesize;? bootm? 31000000"?最后使用sav命令保存环境变量) 步骤10:关掉电源,让开发板重新从nand ?flash启动,可以看到内核成功加载了我们只做的ubifs文件系统,如图: [注意点1:set? bootcmd? " nand? read 31000000 ? 80000??$filesize;? bootm? 31000000?" 中的"31000000"是启动内核的地址,内核启动时自动找到31000000这个地方来启动kernel?;而前面用过的tftp?? 31000000?? xxx?中的"31000000"是内存中的地址(存放在内存地址中的数据掉电后就没了) 注意点2:如果 bootm后面不跟地址,默认是到30008000处寻在内核启动的;如果bootcmd环境变量写成:set? bootcmd? " nand? read 31000000 ? 80000??$filesize;? bootm???最终这种现象:如图(因为它到30008000没有找到内核,内核原来由80000的内存地址读到了31000000地址处) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |