嵌入式Linux文件体系的构建
发布日期:2011-04-12
嵌入式产品已经渗入渗出排泄到人们生存的方方面面,分外是在数字信息技能和网络技能高速生长的即日,手持信息产品正拓展着一片越来越大的市场,PDA、手机、掌上谋略机、信息家电等百般手持产品已拥有了巨大的用户群。手持信息产品所运用的最关键的内核技能便是嵌入式利用体系。人们对嵌入式产品的需求也不再仅仅是结果单一的电子词典类产品,嵌入式利用体系垂垂成为嵌入式产品的内核。而此中,Linux以其开源的内核和免费的应用步调、可以大概自由地移植和开辟的上风,更迎合嵌入式市场。嵌入式Linux的开辟大抵可分为三个层次:引导装载内核、布局文件体系和图形用户界面。作为利用体系告急构成部分的文件体系,决定了利用体系本身的信息和用户的数据在存储配置上的布局情势。对嵌入式文件体系的研究、筹划和开辟也垂垂成为嵌入式系 统研究范畴的一个方向。
嵌入式Linux 文件体系
文件体系是指在一个物理配置上的恣意文件布局和目次,它构成了Linux体系上全部数据的底子,Linux步调、库、体系文件和用户 文件都驻留此中,因此,它是体系中巨大巨大且又是最为底子和告急的资源。值得提出的是,Linux体系中的文件不但包括平常的 文件和目次,每个和配置干系的实际实体也都被映射为一个文件,比喻磁盘、打印机、终端等等。如许的配置文件又称为分外文件 。以是,Linux下的文件是利用体系办事和配置的大抵而又同一的接口,从某种意义上可以说,Linux里的齐备事物都是文件。
在Linux中,文件体系的布局是基于树状的,根在顶部,各个目次和文件从树根向下分支。目次树的最顶端被称为根目次(/)。在反面先容的所布局文件体系布局图(图1)即表现了树状的文件体系。Linux利用体系由一些目次和很多文件构成,比喻,图中的/bi n目次包括二进制文件的可实行步调,/sbin目任命于存储办理体系的二进制文件,/etc目次包括绝大部分的Linux体系配置文件 ,/lib目次存储步调运行时利用的共享库,/dev目次包括称为配置文件的分外文件,/proc目次实际上是一个假造文件体系,/tmp目任命于存储步调运行时天生的临时文件,/home目次是用户肇始目次的底子目次,/var目次生存要随时变革大小的文件,/usr目次及其子目次对Linux体系的利用非常告急,它生存着体系上的一些最告急的步调以及包括你摆设的大型软件包。
由于Linux是一个多任务、多用户的利用体系,因此它内里的文件还都被付与了肯定的权限,权限决定谁能读、写或实行一个文件,以及这个文件的典范和怎样实行。比喻下面的文件列表:
-rw-r-r-- 1 root root 1756 Sep 9 2005 inittab
其表现:这个名为inittab的文件是平常文件,全部者有读写的权限,地点组和其他人都只有读的权限,它的连接数为1,全部者及 文件所属的组都是root,文件中字节数为1756,文件创建日期是2005年9月9日。我们可以通过对文件属性的设置,来餍足文件在差别用户组、差别用户利用下的差别状态。
由于嵌入式配置的一些分外性,使得嵌入式文件体系除了餍足一样通常文件体系的底子恳求外,另有一些自身的特性:
- 文件体系面对的存储介质分外;
- 文件体系有快速光复的分外恳求;
- 物理文件体系的多样性和动态可装置性;
- 须要文件体系具有跨利用平台的沉寂性;
- 文件体系要能餍足整个别系的及时性恳求。
嵌入式文件体系有沉寂性和均衡负载如许的恳求,而日记型文件体系可以很好地办理沉寂性的标题。颠末几年来的生长。日记型的嵌入式文件体系已成为嵌入式文件体系的主流。1999年。Axis
Communications AB颁发了JFFS(JournalingFlash File System)的 第一个版本。这是一个专门为嵌入式体系的Flash配置而筹划的文件体系,同时它也是一个日记型的文件体系。JFFS2是JFFS的第二 个版本,于2001年颁发,并得到了Red Hat的支持,成为Red Hat嵌入式利用体系eCos的文件体系。Flash存储容量的有限性决定了J FFS是一个小尺寸的文件体系。因而在文件体系的内部筹划上采取了很多简化处理惩罚处罚。同时,它们连合了Flash配置的读写特性和嵌入式文件体系的防断电特性,使得JFFS成为得当于嵌入式体系上针对Flash配置的文件体系的抱负选择。
嵌入式Linux 文件体系的筹划
● 实行主机和目标平台的连接
实行主机和目标平台的连接有两种要领。一种因此太网连接,这种连接要领可以举行内核文件、根文件体系映像文件的下载。另一 种是串口连接,如许的连接要领可以供调试之用。敷衍以太网连接,作者利用一根平常网线,将实行主机和目标平台都连接在Hub 上。如许做既大抵,也没干系碍实行主机与外部网络的通讯。敷衍串口连接,用一根串口线连接目标平台的Ful Function UART(FFUA RT)串口和实行主机的串口。紧张是在调试阶段利用这种连接要领,在目标平台的标准输入还未被驱动的环境下。用实行主机的标准输入控制目标平台,向目标平台发控制下令。
● 构建文件体系
起首创建一个文件体系的变乱空间。创建目次/bome/work,我们所布局的文件体系就在work这个目次中。创建底子目次,如:bin,dev,etc,lib,mnt,proc,sbin,tmp,usr,vat,tools细致布局图见图1(图中所表现的文件都是目次文件)。此中,tools是便于开辟而创建的目次。由于整个别系恳求只管即便小,以是应只包括一些必须的二进制步调。而开辟进程中须要用到的下令就放在 tools中,将PATH 包括tools即可。/etc目次下只包括了一些启动进程的配置文件,/lib目次下的modules于目次包括了可动态加载到内核的种种模块。别的,目次var下还应创建两个子目次log和run,认真记录体系的日记和运行状态。整个文件体系中除了tmp 和var目次放在SDRAM内以外,其他全部目次都放在Flash中,由于trap和var中的内容须要通常写入,以是放在可读写的RAM里。
插图1: 构建文件体系的树状布局
当在目标平台实现了一个嵌入式Linux之后,为了很好地办理利用体系和用户的数据文件,引入了文件体系。物理文件体系是JFFS2 ,思量到扩充物理文件体系的恳求,生存了Linux的VFS层次。思量到存储配置扩充的恳求,在Linux内核中参加了对MTD配置的支持。根据上面的叙述,可给出整个文件体系的体系布局图,见图2所示。
插图2: 文件体系体系布局
构建文件体系最底子的恳求便是体系可以大概在此底子上启动运行起来,以是,/sbin下的init步调必不可少。init步调是引导进程完成后内核运行的第一个步调,它能启动全部其他步调。只要init完成运行全部须要的步调,体系就开头创建并开始运行。当步调开始启动时,init读取一个配置文件inittab,这个文件位于/etc下,它确定了init在启动和关机时的变乱特性。在我们开辟的这个嵌入式体系中,全部的文件内容只需生存与开辟恳求有关的必须部分。
这个别系运行单用户模式启动:启动后立即运行rc.sysinit脚本,举行体系初始化办法。rc.sysinit脚本也举行了精简,只生存了以读写的要领重新加载(mount)根文件体系的利用(内核启动时只以只读的要领加载了根文件体系),细致rc.sysinit脚本中的内容 如下:
# Remount the root filesystem read-write
# mount -n -o remount.rw / mount -o remount.rw -n/dev/mtdblock2/mount -a
为了开辟进程用户与体系能举行交互,启动了/bin/bash这个下令表明器。用户在键盘上输入某些下令,bash将读取输入加以阐发然后实行该步调。/tools中的telnetd和/sbin中的pppd分别是长途登岸和串口通讯的背景步调,参加它们也是为了方便开辟。
别的,为了只管即便精简内核,步调都以动态链接库文件的要领编译,即当步调运行到所需库文件时才动态加载。以是包管库文件的完备性就显得相称告急。为确保运行种种步调都能在/lib目次中找到切合的库文件,就干脆对/lib中的库文件不作恣意删减,而完备的/lib目次(含子目次及全部库文件)也不过2MB 大小。
● 配置文件体系用户
这一步调的实现,表现了该嵌入式利用体系的一大特色---沉寂性。为了保卫体系中的文件被误改或被恶意粉碎,我们设置组和用户,让只有从属于特定组的特定用户才华对特定的步调举行合法利用。/etc目次中没有参加办理组的group文件和办理用户的pass wd文件,以是在设置文件或目次的全部权时,全部用id号来代替组名和用户名。用chown下令来变革文件的全部权,如chown 0.0 i nittab(前一个“0”代表属组,后一个“0”代表用户),修改后的inittab文件的过细信息为:-rw-r-r-- 1 0 0 237 Jul 26 l0:30 inittab
将体系中全部的文件和目次根据其细致典范和恳求,为其设置特定的组和用户对它的全部权。比喻,/etc中的module.conf配置文件的全部权是module组和module用户。那么只有组和用户同为module的步调(比如/lib/modules/中的步调)才有权查察module.c onf文件,其他非root用户的步调都打不开这个文件。如许,除了root用户,其他不具有利用权限的用户就不大概对那些分外文件, 如有关网络、沉寂等告急信息举行实行和修改。而拥有root用户权限的文件只有init和bash两个。init用于完成体系的初始化进程,并不涉及对其他文件和步调的利用;bash是开辟进程中用户与体系交互的须要,便于对文件体系举行修改,开辟完成后的实际体系并不须要bash,可删除。如许,各个文件和步调均在本身所属的组和用户中运行,不会相互滋扰。使得整个别系井井有条,不会孕育产生步调越权误利用的征象。包管了利用体系本身的沉寂性,也让试图偷取或粉碎数据的打击者无机可乘。
根据须要,在底子文件体系上添加应用步调底子文件体系完成后,再根据开辟的实际恳求,在上面再修筑一些应用和办事。比喻,敷衍所需求的网络结果,我们在/bin 中参加netstat、ping,在/sbin中参加ifconfig、route、xinetd等网络步调:为了将一些办事以模块的要领加载,以缓解内核的包袱 ,我们在/sbin中参加了insmod、lsmod、modprobe、depmod、rmmod等有关利用模块的下令。另有,为了搭建开辟进程的交错编译的环境,须要用到串口通讯,以是在/sbin中参加pppd的下令,在/etc中参加PPP目次及其配置文件等等。
到此,一个餍足体系需求的嵌入式Linux文件体系就底子布局完成。为了体系能在特定的嵌入式硬件配置上运行,体系中全部的二进制文件都必须是颠末特定的嵌入式开辟编译东西编译,将编译好的文件体系烧至嵌入式体系的开辟板中,调通串口,就可以举行调试和进一步的开辟了。
嵌入式Linux 文件体系的进一步开辟
根据上一部份给出的文件体系体系布局,文件体系的实现紧张在VFS层、物理文件体系层和MTD层。在Linux 2.4以后的版本中,JFFS2已经作为一种标准的文件体系被支持,以是使得Linux的VFS支持JFFS2并不是一件难事,在源代码中也不消做修改。下面给出在MTD层,Linux的源代码做的一些修改。别的,叙述JFFS2物理文件体系映像文件的天生。
支持MTD配置
对MTD配置的支持要颠末配置内核、编写配置驱动步调和创建MTD配置这几个步调。
第一步,配置内核参数,选中Memory Technology Devices(MTD)support,下面的子项中至少要选择MTD partitioning support、Direct char device access to MTD devices和Caching block device access to MTD devices这三项。其他的有关NFTL,CFI的支持根据须要选取。
第二步,编写针对目标平台Flash配置的MTD驱动步调,紧张实现创建MTD分区和删除MTD分区的函数。创建分区的流程见图3所示。删除分区的函数比较大抵,要是存在MTD分区,就调用del_mtd_partitions(struct mtd info*)删除分区,并且删除为MTD配置创建的映射表。
插图3: 创建MTD分区
第三步,将修自新的MTD驱动文件作为内核文件的补丁,并给内核文件打上这个补丁,着末,编译天生内核文件。
第四步,利用mknod下令创建MTD配置。
JFFS2映象文件的天生
起首,须要内核支持JFFS2,因此在配置内核参数时,选中File Systems下的Journaling Flash File System v2(JFFS2)support。假设从一个RAMDISK的文件体系中得到创建根文件体系所需的全部文件和体系全部的配置等信息。制作步调如下:
第一步,在开辟主机大将这个Ramdisk以loop的要领挂接到某个临时目次下。在这个目次下就出现了一些文件体系的底子文件和信息,可以做增删以到达定制的目标。
第二步,修改/etc/rc.d/rc.sysinit文件,使得文件体系在remount时不会出现只读的环境。细致修改如下:
Mount -n -o remount.rw//参加这一行
Mount -n -t proc/proc rw//在这一行中参加-n
第三步,利用mkfs.jffs2天生JFFFS2的映像文件。细致的下令格局如下:
Mkfs.jffs2 -d<文件体系地点目次>-o<映像文件名>
这时,就得到了一个JFFS2的映像文件,将它下载到目标平台。着末便是怎样挂载它,使它成为一个根文件体系了。在调试阶段和终极体系成型之后,挂载的要领有所差别,而细致的挂载要领在前面已叙述,这里不再重复阐发。
结语
我们布局了一个嵌入式版本的Linux文件体系,它使得内核在体系只管即便精简的环境下可以大概运行起来,并餍足产品和体系各方面的恳求。此中,为文件体系配置用户和属组以到达肯定的沉寂性更是体系的一大特色。别的,在这个嵌入式文件体系中,引入了VFS的支持,固然断送了一些空间,但是大大方便了以后种种物理文件体系的动态加载。Linux的文件体系原形上非常的巨大,布局一个嵌入式的Linux文件体系是一个很巨大的进程。怎样让文件体系在包管沉寂的条件下精简得更紧凑、运行得更有屈从,是须要深入探索的一个课题。