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. linux ptrace II

    第一篇 linux ptrace I 在之前的文章中我们用ptrace函数实现了查看系统调用参数的功能.在这篇文章中,我们会用ptrace函数实现设置断点,跟代码注入功能. 参考资料 Playing ...

  2. display_errors & error_reporting(php调试安全)

    这两个选项对应的值即都可以在php.ini文件中设置,也都可以在php代码中使用相应的函数来设置. 在php.ini文件中的设置如下:

  3. popupWindow使用详解

    popupWindow说起来简单,但是使用略麻烦,今天带大家来看看怎么使用,先来看看效果图: 先来看看布局文件吧: <RelativeLayout xmlns:android="htt ...

  4. WPF加载Winform窗体时 报错:子控件不能为顶级窗体

    一.wpf项目中引用WindowsFormsIntegration和System.Windows.Forms 二.Form1.Designer.cs 的 partial class Form1 设置为 ...

  5. 20个命令行工具监控 Linux 系统性能(转载)

    1. top — Linux 系统进程监控 top 命令是性能监控程序,它可以在很多 Linux/Unix 版本下使用,并且它也是 Linux 系统管理员经常使用的监控系统性能的工具.Top 命令可以 ...

  6. svn项目冲突时显示无法加载项目的解决方法

    1.无法加载的项目会显示成灰色.这是右键点击编辑  打开后去掉乱字符. 2.完成后会有红色的叹号 这是右键 找到解决冲突即可 然后提交

  7. VM的Linux CentOS系统的VMTools的手动安装

    VM的Linux CentOS系统的VMTools的手动安装 一是没时间安装,另外是一直用的是VM的绿色版,里面没有Linux.iso 文件 今天晚上安装上了 linux 的vmtools ,再也不用 ...

  8. java 函数形参传值和传引用的区别

    java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. public class TestFun { public static v ...

  9. Library中的title与Name

    在Library中新增Title字段,其中文件夹的title字段与Name相同,并且默认生成:但是文件的Title字段为空.

  10. C#和SQL操作Xml

    #region DataTableToXml        public static string DataTableToXml(System.Data.DataTable Dt)        { ...