jffs2文件系统制作

来源:互联网 发布:php linux 删除文件 编辑:程序博客网 时间:2024/06/05 06:01

jffs2文件系统,本菜鸟搞了两天难过,所以写篇文章,纪念下这两天的光阴。


开头惯例科普一下:

jffs2的全名为JournallingFlashFileSystemVersion2(闪存日志型文件系统第2版),其功能就是管理在MTD设备上实现的日志型文件系统。与其他的存储设备存储方案相比,JFFS2并不准备提供让传统文件系统也可以使用此类设备的转换层。它只会直接在MTD设备上实现日志结构的文件系统。JFFS2会在安装的时候,扫描MTD设备的日志内容,并在RAM中重新建立文件系统结构本身。(来自度娘)

进入正题:

  jffs2文件系统制作过程:


第一步:制作一个根文件系统(此处略过,主要就是创建根文件系统树,设备文件,符号链接文件,拷贝交叉编译器动态库,及系统启动必要的一些文件,配置文件,准备另写一篇文章,并捎上系统启动过程)

第二步:添加内核的支持
内核的支持无庸置疑的,只要是基于内核的,都要内核支持(没错,应该是这样微笑)。
[zhangl@centos6 linux-3.0]$ make menuconfig
  File systems  --->
      Miscellaneous filesystems  --->
           <*> Journalling Flash File System v2 (JFFS2) support
           (0)   JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
           [*]   JFFS2 write-buffering support
           [ ]   JFFS2 summary support (EXPERIMENTAL) 
           [ ]   JFFS2 XATTR support (EXPERIMENTAL) 

           [ ]   Advanced compression options for JFFS2 

跟上述选择一样就行,主要就是一些支持。

改完后,记得make,重新编译内核。


第三步:获取mkfs.jffs2工具
因为jffs2不是内嵌的内核中的,所以需要将其制作成镜像文件存于flash中,mkfs.jffs2工具就是用来制作jffs2镜像文件的。

制作mkfs.jffs2工具
该工具主要依赖lzo-2.04,zlib-1.2.5,e2fsprogsV1.42,mtd-utils-1.4.9(版本可不一样,可自己尝试使用更新的版本),具体制作过程较为繁琐,此处略过,可百度,可留言找我要。
获取mkfs.jffs2工具
如果制作了该工具,可在mtd-utils-1.4.9中找到(顺带还能找到做ubifs2的工具),将其拷贝到usr/bin之类存放命令的路径下。

第四步:制作镜像文件
之前提到jffs2需存放在flash中,所以此处制作镜像文件。此处就用到了上面的mkfs.jffs2工具(当作命令一样用)。


主要要用到的参数:

-n:用于去除挂载后的警告CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0


-s指定flash一页的大小,默认为4KiB(flash读的最小单位是页,此处要将KiB换算成bytes,具体原因我也不知道,如果用KiB,会造成镜像文件异常增大)


-e指定flash擦除块的大小,默认为64KiB(flash擦除的最小单位是块,此处可以用KiB为单位)(注:指定大小不可乱指定,任何地方指定错误均会造成镜像文件大小异常。且页和块的大小均可从芯片的datasheet上查找,上同)


-d指定做成镜像文件的源文件夹的路径(默认当前文件夹)


-o指定输出的根文件系统名,即镜像文件的名字。


-p(--pad)指定镜像文件的大小,最好符合flash所规划的区域大小,以节省flsh空间。


其他的参数不是必须的,可百度,此处略过。


具体命令:
[zhangl@centos6 opt]$ sudo mkfs.jffs2 -n -s 2048 -e 128KiB -d rootfs -o rootfs.jffs2 --pad=0x1400000
(附:1KiB=1024B,1KB=1000B,很容易搞错的)

可用命令查看大小是否正常:
[zhangl@centos opt]$ du -h rootfs.jffs2 
20M     rootfs.jffs2


第五步:添加uboot对jffs2支持:
即对uboot里的环境参数做相应的设置和改变。
[ s3c2440@zhangl ]# set bkr 'tftp 30008000 linuxrom-s3c2440.bin;nand erase 100000 f00000;nand write 30008000 100000 400000'


[ s3c2440@zhangl ]# set bjffs2 'tftp 30008000 rootfs.jffs2;nand erase 1000000 1400000;nand write 30008000 1000000 1400000'


[ s3c2440@zhangl ]# set bootargs 'noinitrd root=/dev/mtdblock4 rootfstype=jffs2 init=/linuxrc console=ttyS0,115200'


[ s3c2440@zhangl ]# set bootcmd 'nand read 30008000 100000 400000;bootm 30008000'
注:擦掉多少是根据内核里的分区大小决定的,可在linux-3.0/arch/arm/plat-s3c24xx/common-smdk.c中查看或修改(根据板子不同,内核不同,有些路径也不同)。


重新烧录了内核和jffs2文件系统后,正常情况下是可以正常进入文件系统的。不正常情况下会出现下列提示:
jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x004e0018: 0x34d8 instead
如果有此类的提示且进不了文件系统的话,多半在制作镜像文件的时候,擦除块的大小,读的页的大小和实际flash的大小不符,删掉旧的,重新制作即可。

如果有此类提示但可以进入系统,可以看下是否rootfs分区的大小和擦的大小不符,导致这一系列警告(可忽略,反正能用得意)。



至此,jffs2文件系统制作完成。

但我还存在一个问题:就算rootfs分区的大小与擦的大小相同,与文件系统的大小也相同,还是会报这个警告,希望有大神指导我。

jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x004e0018: 0x34d8 instead

还有上述如有错误,也请各路大神指出,毕竟我只是一只小菜鸟,难免出错。


0 0
原创粉丝点击