Linux文件系统初探

时间:2022-08-07 03:54:50

Linux文件系统初探

摘要:由于嵌入式设备存储介质的特殊性、电源供给的不稳定性和移动存储的安全性等要求,嵌入式文件系统在嵌入式操作系统中的重要性愈加明显。本文首先结合具体实验平台的一个嵌入式Linux操作系统,提出了一种嵌入式Linux文件系统的总体架构,并讨论了在这个嵌入式系统下,文件系统的移植和实现方法。希望这些实践经验可以为今后的研究提供有益的帮助和良好的技术支持。

关键词:虚拟文件系统;内存技术设备;日志文件系统

中图分类号:TP316 文献标识码:A

嵌入式产品已经渗透到人们生活的方方面面,特别是在数字信息技术和网络技术高速发展的今天,手持信息产品正拓展着一片越来越大的市场。PDA、手机、掌上电脑、信息家电等各式手持产品已拥有了庞大的用户群。手持信息产品所运用的最关键的核心技术就是嵌入式操作系统。Linux以其开源的内核和免费的应用程序、能够自由地移植和开发的优势,更迎合了嵌入式市场的需求。

嵌入式Linux的开发大致可分为三个层次:引导装载内核、构造文件系统和图形用户界面。作为操作系统重要组成部分的文件系统,它决定了操作系统本身的信息和用户的数据在存储设备上的组织形式。对嵌入式文件系统的研究、设计和开发也逐渐成为嵌入式系统研究领域的一个方向。

1 嵌入式Linux文件系统

1.1 简介

文件系统是指在一个物理设备上的任何文件组织和目录,它构成了Linux系统上所有数据的基础。Linux程序、库、系统文件和用户文件都驻留其中,因此它是系统中庞大复杂且又是最为基本和重要的资源。值得提出的是,Linux系统中的文件不仅包括普通的文件和目录,每个和设备相关的实际实体也都被映射为一个文件,例如磁盘、打印机、终端等。这样的设备文件又称为特殊文件。所以,Linux下的文件是操作系统服务和设备的简单而又统一的接口。从某种意义上可以说,Linux里的一切事物都是文件。

在Linux中,文件系统的结构是基于树状的,根在顶部,各个目录和文件从树根向下分支。

目录树的最顶端被称为根目录(/)。在后面介绍的所构造文件系统结构图(图1)即显示了树状的文件系统。Linux操作系统由一些目录和许多文件组成。

由于Linux是一个多任务、多用户的操作系统,因此它里面的文件还都被赋予了一定的权限,来决定谁能读、写或执行一个文件,以及这个文件的类型和如何执行。例如下面的文件列表:

-rw-r-r- 1 root root 1756 Sep 9 2005 inittab

其表示:这个名为inittab的文件是普通文件;所有者有读写的权限;所在组和其他人都只有读的权限;它的连接数为1;所有者及文件所属的组都是root 文件中字节数为1756;文件创建日期是2005年9月9日。可以通过对文件属性的设置,来满足文件在不同用户组、不同用户操作下的不同状态。

1.2 特点

由于嵌入式设备的一些特殊性,使得嵌入式文件系统除了满足一般文件系统的基本要求外,还有一些自身的特性:文件系统面对的存储介质特殊;文件系统有快速恢复的特殊要求;物理文件系统的多样性和动态可装配性;需要文件系统具有跨操作平台的安全性;文件系统要能满足整个系统的实时性要求。

2 文件系统的设计

2.1 实验主机和目标平台的连接

实验主机和目标平台的连接有两种方法:一种是以太网连接,这种连接方式可以进行内核文件、根文件系统映像文件的下载;另一种是串口连接,这样的连接方式可以供调试之用。

2.2 构建文件系统

构造基本目录首先建立一个文件系统的工作空间。创建目录/home/work,所构造的文件系统就在work这个目录中。建立基本目录,如bin、dev、etc、lib、mnt、proc、sbin、tmp、usr、vat、tools。具体结构见图l。

其中,tools是便于开发而创建的目录。因为整个系统要求尽量小,所以应只包含一些必须的二进制程序。开发过程中需要用到的命令就放在tools中。/etc目录下只包含了一些启动过程的配置文件。/ l i b 目录下的modules子目录包含了可动态加载到核心的各种模块。另外,目录var下还应创建两个子目录log和run,负责记录系统的日志和运行状态。整个文件系统中除了tmp和var 目录放在SDRAM内以外,其他所有目录都放在Flash中,因为trap和var中的内容需要经常写入,所以放在可读写的RAM里。 当在目标平台实现了一个嵌入式Linux之后,为了很好地管理操作系统和用户的数据文件,引入了文件系统。物理文件系统是JFFS2,考虑到扩充物理文件系统的要求,保留了Linux的VFS层次。考虑到存储设备扩充的要求,在Linux内核中加入了对MTD设备的支持。根据上面的叙述,可给出整个文件系统的体系结构图,如图2所示。

