嵌入式linux根文件系统的建立.docx
- 文档编号:30696673
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:43
- 大小:312.65KB
嵌入式linux根文件系统的建立.docx
《嵌入式linux根文件系统的建立.docx》由会员分享,可在线阅读,更多相关《嵌入式linux根文件系统的建立.docx(43页珍藏版)》请在冰豆网上搜索。
嵌入式linux根文件系统的建立
嵌入式linux根文件系统的建立
8.1文件系统简介
Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(VirtualFileSystem,为各类文件系统提供一个统一的操作界面和应用编程接口。
Linux下的文件系统结构如下:
Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。
之后可以自动或手动挂载其他的文件系统。
因此,一个系统中可以同时存在不同的文件系统。
不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。
在嵌入式Linux应用中,主要的存储设备为RAM(DRAM,SDRAM和ROM(常采用FLASH存储器,常用的基于存储设备的文件系统类型包括:
jffs2,yaffs,cramfs,romfs,ramdisk,ramfs/tmpfs等。
8.2嵌入式Linux根文件系统
8.2.1根文件系统简介简单的来说,根文件系统就是一种目录结构,那么根文件系统和普通的文件系统有什么区呢?
其实根文件系统就是要包括Linux启动时所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux系统启动所必须的文件都可以成为根文件系统。
8.2.2基本根文件系统目录构成解析
下面列出了linux根文件系统下一些主要目录的功用。
/bin二进制可执行命令
/dev设备特殊文件
/etc系统管理和配置文件
/etc/rc.d启动的配置文件和脚本
/home用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示
/lib标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件
/sbin系统管理命令,这里存放的是系统管理员使用的管理程序/tmp公用的临时文件存储点
/root系统管理员的主目录(呵呵,特权阶级)
/mnt系统提供这个目录是让用户临时挂载其他的文件系统。
/lost+found这个目录平时是空的,系统非正常关机而留下“无家可归”的
文件(windows下叫什么.chk)就在这里
/proc虚拟的目录,是系统内存的映射。
可直接访问这个目录来获取系统信息。
/var某些大文件的溢出区,比方说各种服务的日志文件
/usr最庞大的目录,要用到的应用程序和文件几乎都在这个目录。
其中主要包含:
/usr/bin众多的应用程序
/usr/sbin超级用户的一些管理程序
8.3根文件系统的引导过程
一般的系统先启动的是/sbin/init,而如同原始的主流init,BusyBox也可以处理系统的启动工作。
BusyBox的init尤其适合在嵌入式系统中使用,因为它可以为嵌入式系统提供所需要的大部分init功能,却不会让嵌入式系统被SystemVinit的额外特性拖累。
因为/sbin/init是/bin/busybox的符号链接,所以BusyBox是目标板系统上执行的第一应用程序。
当BusyBox知道调用它的目的是要执行init,它会立即跳转到init进程。
BusyBox的init进程会依次进行以下工作:
1、为init设置信号处理进程。
2、初始化控制台。
3、剖析inittab文件、/etc/inittab文件。
4、执行系统初始化的命令行。
BusyBox在缺省情况下会使用/etc/init.d/rcS命令行。
5、执行所有会导致init暂停的inittab命令。
6、执行所有仅执行一次的inittab命令。
一旦完成以上工作,init进程便会循环执行以下工作:
1、执行所有终止时必须重新启动的inittab命令。
2、执行所有终止时必须重新启动但启动前必须先询问过用户的inittab命令。
8.4嵌入式文件系统
8.4.1嵌入式文件系统的特点和种类
文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。
linux会将这些分属不同分区的、单独的文件系统按
一定的方式形成一个系统的总的目录层次结构。
一个操作系统的运行离不开对文件的操作,因此必然要拥有并维护自己的文件系统。
linux文件系统使用索引节点来记录文件信息,作用像windows的文件分配表。
索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。
一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。
系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。
linux文件系统将文件索引节点号和文件名同时保存在目录中。
所以,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。
对于一个文件来说有唯一的索引节点号与之对应,对于一个索引节点号,却可以有多个文件名与之对应。
因此,在磁盘上的同一个文件可以通过不同的路径去访问它。
可以用ln命令对一个已经存在的文件再建立一个新的连接,而不复制文件的内容。
连接有软连接和硬连接之分,软连接又叫符号连接。
不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。
在嵌入式Linux应用中,主要的存储设备为RAM(DRAM,SDRAM和ROM(常采用FLASH存储器,常用的基于存储设备的文件系统类型包括:
jffs2,yaffs,cramfs,romfs,ramdisk,ramfs/tmpfs等。
8.4.2常见的嵌入式文件系统
1、基于FLASH的文件系统
Flash(闪存作为嵌入式系统的主要存储媒介,有其自身的特性。
Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1,因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block为单位进行的。
闪存主要有NOR和NAND两种技术(简单比较见附录。
Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。
因此,必须针对Flash的
硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash
的文件系统会有诸多弊端。
在嵌入式Linux下,MTD(MemoryTechnologyDevice,存储技术设备为底层
硬件(闪存和上层(文件系统之间提供一个统一的抽象接口,即Flash的文件系
统都是基于MTD驱动层的(参见上面的Linux下的文件系统结构图。
使用MTD驱动
程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主而设计
的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。
顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的
文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。
即
文件系统是针对于存储器分区而言的,而非存储芯片。
(1jffs2
JFFS文件系统最早是由瑞典AxisCommunications公司基于Linux2.0的内核
为嵌入式系统开发的文件系统。
JFFS2是RedHat公司基于JFFS开发的闪存文件系
统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2
也可以用在Linux,uCLinux中。
Jffs2:
日志闪存文件系统版本2(JournallingFlashFileSystemv2
主要用于NOR型闪存,基于MTD驱动层,特点是:
可读写的、支持数据压缩的、
基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”
支持等。
缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2
的运行速度大大放慢。
目前jffs3正在开发中。
关于jffs系列文件系统的使用详细文档,可参考MTD
补丁包中mtd-jffs-HOWTO.txt。
jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致
jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在挂载
时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大
容量的NAND闪存会耗费大量时间。
(2yaffs:
YetAnotherFlashFileSystem
yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件
系统。
与jffs2相比,它减少了一些功能(例如不支持数据压缩,所以速度更快,
挂载时间很短,对内存的占用较小。
另外,它还是跨平台的文件系统,除了Linux
和eCos,还支持WinCE,pSOS和ThreadX等。
yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件
系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。
当然,
yaffs也可与MTD驱动程序配合使用。
yaffs与yaffs2的主要区别在于,前者仅支持小页(512BytesNAND闪存,
后者则可支持大页(2KBNAND闪存。
同时,yaffs2在内存空间占用、垃圾回收速
度、读/写速度等方面均有大幅提升。
(3Cramfs:
CompressedROMFileSystem
Cramfs是Linux的创始人LinusTorvalds参与开发的一种只读的压缩文件
系统。
它也基于MTD驱动程序。
在cramfs文件系统中,每一页(4KB被单独压缩,可以随机页访问,其压缩
比高达2:
1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的
FLASH存储相同的文件,从而降低系统成本。
Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以
XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs
需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取
档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内
存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs
文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。
另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,
提高了系统的可靠性。
由于以上特性,Cramfs在嵌入式系统中应用广泛。
但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩
充。
Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用
loopback设备可以把它安装别的文件系统里。
(4Romfs
传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持
动态擦写保存,按顺序存放数据,因而支持应用程序以XIP(eXecuteInPlace,
片内运行方式运行,在系统运行时,节省RAM空间。
uClinux系统通常采用Romfs
文件系统。
其他文件系统:
fat/fat32也可用于实际嵌入式系统的扩展存储器(例如PDA,Smartphone,数码相机等的SD卡,这主要是为了更好的与最流行的Windows桌面
操作系统相兼容。
ext2也可以作为嵌入式Linux的文件系统,不过将它用于FLASH
闪存会有诸多弊端。
2、基于RAM的文件系统
(1Ramdisk
Ramdisk是将一部分固定大小的内存当作分区来使用。
它并非一个实际的文
件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。
将一些经常被访问而又不会更改的文件(如只读的根文件系统通过Ramdisk放在
内存中,可以明显地提高系统的性能。
在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系
统一起载入内存。
(2ramfs/tmpfs
Ramfs是LinusTorvalds开发的一种基于内存的文件系统,工作于虚拟文件
系统(VFS层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的
内存大小。
(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核
中的表示方式,并对磁盘文件系统进行缓冲。
Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM
中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var
目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。
Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:
不能格式化,文件
系统大小可随所含文件内容大小变化。
Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。
3、网络文件系统NFS(NetworkFileSystem
NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络
共享文件的技术。
在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机
上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系
统的内容。
8.5NFS环境的建立和使用
如果您已经完全安装好了Redhat9.0,则NFS相关软件都已经缺省安装好
了,请按照以下步骤建立和配置NFS服务。
(1设置共享目录
运行命令:
#gedit/etc/exports
编辑nfs服务的配置文件(注意:
第一次打开时该文件是空的,添加以下内
容:
/opt/s3c2440/root_nfs*(rw,sync,no_root_squash
其中:
/opt/s3c2440/root_nfs表示nfs共享目录,它可以作为开发板的根
文件系统通过nfs挂接;
*表示所有的客户机都可以挂接此目录
rw表示挂接此目录的客户机对该目录有读写的权力
no_root_squash表示允许挂接此目录的客户机享有该主机的root身份
(2建立共享目录
拷贝光盘中的root_nfs.tgz文件到某一个目录,进入此目录,执行以下命
令:
#tarxvzfroot_nfs.tgz–C/opt/s3c2440/root_nfs
该命令将把root_nfs的内容解压安装到/opt/s3c2440/root_nfs目录。
(3启动和停止nfs服务
在命令行下运行:
#/etc/init.d/nfsstart
这将启动nfs服务,可以输入以下命令检验nfs该服务是否启动。
#mount-tnfslocalhost:
/opt/s3c2440/root_nfs/mnt/
如果没有出现错误信息,您将可以浏览到/mnt目录中的内容和
/opt/s3c2440/root_nfs是一致的。
使用这个命令可以停止nfs服务:
#/etc/init.d/nfsstop
为了在每次开机时系统都自动启动该服务,打开系统服务配置窗口,在左侧
一栏找到nfs服务选项框,并选中它,然后点File->SaveChanges保存设置,如
图。
nfs的使用----通过NFS开发应用程序
我们可以将编译生成的应用程序放在nfsserver设置的目录上,然后通过
mount的方式将其引入使用。
[root@s3c2440/]$mount-onolock192.168.1.2:
/usr/local/test/mnt
[root@s3c2440/]$cd/mnt
[root@s3c2440/mnt]$ls
1280_720_8m_mp3.avi1khz_20s.mp3264
2641audioccir17_1khz.ts
divxdivx1920_1080_8m_mp3.avihdpic
m1vm2pmountain.wmv
mp4picturesetupbackground.jpg
test_bl.mp4wmv9
注意:
我们在设置开发板的IP地址时,要与NFSSERVER的IP地址同在一个网
段内。
还有就是记住NFSSERVER一定要运行起来,否则mount就不到了。
NFS给开
发带来很多方便,应该掌握使用。
192.168.1.2是NFSSERVER的IP地址。
nfs的使用----通过NFS启动系统
当NFS服务设置好并启动后,我们就可以把NFS作为根文件系统来启动开发
板了。
通过使用NFS作为根文件系统,开发板的“硬盘”就可以变得很大,因为
您使用的是主机的硬盘,这是使用linux作为开发经常使用的方法,
修改编译kernel,使用的启动参数为
CONFIG_CMDLINE=“root=/dev/nfsrw
nfsroot=192.168.1.3:
/opt/s3c2440/root_nfs
ip=192.168.1.6:
192.168.1.3:
192.168.1.1:
255.255.255.0:
arm:
eth0:
off
console=ttySAC0,115200noinitrdinit=/linuxrcmem=32M”。
并需要将
nfs_root选成y,选上后,从新编译生成内核文件并将内核烧写进FLASH,这样就
可以从NFS启动系统了。
8.6根文件系统的基本结构
根文件系统的顶层目录各有其特殊的用法和目的。
其中有许多目录只对多用
户系统有意义,而这些由不同用户使用的服务器及(或工作站,则是由系统管理
员负责维护。
在大多数的嵌入式Linux系统中,通常不会有所谓的用户和管理者,
所以不必严格看待用来建节根文件系统的规则。
这并不表示你可咀违反所有的规
则,只是意味着破坏某些规则对系统的正常操作几乎没有影响。
值得注意的是,
即使是用于工作站和服务器的主流商业发行套件也不一定会遵守根文件系统的
建立规则。
用来建立根文件系统的“正式”规则列在第一章提到的Filesystem
HierarchyStandard(FHS中。
这个文档的篇幅不超过30页,而且相当容易阅读。
如果在寻求与根文件系统有关的答案或说明,FHS或许是绝佳的起点。
表6-1提供
了根文件系统顶层目录的完整清单以及FHS指定的内容。
表6.1根文件系统顶层目录
目录内容bin必要的用户命令(二进制文件
boot引导加载程序使用的静态文件
dev设备文件和其他特殊文件
etc系统配置文件,包括启动文件
home用户主目录,包括供服务账号所使用的主目录,例如FTP
lib必要的链接库,例如c链接库、内核模块
mnt安装点,用于暂时安装文件系统
opt附加的软件套件
proc用来提供内核与进程信包的虚拟文件系统
rootroot用户的主目录
sbin必要的系统管理员命令(二进制文件
tmp暂时性的文件
usr在第二层包含对大多数用户都有用的大量应用程序和文件,包括x服务器var龊控程序和工具程序所存放的呵变数据
如果Linux是你每天必用的工作平台,应该已经熟悉表上提到的某些目录。
不过,现在让我们来进一步检查嵌入式Linux系统如何使用这些典型的根文件系
统内容。
首先,为多用户提供可扩展环境的所有目录(例如/home、/mnt、/opt和/root
都应该省略。
调整根文件系统的时候,我们甚至可以进一步移除/tmp和/var,不
过这么做可能会危害到某些软件的运行。
因此不建议采用这种过于简化的做法。
注意:
此处的讨论重点并不在“大小”这个议题上,而是在“功能”上。
事
实上,省略某个目录只会对根文件系统的大小造成一些影响。
理由是。
例如,我
说/home可以省略,但就算嵌入式Linux系统中保留它,它也是空的,因为根据FHS
的规定,它的内容应该只对工作站和服务器的设置有用。
根据引导加载程序和它的配置情况,可能不需要/boot目录。
选则取决于引
导加载程序是否会在内核被启动之前从根文件系统取回内核映像。
当然,日后如
果觉得有此需要,还可以重新设计根文件系统。
其余的目录,/bin、/dev、/etc、/lib、/proc、/sbin和/usr,都是不可或缺的。
极端情况下你可以省略/proc,因为它只能用来安装与其同名的虚拟文件系统。
然而这么做之后,如果需要实地分析目标板,将会很难了解目标板发生了什么事。
如果为了缩减存储空间,可能会将内核设定成不支持/proc,但是无论如何还是建议尽可能启用此功能。
/usr和/var这两个顶层目录与根目录非常像,有自己的目录结构。
在接下来的步骤中,当我们在摆放这两个目录的时候,将会简述它们的目录结构。
为了建立根文件系统,让我们移往针对此目的所设置的目录
﹩cd﹩(PRJROOT/rootfs
现在我们可以针对系统的需要建立根文件系统的顶层目录
﹩mkdirbindevetclibprocsbintmpusrvar
﹩chmod1777tmp
请注意,我们并未建立/boot。
如果日后需要再建立也不迟。
同时请注意,我们变更了/tmp目录的使用权,让它开启sticky位。
为/tmp目录的使用权开启此
位,可确保/tmp目录底下建立的文件,只有建立它的用户有权删除。
尽管正如我之前所说,嵌入式系统多半是单用户系统,不过有些嵌入式应用一定不能用root的特权来执行,因此需要遵照根文件系统权限位的一些基本规定。
接着我们可以建立/usr的目录结构:
﹩mkdirusr/binusr/libusr/sbin
在一个全功能的根文件系统上,/usr目录通常会包含更多条目。
你只要在自己的工作站上键入ls–al/usr这个命令就能够展示这样的简单范例。
你将会发现如man、src和local等这样的目录。
大多数嵌入式Linux系统的用途来说,上面所建立的这三个目录已经够用了。
最后我们可队建立/var的目录结构
﹩mkdirvar/libvar/lockvar/logvar/runvar/tmp
﹩chmod1777var/tmp
同样地,此目录通常会包含更多的条目。
尽管cache、mail和spool等目录对工作站或服务器来说很有用,但是嵌入式系统多半不需要这些目录。
我们建立的目录必须符合“能够让嵌入式Linux系统上可以找到的大多数应用程序正常运行”这个最起码的要求。
当然,如果需要web服务或打印功能,那么你或许会想要加入额外的目录,以符合应用程序提供此功能的需要。
8.7链接库
本节我们将会讨论,如何在目标板的根文件系统上安装链接库,让我们开发的应用程序使用他们。
我们将会讨论dietlibc,因为它主要用作静态链接库。
8.7.1glibc
g1ibc套件包含若干链接库。
你可以在套件建立期间列出/usr/local/arm/3.4.1/arm-linux/lib目录的内容检查它所安装的所有链接库。
此目录主要包含四种类型的文件:
这类文件的文件名格式为libLIBRARY_NAME-GLIBC_VERSION.so其中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 linux 文件系统 建立