JFFS2 是一个开放源码的项目(www.infradead.org)。 它是在闪存上使用非常广泛的读/写文件系统,在嵌入式系统中被普遍的应用。

1.       安装mkfs工具

MTD主页:http://www.linux-mtd.infradead.org/archive/index.html

下载MTD:ftp://ftp.uk.linux.org/pub/people/dwmw2/mtd/cvs/

1.1.   配置参数

下载好MTD软件,解压后

$ make menuconfig

按需要配置参数,下边是在网上搜索到的一个配置方案:

进入 Memory Technology Devices (MTD) --->

<*> Memory Technology Device (MTD) support

[*] Debugging

[*] MTD partitioning support

[*]  Command line partition table parsing

[*] Direct char device access to MTD devices

[*] Caching block device access to MTD devices

RAM/ROM/Flash chip drivers ----->

<*> Detect non-CFI AMD/JEDEC-compatible flash chips

<*> Support for AMD/Fujitsu flash chips

Mapping drivers for chip access --->

[*] Support non-linear mappings of flash chips

Self-contained MTD device drivers --->

[*] Support for AT45... DataFlash

NAND Flash Device Drivers ---->

[*] NAND Device Support

[*] Support for NAND Flash /SmartMedia on AT91

File systems ---->

<*> Second extended fs support

[*] Inotify file change notification support

[*] Inotify support for user space

<*> Filesystem in Userspace support

Miscellaneous filesystems

<*> Journalling Flash File System v2 (JFFS2) support

[*] JFFS2 write-buffering support

<*> Compressed ROM file system support (cramfs)

以上配置中没有列出的,都没选;其配置仅做参考,可根据自己的需要自行配置。

$ make all

1.2.   安装zlib库

由于交叉编译mtd工具时需要zlib.h文件,所以在编译之前先安装zlib库文件。从网上下载zlib-1.2.3.tar.gz解压缩

$ tar zxvf zlib-1.2.3.tar.gz

$ cd zlib-1.2.3

$ ./configure –prefix=/usr/local/arm/arm-linux --shared

修改Makefile如下:

CC=gcc(由于我的mkfs.jffs2是在宿主机下制作文件系统用的,因此不需要采用交叉编译。下边的LDSHARED也是一样,不需要采用交叉工具)

LDSHARED=ld -shared

$ make all

$ make install

注意:这里是安装在/usr/local/arm/arm-linux目录下

1.3.   安装mtd

从网上下载mtd-snapshot-20050519.tar.bz2 解压缩

$ tar jxvf mtd-snapshot-*

$ cd mtd/util

修改该目录下的Makefile:

SBINDIR=/usr/sbin

MANDIR=/usr/man

INCLUDEDIR=/usr/include

LDFLAGS=-L/usr/local/arm/arm-linux/lib           #zlib库的库文件所在文件夹

CROSS=                      #用于宿主机下

CC := $(CROSS)gcc

CFLAGS := -I../include -I/usr/local/arm/arm-linux/include -O2 -Wall

$ make all

(加上-I/usr/local/arm/arm-linux/include是因为,在编译的过程中出现找不到zlib.h的错误,加上LDFLAGS也还是有同样的错误,所以直接在CFLAG中加上zlib库文件所在的文件夹的位置。)

然后将该目录下生成的 flash_erase,flash_eraseall, mkfs.jffs2工具放在ramdisk文件系统中(我这里放在/bin目录下)。另外,需要将/arm-linux/lib目录下的libz.so, libz.so.1, libz.so.1.2.3文件拷贝到ramdisk文件系统的/lib目录下,否则mkfs.jffs2工具不能使用。

2.       挂载、制作jffs2文件系统

在这里,为了避免重新制作文件系统,我采用了英蓓特公司的MBS-SAM9G45开发板自带的jffs2文件系统Angstrom-x11-image-demo-glibc-at91.rootfs.jffs2。在整个制作jffs2文件系统的过程中,我们采用root权限。

2.1.   挂载文件系统镜像

