嵌入式linux下jffs2文件系统的实现(包括内核相应的配置)

  这也是以前根据实际工作写的一点东西,先整理如下:

1、文件系统是一个操作系统中最重要的部分之一,它为操作系统提供了一种结构化存储和管理数据的方式。文件系统的主要功能是对数据的物理存储进行管理,并向用户提供对数据的访问接口。用户程序建立在文件系统上,通过文件系统访问数据,而不需要直接对物理存储设备进行操作。

    最初的操作系统一般都只支持单一的一种文件系统,并且文件系统和操作系统内核紧密关联在一起,而linux操作系统的文件系统结构是树状的,在根目录“/’下有许多子目录,每个目录都可以采用各自不同的文件系统类型。linux中的文件不仅指的是普通的文件和目录,而且将设备也当作一种特殊的文件,因此,每种不同的设备,从逻辑上都可以看成是一种不同的文件系统。

    在linux操作系统中,为了支持多种不同的文件系统,采用了虚拟文件系统(vfs,visual filesystem switch)技术,虚拟文件系统是对多种实际文件系统的共有功能的抽象,它屏蔽了各种不同文件系统在实现细节上的差异,为用户程序提供了统一的、抽象的、标准的接口对文件系统进行访问,如open(),read(),write()等。这样,用户程序就不需要关心所操作的具体文件是属于哪种文件系统,以及这种文件系统是如何设计与实现的,对所有文件的访问方式都是完全相同的。vfs与实际文件系统的关系如图1所示。

2 flash存储器

由于具有高可靠性、高存储密度、低价格、非易失、擦写方便等优点,flash存储器取代了传统的eprom 和eeprom,在嵌入式系统中得到了广泛的应用。flash存储器可以分为若干块,每块义由若干页组成,对flash的擦除操作以块为单位进行,而读和写操作以页为单位进行。flash存储器在进行写入操作之前必须先擦除目标块。根据所采用的制造技术不同,flash存储器主要分为nor flash和nand flash两种。

1)nor flash。

    nor flash通常容量较小,其主要特点是 片内执行(xip,execute in place),就是指程序代码可以直接在flash内运行,而不需要将代码读取到ram中再执行。nor flash具有ram接口,易于访问,它的缺点是擦除电路复杂,写速度和擦除速度都比较慢,最大擦写次数约10万次,典型的块大小是128kb。

2)nand flash。

    nand flash通常容量较大,具有很高的存储密度,从而降低了单位价格。nand flash的块尺寸较小,典型大小为8kb,擦除速度快,使用寿命也更长,最大擦写次数可以达到100万次,但是其访问接口是复杂的i/o口。并且坏块和位反转现象较多,对驱动程序的要求较高。由于nor flash和nand fiash各具特色,因此它们的用途也各不相同,nor flash一般用来存储体积较小的代码,而nand flash则用来存放大体积的数据。

3 flash文件系统

    在嵌入式系统中,也可以在flash上运行传统的文件系统,如ext2等,但是这类文件系统没有考虑flash存储器的物理特性和使用特点,例如:flash存储器中各个块的最大擦除次数是有限的,如果能够均匀地使用各个块,就能延长flash的整体寿命,这就需要磨损均衡的功能;为了提高flash存储器的利用率,还应该有对存储空间的碎片收集功能;在嵌入式系统中,要考虑出现系统意外掉电的情况,所以文件系统应该有掉电保护的功能,保证系统在出现意外掉电时也不会丢失数据。因此在flash存储设备上,采用专门针对flash存储器的要求而设计的jffs2(journaling flash file system version 2)文件系统更为合适。

3.1 日志文件系统

    jffs2是一种日志文件系统。在日志文件系统中,所有文件系统的内容变化,如写文件操作等,都被记录到一个日志中,每隔一段时间,文件系统会对文件的实际内容进行更新,然后删除这部分日志,重新开始记录。如果对文件内容的变更操作由于系统出现意外而中断,如系统掉电等,则系统重新启动时,会根据日志恢复中断以前的操作,这样系统的数据就更加安全,文件内容将不会因为系统出现意外而丢失。

