嵌入式Linux 的Cramfs 根文件系统配置成可读可写

时间:2022-01-08 16:30:10

嵌入式Linux 的Cramfs 根文件系统配置成可读可写 


 1、概述

       从软件角度上看,构建基于ARM技术的linux系统要涉及到引导加载程序、Linux内核、文件系统、用户应用程序几部分的设计。文件系统是操作系统中用来管理用户文件的内核软件层。文件可能存在于磁盘、网络或者是一些虚拟的文件。文件系统包括根文件系统和建立于内存设备之上文件系统。根文件系统是linux系统的核心部分,包含系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件,并作为存储数据读写结果的区域。由于嵌入式设备中Flash资源很紧张,如何有效地使用有限的存储空间是嵌入式开发者必须考虑的,合适的文件系统格式是解决这一问题的关键所在。本文讨论了只读型压缩Cramfs根文件系统的特点,并详细的说明了NANDFLASH上建立一个可读可写型嵌入式Linux的Cramfs根文件系统的新方法。         根文件系统不同于普通文件系统,它是在内核启动时挂载(mount)的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后把一些基本的初始化脚本和服务程序等加载到内存中。Linux根文件系统是树型结构组织[1,3],它包含了内核和系统管理所需要的各种文档和程序等。一般来说,根目录“/”下顶层目录都有一些比较固定命名和用途,下面列出一个Linux根文件系统中的比较常见的目录结构。/bin:存放二进制可执行命令的目录。/dev:存放设备文件和目录。/etc:存放系统管理和配置文件和目录。/home:用户主目录,比如用户user的主目录就是/home/user,可以用~user来表示。/lib:存放动态链接共享库的目录。/sbin:存放系统管理员使用的管理程序的目录。/tmp:公用的临时文件存储点。/root:系统管理员的主目录。/mnt:用以临时挂载其他的文件系统。/proc:虚拟文件系统,可直接访问这个目录来获取系统信息。/var:某些大文件溢出区。/usr:存放应用程序和文件。

2、Cramfs根文件系统及其在实际应用中存在的问题

Cramfs是Linux的创始人LinusTorvalds参与开发的一种只读的压缩文件系统,它基于MTD(MemoryTechnologyDevice,存储技术设备)驱动程序。在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的FLASH存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。

Cramfs并不需要一次性地将文件系统中的所有内容都解压到内存中,而只是在系统需要访问某个位置的数据时,立即计算出该数据在Cramfs中的位置,将其实时地解压缩到内存中,然后通过对内存的访问来获取文件系统中需要读取的数据。Cramfs中的解压缩以及解压缩之后内存中的数据存放位置都是由Cramfs文件系统本身进行维护的,用户并不需要了解具体实现过程,因此这种方式增强了透明度,对开发人员来说,既方便又节省了存储空间。

由于Cramfs是只读型文件系统,而大多嵌入式应用程序需要在临时目录/tmp进行创建临时文件等写操作,如不对Cramfs进行配置,则应用程序将不能正常运行,导致系统崩溃。目前,解决些问题的方法是复合文件系统法,即使用YAFFS/YAFFS2等可写型文件系统与Cramfs复合而成的文件系统作为嵌入式系统的根文件系统,使Cramfs根文件系统启动时挂载YAFFS/YAFFS2文件系统,同时将应用程序存放在YAFFS/YAFFS2文件系统中。这种方法解决了应用程序对根文件系统的写操作问题,但由于在通常的根文件系统之外还增加了一个额外的可写型文件系统,必然会增大整个根文件系统所占的存储空间,造成嵌入式系统存储资源紧张。本文在实践的基础上,通过对LinuxCramfs根文件系统的研究,发现了一种通过修改根文件系统启动脚本和配置文件来实现根文件系统的可读、可写性的新方法,它不需要新增额外的文件系统来支持应用程序的读、写要求,而是利用根文件系统本身的特性来构造一个局部可写的根文件系统。