构建文件系统最基本的要求就是系统能够在此基础上启动运行起来,所以,/sbin下的init程序必不可少。init程序是引导过程完成后内核运行的第一个程序,它能启动全部其他程序。只要init完成运行全部必要的程序,该系统就开始建立并开始运行。当程序开始启动时,init读取一个配置文件inittab,这个文件位于/etc下,它确定了init在启动和关机时的工作特性。在开发的这个嵌入式系统中,所有的文件内容只需保留与开发要求有关的必须部分。所以inittab的内容根据需要重新写入。

这个系统运行单用户模式启动,启动后立即运行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大小。

2.3 进一步开发

按照上一部份给出的文件系统体系结构,文件系统的实现主要在VFS层、物理文件系统层和MTD层。下面给出在MTD层Linux的源代码做的一些修改,同时介绍JFFS2物理文件系统映像文件的生成。

3 支持MTD设备

对MTD设备的支持要经过配置内核、编写设备驱动程序和建立MTD设备这几个步骤。

第一步,配置内核参数。选中Memory Technology Devices(MTD)support,下面的子项中至少要选择MTD partitioning support、Direct Char device access to M TD devices和Caching block device access to MTD devices这三项。其他的有关NFTL、CFI的支持根据需要选取。

第二步,编写针对目标平台Flash设备的MTD驱动程序,主要实现创建MTD 分区和删除MTD分区的函数。创建分区的流程见图3所示。删除分区的函数比较简单,如果存在MTD分区,就调用del_mtd_partitions(struct mtd info*)删除分区,并且删除为MTD设备创建的映射表。

第三步,将修改过的MTD驱动文件作为内核文件的补丁,并给内核文件打上这个补丁, 最后,编译生成内核文件。

第四步,使用mknod命令建立MTD设备。mknod命令的格式如下:

mknodc 90 //MTD字符设备

mknodb 31 //MTD块设备

4 网卡设置方法

首先需要Linux kernel 2.6.1+,其次需要在编译内核的时候选上CONFIG_NET_RADIO。

安装hostap-driver:

tar zxvf hostap-driver-0.1.3.tar.gz

cd hostap-driver-0.1.3

然后,用任意编辑器打开该目录下的Makefile文件,将第三行的KERNEL_PATH=加上你的内核source地址,保存。

然后Make

make install

接下来,先加载sysfs。修改/etc/fstab,加一行none /sys sysfs defaults 0 0。

在/etc/sysconfig/network-scripts/下建立一个ifcfg-eth1文件,内容如下:

DEVICE=eth1

ONBOOT=yes

BOOTPROTO=dhcp

TYPE=Wireless

WIRELESS_ENC_KEY=“你的WEP加密字符串”

WIRELESS_ESSID=“AP网络名”

WIRELESS_CHANNEL=“”

WIRELESS_MODE=“”

这样就行了,其他的参数应该会自动从服务端获取。除了enc,还有几个常用的参数,essid mode channel nick,其他参数请用iwconfig-help或者man iwconfig查看。

启动你的无线网卡,需要启动hostap和ipw2100这两个模块。找到/etc/modprobe.preload

在文件的最后依此加上:hostapipw2100,保存后退出。

5 小结

我们构造了一个嵌入式版本的Linux文件系统,它使得内核在系统尽量精简的情况下能够运行起来,并满足产品和系统各方面的要求。在这个嵌入式文件系统中,引入了VFS的支持,虽然牺牲了一些空间,但是大大方便了今后各种物理文件系统的动态加载。

参考文献

[1]Karim Yaghmour著.韩存兵等译.构建嵌入式Linux系统[M].北京:中国电力出版社,2004.

[2]郑桦.嵌入式Linux文件系统的设汁与实现[M].武汉:武汉理工大学,2004.

[3]郑良辰,孙玉芳.日志文件系统在嵌入式存储设备上的实现[J].计算机科学,2002,(2).

[4]Cliff Brake, Jef Sutherland.Flash Filesystem for Embedded Linux System[DB/OL]. http://www.省略.

上一篇:浅谈VFP中的RUSHMORE技术 下一篇:浅议CPLD温度显示系统设计