jffs2文件系统不是块设备,不能直接mount,需要做一些中间步骤。首先,内核必须支持MTD,并且编译了mtdram、mtdblock这两个模块。先先建立一个大于等于要挂载的文件系统的虚拟mtd设备。Angstrom-x11-image-demo-glibc-at91.rootfs.jffs2文件系统为28.2M,那么我先建立一个大于等于28.2M的虚拟mtd设备。(为了避免制作过程当中向文件系统里边添加大文件,我将mtd大小设置为50M*1024=50720K)

$ sudo modprobe mtdram total_size=50720

其中,total_size的单位是KB,指定mtd的大小。

加载mtdblock产生虚拟块设备并把Angstrom-x11-image-demo-glibc-at91.rootfs.jffs2的内容写入生成的虚拟设备中:

$ sudo modprobe mtdblock

$ sudo dd if=/home/Embest_SAM9G45/Angstrom-x11-image-demo-glibc-at91.rootfs.jffs2 of=/dev/mtdblock0

(注:dd命令是指定大小的块拷贝文件,并在拷贝的同时进行指定的转换。if=file:输入文件名,缺省为标准输入。of=file:输出文件名,缺省为标准输出。)

创建挂载点:

$mkdir /mnt/mtd

现在就可以mount了:

$ sudo mount -t jffs2 /dev/mtdblock0 /mnt/mtd

进入/mnt/mtd之后即可对文件系统进行修改!

2.2.   制作jffs2文件系统镜像

修改(在后边一步讲)好自己的文件系统后,退到已做好的文件系统目录的上一级。比如我的文件系统的挂载点是/mnt/mtd,则退到/mnt目录下,用mkfs.jffs2工具制作jffs2文件系统,如下:

#mkfs.jffs2 -r rootfs -o fs.jffs2 -e 0x20000 --pad=0x500000 -s 0x800 –n -l

即可生成 rootfs.jffs2

Mkfs.jffs2各参数的意义如下:

-r:指定要做成image的目录名。

-o:指定输出image的文件名。

-e:每一块要擦除的block size,默认是64KB.要注意,不同的flash, 其block size会不一样,三星的K9F2G08U0A的block size为0x20000(从其datasheet里可以找到)。在没有加-e选项是,启动会出现以下错误:at91sam user.warn kernel: Empty flash at 0x00f0fffc ends at 0x00f10000。因此,若有类似的错误,加上-e选项,并配置nandflash的块大小,即可消除。

--pad(-p):用16进制来表示所要输出文件的大小,也就是fs.jffs2的大小,如果实际大小不足此设定的大小,则用0xFF补足。也可以不用此选项,生成的文件系统的大小跟本身大小一致,暂时还不知道有和妙用,但是加上后会少出现很多错误。

-n,-no-cleanmarkers:指明不添加清楚标记(nandflash有自己的校检块,存放相关的信息)。如果挂载后会出现类似:CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0的警告,则加上-n就会消失。

-l,--little-endian:指定使用小端格式。

还有的选项,不需要了,可以自己看帮助!用如下命令mkfs.jffs2 –h。

3.       修改文件系统 3.1.   需要修改的原因

1、  系统在启动时,会启动很多的项目,而很多的进程是我们根本不需要的,通过对文件系统的修改,可以减少启动项,加快开机速度。

2、  由于开发板提供的文件系统很全面,囊括了声卡、显卡、游戏、液晶显示屏等很多驱动,但是这些都是我所不需要的,因此通过修改文件系统,我们可以裁减掉不需要的驱动、库文件以及所有的配置文件。

3、  在系统启动时,需要加入我们自己启动程序。在这个文件系统中,加入了超级用户自动登录功能、无线网卡驱动自启动以及和FPGA的接口驱动自动加载。

3.2.   删除多余的启动项

所有的启动项都在init.d中实现,按照不同的runlevel,分布在rc0.d~rc6.d以及rcS.d中。rc?.d和/etc/init.d的关系,在下边这篇文章中叙述的相当详细,可以参考学习:

http://wenku.baidu.com/view/8bdb9237ee06eff9aef8071b.html

rc?.d中都是指向/etc/init.d中脚本的连接。在rc?.d中,可以看到有K和S开头的两种连接。S开头表示启动,K开头表示不启动。在启动时,系统会执行rc?.d中的所有S开头的所指向的脚本文件。因此,我们只需要修改rc?.d中的连接以及/etc/init.d中的脚本文件,就可以修改启动的项目。

