ubifs文件系统的制作详解.docx
- 文档编号:9624666
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:66
- 大小:247.25KB
ubifs文件系统的制作详解.docx
《ubifs文件系统的制作详解.docx》由会员分享,可在线阅读,更多相关《ubifs文件系统的制作详解.docx(66页珍藏版)》请在冰豆网上搜索。
ubifs文件系统的制作详解
ubifs文件系统的制作过程&&遇到的问题及解决方案总结---之一“uboot中添加对UBIFS文件系统的支持”
分类:
嵌入式2012-04-1821:
34314人阅读评论(0)收藏举报
为了更好的理解ubifs根文件系统的制作,首先,我们简单的说一下,系统的组成:
Bootloader(uboot)
parames(启动参数)
kernel(内核)
rootFilesystem
(根文件系统)
bootloader(uboot)的作用就是用来加载操作系统;而嵌入式linux系统由linux内核和根文件系统两部分构成,两者缺一不可。
所以我们要制作一个UBIFS的根文件系统,首先必须让上面系统组成的几个部分都支持UBIFS文件系统,就得在这几个组成部分添加一些“东西”(支持UBI的配置):
(打个我自己理解的比喻吧:
“娶媳妇”比作--启动系统,娶媳妇是不是要经过老爸、老妈、丈母娘、岳父的同意和支持?
bootloader、parames、kernel、rootFilesystem便是老爸、老妈、丈母娘、岳父...O(∩_∩)O~,而你叫"UBI")
这篇博文主要是详细解析:
uboot中添加对UBIFS文件系统的支持
一、移植环境
§主机:
vmware-redhat5
§开发板:
mini2440--256MBnandflash
§kernel:
2.6.29 编译器:
arm-linux-gcc-4.3.2.tgz
§uboot:
u-boot-2008.10
二.移植步骤
本次移植的功能为:
支持UBIFS文件系统
1.在include/configs/mini2440.h中添加如下配置:
(注意:
不同的开发板在include/configs/目录下对应的修改的配置文件不同,我的开发板是mini2440所以修改的是mini2440.h)
#defineCONFIG_MTD_DEVICE
#defineCONFIG_MTD_PARTITIONS
#defineCONFIG_CMD_MTDPARTS
#defineCONFIG_LZO
#defineCONFIG_RBTREE
#defineCONFIG_CMD_UBIFS //要支持ubIfs首先得让uboot支持UBIFS的烧写命令
#defineCONFIG_CMD_UBI //uboo支持的ubifs烧写命令:
1.mtdparts:
用来给NAND分区;
/*2.nanderase.part:
用来擦除指定分区 等这些命令在“UBIFS镜像的制作&&烧写”博文理解*/
//其次要支持MTD(memorytechnologydevice内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统
#defineMTDIDS_DEFAULT"nand0=nandflash0" //同时要给nandlflash建立默认的分区,
#defineMTDPARTS_DEFAULT"mtdparts=nandflash0:
384k(bootloader),"\ //我的分区:
"128k(params),"\
"5m(kernel),"\
"64m(root)"
/*还要修改下面几个宏,因为使用UBIFS会占用更多的堆、栈空间*/
#defineCONFIG_STACKSIZE(512*1024)
#defineCONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE+1024*1024)
#defineCONFIG_SYS_GBL_DATA_SIZE 512
2.回到uboot的顶层目录下
(可能拿到的uboot已被编译过,所以最好要用此命令清理中间文件)
执行命令:
makeclean
(uboot是通用的bootloader,支持多种开发板,所以编译之前先选择使用哪种board)
执行命令:
makemini2440_config
注意:
我用的是mini2440开发板,所以要编译这个开发板使用的uboot,所以这里的目标为mini2440_config,表示选择的board是mini2440
(mini2440_config在Makefile标准术语称为“目标”,可以在uboot顶层Makefile找到该目标)
执行命令(开始编译uboot):
makeCROSS_COMPILE=arm-linux-
ubifs文件系统的制作过程&&遇到的问题及解决方案总结---之二“Linux内核中添加对UBIFS文件系统的支持”
分类:
嵌入式2012-04-1913:
55156人阅读评论(0)收藏举报
一、移植环境
§主机:
vmware-redhat5
§开发板:
mini2440--256MBnandflash
§kernel:
2.6.29 编译器:
arm-linux-gcc-4.3.2.tgz
§uboot:
u-boot-2008.10
二.移植步骤
1.在内核顶层目录下使用命令:
makemenuconfig,进入内核配置菜单,添加对UBIFS文件系统的支持。
(补充:
如果菜单里没有<>UBIFSfilesystemsupport的选项,一般2.6.27以上的内核已经支持了UBIFS,所以只需把内核顶层目录下的.config文件里的#CONFIG_MTD_UBI isnot set 设置成:
CONFIG_MTD_UBI=y)如图:
之后退出.config文件并保存。
再次进入makemenuconfig菜单这时已经有了<>UBIFSfilesystemsupport的选项,把它设为<*>UBIFSfilesystemsupport "*"是编译进内核的意思
2.在arch/arm/plat-s3c24xx/common-friendly-arm.c中,添加对NANDFlash的MTD分区。
如图:
49-70行为修改部分
(注意:
对应不同开发板路径和分区文件会有所不同,方正就是在arch/arm/mach-s3c2440或者arch/arm/plat下面的某个文件;我原来就是因为弄错了路径和分区文件所以导致和uboot的默认分区对不上号,所以启动出错,大家可以参考我曾经的出错获得一些启示:
之后,退出保存;
3.回到内核顶层目录之后,
使用命令:
makeuImage ARCH=arm CROSS_COMPILE=arm-linux- ,编译内核,在arch/arm/boot/目录下生成内核的镜像uImage,并将生成的uImage拷贝到/tftpboot/目录下等待下载烧写。
[注意:
若没有生成uImage,看编译内核的提示说mkimage命令没有发现(找不到),说明你的系统中没有安装mkimage工具;
解决办法:
在uboot中我们知道mkimage是用来产生u-boot格式映像文件的,所以可以在u-boot源代码(编译之后)中把mkimage拷贝到/bin文件目录下。
具体操作:
我们从u-boot顶层目录下的tools目录中的mkimage拷贝到/usr/bin中,然后重新编译一次内核(即重新执行步骤3的命令)]
ubifs文件系统的制作过程&&遇到的问题及解决方案总结---之三“UBIFS镜像的制作&&烧写”
分类:
嵌入式2012-04-1916:
23254人阅读评论(0)收藏举报
一、移植环境
§主机:
vmware-redhat5
§开发板:
mini2440--256MBnandflash
§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,(我资源里)下载地址:
输入命令:
rpm -ivh libacl-2.2.23-5.4.e14.i386.rpm
b.安装lzo-2.05,(我资源里)下载地址:
执行如下命令:
# tar zxvf lzo-2.05.tar.gz
# cd lzo-2.05
# ./configure
# make
# makeinstall
c.安装mtd-utils.tar.gz (我资源里)下载地址:
# tar zxvfmtd-utils.tar.gz
#cd mtd-utils
#./configur
#make
#makeinstall
步骤2.使用上述安装命令后,mkfs.ubifs被安装到了/usr/local/usr/sbin目录下,可使用命令:
exportPATH=$PATH:
/usr/local/usr/sbin将该路径包含进环境变量,
然后使用命令:
mkfs.ubifs -m2048 -c 2048-e 126976 -r /nfsroot/rootfs -o rootfs.bin,将根文件系统所在目录rootfs制作为ubifs镜像文件rootfs.bin,将该文件拷贝到/tftpboot/目录下等待下载烧写。
(注意,你在哪执行这个命令,生成的.bin镜像就在执行此命令的当前目录下生成)
【注意点:
1.上面制作的ubifs镜像文件使用的命令参数是根据开发板所使用的NANDFlash来确定的,我的NANDFlash容量是256MB,可以适应命令:
mkfs.ubifs -h来查看各个命令选项的意思,我这里只简单的介绍一下:
-r:
要制作成镜像的根文件系统的路径
-m:
最小的I/O操作的大小(也就是NANDFLASH的一个page的大小)
-e:
逻辑擦除块的大小
-p:
物理擦除块的大小
-c:
最大逻辑擦除块的数量
-o:
最终制作成的根文件镜像的文件名
注意点:
2.我原来用mkfs.ubifs -m2048 -c 2048-e 126976 -r /nfsroot/rootfs -o rootfs.bin制作成的镜像,启动内核时有错,我曾经的出错现象:
但是发现启动内核时打印此出错信息:
UBIerror:
validate_ec_hdr:
badVIDheaderoffset512,expected2048
UBIerror:
validate_ec_hdr:
badECheader
UBIerror:
ubi_io_read_ec_hdr:
validationfailedforPEB556
UBIerror:
ubi_init:
cannotattachmtd3
UBIerror:
ubi_init:
UBIerror:
cannotinitializeUBI,error-22
后来找到了相近的解决方案:
按照这篇帖子最终内核成功的启动了
我现在还不太懂为什么“-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:
使用命令:
nanderase060000,将nandflash的前0x60000字节空间擦除掉。
在使用命令:
nandwrite31000000 0 60000,将内存31000000处的u-boot.bin烧写到nandflash中。
步骤6:
使用命令:
tftp 31000000uImage 使用命令:
nanderase80000 300000,将nandflash的kernel分区擦除掉,在使用命令:
nandwrite 3100000080000 300000,将内存31000000处的uImage烧写到nandflash中。
步骤7:
使用命令:
mtdpartsdefault 使用默认分区对NandFlash进行分区。
使用命令:
nand eraseroot,擦除root分区。
使用命令:
ubipart root 2048 ,激活root分区进行ubi格式化。
最后使用命令:
ubi create rootfs ,创建rootfs分区。
【注意点:
原来我用命令:
ubi part root 来激活root分区进行ubi格式化,但是启动内核时出现报错信息(看红字部分),所以按这篇博文part root 2048 之后就没有报错了
UBIerror:
validate_ec_hdr:
badVIDheaderoffset512,expected2048
UBIerror:
validate_ec_hdr:
badECheader
UBIerror:
ubi_io_read_ec_hdr:
validationfailedforPEB556
UBIerror:
ubi_init:
cannotattachmtd3
UBIerror:
ubi_init:
UBIerror:
cannotinitializeUBI,error-22】
步骤8:
使用命令:
tftp31000000 rootfs.bin 下载rootfs到默认内存地址31000000处,使用命令:
ubi write31000000 rootfs $filesize,将内存31000000处大小为$filesize的rootfs.bin通过ubi方式烧写到nandflash的对应分区中。
步骤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 read31000000 80000 $filesize; bootm 31000000" 最后使用sav命令保存环境变量)
步骤10:
关掉电源,让开发板重新从nand flash启动,可以看到内核成功加载了我们只做的ubifs文件系统,如图:
[注意点1:
set bootcmd "nand read31000000 80000 $filesize; bootm 31000000 "中的"31000000"是启动内核的地址,内核启动时自动找到31000000这个地方来启动kernel ;而前面用过的tftp 31000000 xxx 中的"31000000"是内存中的地址(存放在内存地址中的数据掉电后就没了)
注意点2:
如果bootm后面不跟地址,默认是到30008000处寻在内核启动的;如果bootcmd环境变量写成:
set bootcmd "nand read31000000 80000 $filesize; bootm 最终这种现象:
如图(因为它到30008000没有找到内核,内核原来由80000的内存地址读到了31000000地址处)
为S3C2440移植内核
2012-04-2422:
2320人阅读评论(0)收藏举报
1.修改晶振频率
S3C2440支持两种频率:
12MHZ和16MHZ.目前市面上出售的开发板大多使用的是12MHZ的晶振,而内核源代码采用的是16MHZ频率,从而产生了错误的PCLK,因此导致内核向串口输出数据时使用了错误的比特率(正确的应该是),这样在超级终端上看到的就是乱码。
因此我们只须修改内核源代码中的晶振频率即可。
将内核顶层目录下的arch/arm/mach-s3c2440/mach-smdk2440.c的第180行:
s3c24xx_init_clocks(16934400);
改为:
s3c24xx_init_clocks(12000000);
2.修改NandFlash分区表
这次内核正常启动,不再出现乱码,但未能成功挂载根文件系统。
出现错误如下:
VFS:
Mountedroot (jffs2filesystem).
Freeing init memroy :
132k
Warning:
unable to openan initial console.
Kernelpanic - not syncing :
Noinit found . Try passing init= option to kernel.
仔细查看内核出错前的输出,发现内核在Nand Flash上创建了 8个分区 :
Creating 8MTD partitionon "NAND 64MiB3,3v 8-bit":
0x00000000--0x00004000:
"Boot Agent"
0x00000000-- 0x00200000 :
"S3C2410 flash partition 1"
0x00400000-- 0x00800000 :
"S3C2410 flash partition 2"
0x00800000-- 0x00a00000 :
"S3C2410 flash partition 3"
0x00a00000-- 0x00e00000 :
"S3C2410 flash partition 4"
0x00e00000-- 0x01800000 :
"S3C2410 flash partition 5"
0x01800000-- 0x03000000 :
"S3C2410 flash partition 6"
0x00300000-- 0x04000000 :
"S3C2410 flash partition 7"
kernelcommalline:
noinitrd root=/dev/mtdblock2 console=ttySAC0 rootfstype=jffs2
由上面看出,内核会到NANDFlash的0x00400000~0x00800000区间来挂载根文件系统,但事实上通过u-boot烧写根文件系统时,是将其烧写到Nand Flash的0x00400000~0x04000000这个区间。
所以内核不能成功挂载根文件系统。
因此,必须修改内核对NandFlash的分区定义,让第3个分区位于0x00400000-0x04000000这个区间。
修改arch/arm/plat-s3c24xx/common-smdk.c文件,将static struct mtd_partition ....{}函数做如下修改,这样一来,整个Nand Flash被划分为4个分区。
第一个分区大小1MB,存放u-boot;
第二个分区大小3MB,存放kernel;
第三个分区大小60MB,存放根文件系统;
第四个分区从第64M开始一直到Nand Flash的最后,可用于扩展。
static struct mtd_partition smdk_default_nand_part[]={
[0]={
.name = "Bootloader",
.size = SZ_1M,
. offset =0,
},
[ 1]={
.name = "kernel",
. offset =SZ_1M,
.size = SZ_2M+SZ_1M
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ubifs 文件系统 制作 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)