3嵌入式Linux根文件系统的配置

3.1Cramfs根文件系统配置文件的分析

Cramfs根文件系统中的配置文件存放在/etc目录下,有22个文件及文件夹,可分为以下几类:

引导和登录/注销类,包括/etc/issue/etc/issue.net/etc/rc.d/rc/etc/rc.d/rc.local/etc/rc.d/rc.sysinit
/etc/rc.d/rc/rcX.d
等文件,它们主要记录系统的启动信息及运行级别等。

文件系统类,包括/etc/mtab/etc/fstab/etc/mtools.conf文件等,它们记录着系统文件系统的安装、卸载信息,系统启动时可以被安装的文件系统以及在这些文件系统上所定义的操作。

系统管理类,包括/etc/group/etc/nologin/etc/passwd/etc/rpmrc/etc/securetty/etc/usertty/etc/shadow/etc/shells/etc/motd等文件,它们记录着系统用户和用户组的登录信息、加密后的用户帐号密码信息、用户组的权限信息等。

网络类,包括/etc/gated.conf/etc/networks/etc/protocols/etc/gateway/etc/services/etc/inetd.conf/etc/sysconfig/netword/etc/recolv.conf/etc/rpc/etc/exports等文件,它们记录着系统对网络接口的配置信息、网络服务程序、网络协议、网络文件系统配置等信息。

系统命令类,包括/etc/lilo.conf/etc/logrotate.conf/et/identd.conf/etc/ld.so.conf/etc/inittab/etc/termcp等文件,这些文件记录着要独占地控制系统的系统命令及动态链接程序配置等信息等。

系统初始化脚本类,包括/etc/init.d/etc/rc/init.d等文件,它们包含一些系统服务类程序及系统启动脚本。

根文件系统对挂载文件系统的配置主要由两个文件决定,即fstabinit.d/rcS[3]fstab描述了当前系统中已被定义好的可以被系统挂载的文件系统init.d/rcS文件描述了系统启动时将启动的命令、服务程序及将要挂载的的文件系统

由此可见,要使Cramfs根文件系统能满足应用程序的读写要求,必须在系统启动时为应用程序挂载一个可写型的文件系统,即配置/etc/fstab/etc/init.d/rcS文件来挂载可写型的文件系统。

3.2Crmafs文件系统添加应用程序

要发布应用程序到嵌入式系统中,须将应用程序及应用程序所需要的共享库文件一起添加到根文件系统中。根文件系统可以根据需要定制,但这样需要花费大量时间且工作量大;也可以修改已有的根文件系统,这样可以节省大量的时间和精力,且不易出错[4]

以下是以蓝海微芯LJD-2410DVK-I嵌入式开发板所提供的root.cramfs根文件系统为基础进行修改和配置的,root.cramfs是只读型的文件系统,为了能向里边加入用户应用程序,需要将其重新挂载、压缩及解压缩成新的目录,步骤如下:

root.cramfs的相同目录下新建立一个目录,如myroot在终端中执行命令:

$mount  -o  loop  root.cramfs  myroot

$tar  –cvf myroot.tar   myroot

这两条命令的功能分别是将已有的root.cramfs以块设备的方式挂载到myroot并将myroot压缩为myroot.tar

不出现目录重名,将myroot.tar拷贝到另一目录进行解压

$tar–xvf myroot.tar

解压出来的文件夹myroot即是即将作为根文件系统的目录,它是可读可写的。

将已经交叉编译并调试过的用户目标程序拷贝到myroot目录下的/usr/bin目录下,此目录为根文件系统中为用户程序准备的目录同时将用户程序所需要用到的关联库文件拷贝到myroot目录下的/usr/lib目录下,用户程序的关联库文件可通过ldd命令查看,ldd命令格式如下:

ldd  [选项]  文件