在本文件系统中,我做了如下修改:

rc2.d:关闭S50usb-gadget。

rc3.d:关闭S50usb-gadget、S10alsa-state、S10dropbear。

rc4.d:关闭S50usb-gadget。

rcS.d:关闭S00psplash(旋转进度条,显示开机的进度)、S02banner。

我用的关闭的方法是mv S50usb-gadget K50usb-gadget,这样就关闭了usb-gadget,在需要启动此项时,也很方便启动。当然,这样的操作并没有大幅度减小启动的时间。

3.3.   root用户自动登录

在每次设备启动或者复位的时候,都需要手动在启动结束后输入root以登录系统,而在无人值守的情况下,需要root用户能自动登录,并执行程序。在/etc/inittab中做如下修改即可实现root用户自动登录:

默认启动runlevel为5,即id: 5 :default

注释掉登录的那行代码,即#S:2345:respawn:/sbin/getty 115200 ttyS0

添加如下登录代码:S1:2345:respawn:/sbin/getty /usr/bin/autologin 115200 ttyS0。启动autologin程序需要自己完成,/usr/bin/是autologin所在位置,这个位置可以自己任意选取。

编写autologin.c程序如下:

#include

#include

int main ( )

{

execlp(“login”, “login”, “-f”, “root”, 0);

}

然后编译autologin.c,注意要使用交叉编译器。

$ /usr/local/arm-2007q1/bin/arm-none-linux-gnueabi-gcc –o autologin autologin

将编译好的autologin可执行文件复制到/usr/bin目录下。也可以放到其他目录下,相应的修改/etc/inittab即可。

至此,重新制作文件系统镜像后,烧写进nandflash,即可自动登录root用户。

3.4.   添加自己的启动项

因为rcS是每个系统都必须启动的项,因此在rcS中添加启动项是最直接的方法。(在我们的系统的中没有rc.local文件,网上有很多在rc.local中添加自启动的方法)

我需要自动加载无线网卡驱动、FPGA接口驱动以及开启DHCP服务。

首先,将无线网卡和FPGA的驱动以及DHCP的可执行文件以及配置文件拷贝进相应的文件夹(可执行放的文件夹可以自己设置,在写执行脚本的时候注意路径,配置文件需要按规则放)。在这里,我将无线网卡驱动rt3070sta.ko拷贝到/usr/src中,rt3070sta.ko驱动加载后需要读取的配置文件RT2870STA.dat放在/etc/Wireless/RT2870STA中。将FPGA的接口驱动fpgadev拷贝到/usr/src。在编译内核时,已经添加了dhcp服务,因此在/sbin和/usr/sbin中分别放有客户端uhdpc和服务端uhdpd,拷贝配置文件udhcpd.conf到/etc下,在/var/lib/misci下新建(touch命令)一个文件udhcpd.leases。修改所有文件的权限为755(chmod 755 xxx)。

其次,需要在/etc/init.d中添加执行的脚本文件,在此脚本文件中添加你要执行的代码。编写autoset_sta脚本如下:

#!/bin/sh

#Auto set wireless card and FPGA driver

/sbin/insmod /usr/src/rt3070sta.ko

/sbin/insmod /usr/src/fpgadev.ko\

/sbin/udhcpc

最后,修改文件权限并在rcS.d中添加指向init.d/autoset_sta的连接。

$ chmod 755 autoset_sta

$ cd ../rcS.d

$ ln –sf ../nit.d/autoset_sta S99autoset_sta

制作好文件系统后,烧写重启即可自动加载这些驱动以及服务。

3.5.   减小文件系统体积

原始文件系统28.2MB,在加上自己的文件后,达到了30MB。嵌入式下存储资源是宝贵的,为了减少所占资源,必须对文件系统进行瘦身。

进入/etc,删除不必要的启动脚本文件,比如X11的文件。

进入/lib,删除比需要的库文件。

进入/usr,删除games。

进入/usr/bin,删除没用的命令。