3.2 mtd驱动程序

    jffs2 建立在mtd(memory technology devices)技术的基础上,mtd是专门为访问flash存储设备而设计的linux子系统,提供了对flash操作的一系列标准接口,能更好地支持对flash的擦除和读写操作。通过mtd技术,可以将硬件驱动设计和系统程序设计分开。为了使用jffs2文件系统,需要把mtd子系统编译到内核中,mtd子系统提供mtd_char和mtd_block这两个模块用于对flash的访问,mtd_char将flash表现为字符设备,与其关联的设备文件是/dev/mtd0等,mtd_block将flash表现为块设备,与其关联的设备文件是/dev/mtdblock0等;jffs2文件系统就建立在mtd_block模块的基础之上。

3.3 jffs2文件系统

jffs(journaling flash file system)是瑞典的axis communications公司专门针对嵌入式系统中的flash存储器的特性而设计的一种日志文件系统。redhat公司的david woodhouse在jffs的基础上进行了改进,从而发布了jffs2(journaling flash file system version 2)。和jffs相比,jffs2支持更多节点类型,提高了磨损均衡和碎片收集的能力,增加了对硬链接的支持。jffs2还增加了数据压缩功能,这更利于在容量较小的flash中使用。和传统的linux文件系统如ext2相比,jffs2处理擦除和读写操作的效率更高,并且具有完善的掉电保护功能,使存储的数据更加安全。在嵌入式系统中使用jffs2文件系统的缺点很少,只是当文件系统快要满时,jffs2会放慢运行速度,这是由于碎片收集的原因。

4、制作根文件系统映像

要制作根文件系统的映像,可以借助于busybox生成所需的大部分文件,然后自己再补充建立/dev,/proc,/etc等目录,在dev目录下建立设备文件,例如:

$mknod dev/console c 5 1

目录和文件建立完成后,使用mkfs.jffs2工具产生文件系统映像:

$ ./mkfs.jffs2 -r /mnt/loop –o jffs2.img –e 0x4000 --pad=0x800000 -n

其中-e 0x4000表示擦除块的大小为16kb;-r表示文件系统所在的目录;-o表示文件系统映像名。

4.1下载busybox 源代码

 

从 http://www.busybox.net/downloads/ 下 载 busybox , 这里用的是

busy busybox-1.13.3.tar.gz

4.2 根文件系统目录说明

 

嵌入式 Linux 中都需要构建根文件系统,

下面是根文件系统顶层目录。

目录    内容

bin     存放所有用户都可以使用的、基本的命令。

sbin    存放的是基本的系统命令,它们用于启动系统、修复系统等。

usr     里面存放的是共享、只读的程序和数据。

proc    这是个空目录,常作为proc 文件系统的挂载点。

dev     该目录存放设备文件和其它特殊文件。

etc     存放系统配置文件,包括启动文件。

lib     存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序。

boot    引导加载程序使用的静态文件

home   用户主目录,包括供服务账号锁使用的主目录,如FTP

mnt    用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。

opt     给主机额外安装软件所摆放的目录。

root    用户的主目录

tmp    存放临时文件,通常是空目录。

var     存放可变的数据。

 

4.3交叉编译Bosybox

 

使用Busybox 可以自动生成根文件系统所需的bin、sbin、usr 目录和linuxrc 文件。

 

4.3.1、解压busybox

tar –zxf busybox-1.13.3.tar.gz –C /opt/rm9200/

 

4.3.2、进入源码,修改Makefile 文件:

cd /opt/studyarm/busybox-1.13.3

修改:

CROSS_COMPILE ?=arm-linux- //第164 行

ARCH ?=arm //第189 行

 

4.3.3、配置busybox

到busybox文件目录下,输入 make menuconfig 进行配置

(1)Busybox Settings--->

General Configuration--->

[*] Show verbose applet usage messages

[*] Store applet usage messages in compressed form

[*] Support –install [-s] to install applet links at runtime

[*] Enable locale support(system needs locale for this to work)

[*] Support for –long-options

[*] Use the devpts filesystem for unix98 PTYs

[*] Support writing pidfiles

[*] Runtime SUID/SGID configuration via /etc/busybox.config

[*] Suppress warning message if /etc/busybox.conf is not readable

Build Options--->

[*] Build BusyBox as a static binary(no shared libs)

[*] Build with Large File Support(for accessing files>2GB)

Installation Options->

[ ]Don’t use /usr

Applets links (as soft-links) --->

(./_install) BusyBox installation prefix

Busybox Library Tuning --->

(6)Minimum password legth

(2)MD5:Trade Bytes for Speed

[*]Fsater /proc scanning code(+100bytes)

[*]Command line editing