选项有-v:打印ldd的版本号;-d:执行符号重部署,并报告缺少的目标对象(只对ELF格式适用);-r:对目标对象和函数执行重新部署,并报告缺少的目标对象和函数(只对ELF格式适用);-h:帮助信息。

执行如下命令来查看应用程序所关联的库:

Ldd –v 程序名

将交叉编译工具目录下的/3.4.1/arm-linux/lib下的libgcc-s.so.*,libstdc++.so.6复制到myroot目录下的/root/lib目录下。

3.3配置Cramfs根文件系统

为使Cramfs能支持应用程序的写操作,需要修改文件系统的配置文件,/etc目录下的文件。

(1)修改/etc/init.d/rcS文件

/etc/init.d/rcSLinux的系统初始化脚本,修改步骤如下:

vi或其它文本工具打开myroot目录下的/etc/init.d/rcS文件;

在文件中增加:

/bin/mount  –n  –t  ramfs  ramfs  /mnt/yaffs  (yaffs是文件系统的一个目录)

/bin/mkdir/mnt/yaffs/Qtopia

/bin/mkdir/mnt/yaffs/Qtopia/tmp

保存并退出vi或文本工具。

根文件系统的配置如图
嵌入式Linux 的Cramfs 根文件系统配置成可读可写

1根文件系统的配置

当系统启动并执行到系统初始化脚本/etc/init.d/rcS时,mount命令将/mnt/yaffs目录挂载为ramfs类型的随机存储文件系统,并在此文件系统上建立QtopiaQtopia/tmp目录[5]/Qtopia/tmp目录即为应用程序可能对文件系统进行写操作的临时文件目录,故应用程序便可对/mnt/yaffs目录进行读写操作,保障有读写操作要求的应用程序的正常执行。

(2)修改/etc/profile文件

vi或其它文本工具打开myroot目录下的/etc/profile文件;

PATH改为:PATH=/bin:/sbin:/usr/sbin:/用户程序目录名

在文件中新增以下语句:

LD_LIBRARY_PATH=/lib:/usr/lib:/用户库目录名

exportPATHLD_LIBRARY_PATH

保存并退出vi或文本工具。

其中,修改环境变量PATH的目的是使系统命令/程序目录扩展到用户程序目录,这样,当执行用户应用程序时,系统才能找到相应的共享文件等;修改LD_LIBRARY_PATH的目的是将系统的共享库路径扩展为包含系统程序和用户程序库文件路径的库文件路径,以便在运行用户程序时能使系统找到应用程序所使用的库文件。

4制做Cramfs根文件系统

制做Cramfs根文件系统,即是把上述配置好的myroot目录文件夹压缩成为能够让Linux内核支持的Cramfs格式的映像文件[6]

制做Cramfs根文件系统需要用到mkcramfs工具,mkcramfs工具用来创建Cramfs文件系统,它能把配置好的根文件系统压缩成Cramfs格式的根文件系统,压缩比可达到2

1,下面是mkcramfs命令的格式:

mkcramfs [-h][-eedition][-ifile][-nname]  dirname  outfile

其中参数含义分别是-h:显示帮助信息;-eedition:设置生成的文件系统中的版本号;-ifile:将一个文件映象插入到文件系统中(只能在Linux2.4.0以后的内核版本中使用);-nname:设定Cramfs文件系统的名称;dirname:指明需要被压缩的整个目录树;outfile:最终输出的文件。

mkcramfs工具拷贝到myroot相同目录下,在终端中执行:

mkcramfs  myroot  myroot.cramfs

此命令所生成的myroot.cramfs即为可下载到开发板上的根文件系统。

5结束语

通过对嵌入式Linux根文件系统结构特点的分析,提出了基于Cramfs根文件系统配置的新方法,使嵌入式根文件系统具有了可读、可写的功能,同时也减小了根文件系统所占的存储空间。

转载:http://www.icbuy.com/info/news_show/info_id/80804.html