进入/usr/lib,删除没用的库文件。这里库文件相当多,达到16M之巨,而里边大多是我们不用的库,例如libaudiofile.so.0、libsoundgen.so.0、libmad*、libICE等,还有关于图像和界面的库等,这些都可以删掉。全部删除后,/usr/lib可以小到3M~6M。当然,这都得看具体应用,对与我来讲,我所用到的就是网络编程、多线程、无线网卡、SPI通信、串口通信等东西,所以能删除很多不必要的库。但是因为启动项删除的不够干净,在启动的过程当中,仍然会用到/usr/lib中的很多库,因此会出现很多错误,但并不影响我的操作。

进入/usr/share,删除没有用的doc以及applications。。。。。

基本裁剪已经差不多了,重新编译文件系统,输出的大小为16M左右。

(还需要好好把系统的整个启动已经程序的调用搞清楚一下,这还可以大大的裁剪)

4.       问题及解决方法

Q:在启动过程中出现at91sam user.warn kernel: Empty flash at 0x00f0fffc ends at 0x00f10000问题

A:在mkfs.jffs2的时候,加上-e 0x20000指定擦除块的大小。-e是指定擦除块的大小,我们使用的nandflash的块大小为128K字节,因此-e后的参数为(128*1024)10=(20000)16。

Q:启动的时候出现CLEANMARKER node found at 0x00f10000 has totlen 0xc != normal 0x0问题。

A:在mkfs.jffs2的时候,加上-n选项。-n, --no-cleanmarkers。指明不添加清楚标记(nand flash 有自己的校检块,存放相关的信息。)如果挂载后会出现类似:CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0 的警告,则加上-n 就会消失。

Q:解决jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x01649298: 0xa25e instead问题的方法

A:在mkfs.jffs2的时候加上-s 2048(页大小,由芯片决定)以及-l(小端模式)两个选项。-s是指明页的大小,我们使用的nandflash的页的大小为2048字节。-l指明为小端模式,一般嵌入式下均为小端模式。

说明:

1、  在文件系统制作的过程,均需要使用root用户权限;

2、  一般嵌入式下只有root用户登录,因此文件系统中的所有文件都需要具有root可执行权限,如果用其他用户登录,请保证文件系统中文件(特别是自己添加的文件)的相应可执行权限。

还不清楚的问题:

1、  启动过程还不明白

2、  如何更有效的减少启动时间?

http://blog.chinaunix.net/uid-23208702-id-353022.html

--------------------------------------------------------------------------------------------------------------------------------------------

jffs2文件系统制作

1)zlib的编译

tar xjvf zlib-1.2.3.tar.bz2

tony@Ubuntu:~/win/zlib-1.2.3$./configure

tony@Ubuntu:~/win/zlib-1.2.3$make

tony@Ubuntu:~/win/zlib-1.2.3$sudo make install

2)mtd工具的编译

tar xjvf mtd-snapshot-20050519.tar.bz2

tony@Ubuntu:~/win/mtd/util$make

tony@Ubuntu:~/win/mtd/util$sudo make install

执行完上面2部,我们的系统里就有了mkfs.jffs2这个工具了

3)jffs2文件系统镜像制作     (/opt/filesystem/目录下为已经制作好的文件系统,参看--》根文件系统制作)

tony@Ubuntu:/opt$sudo mkfs.jffs2 -r filesystem -o filesystem.jffs2

tony@Ubuntu:/opt$cp filesystem.jffs2 /tftpboot/

4)将jffs2文件系统烧写到nand

tftp 30008000 filesystem.jffs2

nand erase 500000 800000

nand write 30008000 400000 实际大小

setenv bootargs root=/dev/mtdblock2 init=/linuxrc rootfstype=jffs2 rw console=ttySAC0,115200

http://blog.csdn.net/ypist/article/details/7106019