(1024)Maximum length of input

[*] vi-style line editing commands

(15) History size

[*] History saving

[*] Tab completion

[*]Username completion  //文件系统JFFS2识别PS1这个环境变量的参数

[*]Fancy shell prompts   //文件系统JFFS2识别PS1这个环境变量的参数

(4) Copy buffer size ,in kilobytes

[*]Use ioctl names rather than hex values in error messages

[*]Support infiniband HW

(2)Linux Module Utilities--->

(/lib/modules)Default directory containing modules

(modules.dep)Default name of modules.dep

[*] insmod

[*] rmmod

[*] lsmod

[*] modprobe

-----options common to multiple modutils

[ ] support version 2.2/2.4 Linux kernels

[*]Support tainted module checking with new kernels

[*]Support for module .aliases file

[*] support for modules.symbols file

 

(3)busybox 中配置对dev 下设备类型的支持

 

mdev 是busybox 自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox 为基础构建嵌入式linux 的根文件系统时,使用它是最优的选择。

下面的选项将增加对mdev 的支持。

Linux System Utilities --->

[*]Support /etc/mdev.conf

[*]Support command execution at device addition/removal

 

4.3.4、编译busybox

编译busybox 到指定目录:

cd /opt/rm9200/busybox-1.13.3

make CONFIG_PREFIX=/opt/rm9200/rootfs install

在rootfs 目录下会生成目录bin、sbin、usr 和文件linuxrc 的内容。

 

4.4 建立etc 目录下的配置文件

1、etc/mdev.conf 文件,内容为空。

2、拷贝主机etc 目录下的passwd、group、shadow 文件到rootfs/etc 目录下。

3、etc/sysconfig 目录下新建文件HOSTNAME,内容为”H3-Studio”。

4、etc/inittab 文件:

#etc/inittab

::sysinit:/etc/init.d/rcS

s3c2410_serial0::askfirst:-/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a –r

5、etc/init.d/rcS 文件:

#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

runlevel=S

prevlevel=N

umask 022

export PATH runlevel prevlevel

echo "----------munt all----------------"

mount -a

echo /sbin/mdev>/proc/sys/kernel/hotplug

mdev -s

echo "***********************************************"

echo "****************Studying ARM*********************"

echo "Kernel version:linux-2.6.29.1"

echo "Student:Huang huahai"

echo "Date:2009.10.1"

echo "***********************************************"

/bin/hostname -F /etc/sysconfig/HOSTNAME

(或者直接 /bin/hostname H3-Studio )

使用以下命令改变 rcS 的执行权限:

Chmod +x rcS

6、etc/fstab 文件:

#device mount-point type option dump fsck order

proc /proc proc defaults 0 0

none /tmp ramfs defaults 0 0

sysfs /sys sysfs defaults 0 0

mdev /dev ramfs defaults 0 0

7、 etc/profile 文件:

#Ash profile

#vim:syntax=sh

#No core file by defaults

#ulimit -S -c 0>/dev/null 2>&1

USER="id -un"

LOGNAME=$USER

PS1='[\u@\h=W]#'

PATH=$PATH

HOSTNAME='/bin/hostname'

export USER LOGNAME PS1 PATH

 

4.5制作根文件系统映像文件

 

以上除busybox系统生成的bin、sbin、usr三个目录外,其他的配置文件可直接使用之前系统使用的Cramfs文件系统中的相应文件也可。

 

4.5.1为使系统终端中实现命令提示符像主机一样显示用户名、主机名、当前目录,还需做以下修改:

 

1、创建/etc/hostname 文件,添加主机名

  qytx

2、修改/etc/init.d/rcS 添加(导入主机名配置文件)

/bin/hostname –F /etc/hostname

 

3、修改根文件系统中的/etc/profile文件,添加

HOSTNAME=/bin/hostname

PS1=’[\u@\h \W]\#’

Export PS1 HOSTNAME

 

在文件底行:

hostname qytx

 

4、创建/etc/passwd文件 添加

Root:x:0:0:root:/root:/bin/sh

 

4.5.2制作JFFS2镜像

 

将下载的mkfs.jffs2工具放到主机/bin下,使之生效

 

mkfs.jffs2 –r /mnt/jffs2/loop –o jffs2.img –e 0x4000 --pad=0x800000 -n

猜你喜欢

转载自blog.csdn.net/zhanweizhao_111/article/details/7167553
今日推荐