从零开始制作jffs2文件系统的更多相关文章

  1. hi3531 SDK已编译文件系统制作jffs2文件系统镜像并解决问题 .

    一, 安装SDK 1.Hi3531 SDK包位置 在"Hi3531_V100R001***/01.software/board"目录下,您可以看到一个 Hi3531_SDK_Vx. ...

  2. hi3531 SDK已编译文件系统制作jffs2文件系统镜像并解决这个问题 .

    一, 安装SDK 1.Hi3531 SDK包位置 在"Hi3531_V100R001***/01.software/board"文件夹下,您能够看到一个 Hi3531_SDK_Vx ...

  3. Linux 4.10.8 根文件系统制作(二)---制作jiffs文件系统

    一.制作jiffs文件系统 制作jffs2 文件系统需要用到 mkfs.jffs2工具. 执行命令: mkfs.jffs2 -n -s 0x800 -e 0x20000  --pad=0x800000 ...

  4. jffs2文件系统制作

    内核:                linux-3.0 uboot:             2010.09 开发板:             fl2440 交叉编译器:         2011. ...

  5. JFFS2文件系统的移植

    Linux文件系统的移植-JFFS2 JFFS2是JFFS的后继者,由Red Hat重新改写而成.JFFS2的全名为JournallingFlash File System Version 2(闪存日 ...

  6. 1.移植3.4内核-分析内核启动过程,重新分区,烧写jffs2文件系统

    1.在上章-移植uboot里.我们来分析下uboot是如何进入到内核的 首先,uboot启动内核是通过bootcmd命令行实现的,在我们之前移植的bootcmd命令行如下所示: bootcmd=nan ...

  7. 详解-制作根文件系统,并使用yaffs,jffs,nfs挂载系统(2)

    1.安装mkyaffsimage, mkyaffs2image命令(用来制作yaffs文件系统) 第一个命令针对Flash小页512B,第二个针对Flash大页2KB首先下载压缩文件 yaffs_so ...

  8. zju(4)使用busybox制作根文件系统

    1.实验目的 1.学习和掌握busybox相关知识及应用: 2.学会使用交叉编译器定制一个busybox: 3.利用该busybox制作一个文件系统: 4.熟悉根文件系统组织结构: 5.定制.编译ra ...

  9. 使用Busybox-1.2.0制作根文件系统

    使用Busybox-1.2.0制作根文件系统 cross-3.3.2 make-3.8.1 STEP 1: 创建根文件系统目录,主要包括以下目录/bin,/etc,/dev,/mnt,/sbin,/u ...

随机推荐

  1. 用java读取properties文件--转

    今天为了通过java读取properties文件,google了很长时间,终于找到了.现在特记录之和大家一起分享.     下面直接贴出代码:java类 public class Mytest pub ...

  2. vs2012 aspx 没有设计视图了?

    vs2012的html设计视图没有了!重新安装一次都不行!现在已经通过简单办法来解决了 其实当你打开 HTML设计器 设置时, “启用 HTML设计器"  这里是打勾的!这时千万不要放弃.先 ...

  3. quartz简单实现

    quartz介绍 在我们的项目中,经常会遇到某个任务需要在特定的时间点执行,这个时间点可能是每天的某分某秒,可能是一周的指定某个星期某个时间等:quartz就是实现这样一个复杂任务调度逻辑的框架. 官 ...

  4. ASCII 对应表 CHR()

    chr(9) tab空格       chr(10) 换行      chr(13) 回车        chr(13)&chr(10) 回车换行       chr(32) 空格符      ...

  5. WEB 开发工具分享

    有好用的工具 : 云盘链接地址:

  6. ASP.NET 相关小知识

    后台修改前台html控件属性 添加 runat=server ,后台获取// 客户端隐藏 a.Attributes[ "style "] = "display:none ...

  7. 记录平时code点滴,这次是通过一张充满异样字符的表,对数据表中的每一列进行清理,比double quotation的issue难多了!

    需要提供对象: 一张需要被替换字符的表. 通过游标结合动态SQL对某一张特定表的所有列进行更新,主要是对其列值的异常字符处理. dbo.Characters_need_to_be_replaced c ...

  8. javascript - 清空一个 array

    我觉得javascript不容易, 许多人觉得js容易, 因为他们觉得很容易写出常用的需求, 但是当我们实际做项目的时候, 对于javascript的要求是很高的, 特别是在性能需求方面. 我写这句话 ...

  9. javascript创建对象(一)

    对象定义:无序属性的集合,属性包含基本值.对象.函数,相当于一组没有特定顺序的值.    创建自定义对象最简单的方式就是: var movie=new Object(); movie.name=&qu ...

  10. AbstractMethodError using UriBuilder on JAX-RS

    问题描述:Eclipse调试JAX-RS服务没问题,但是在发布服务端时候抛出异常 java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder. ...