分类: 嵌入式
2009-10-27 12:19:46
一、linux文件系统目录结构的规划
bin/ dev/ home/ lost+found/ proc/ sbin/ usr/ boot/ etc/ lib/ mnt/ root/ tmp/ var/
分述如下:
/sbin
这个目录包含了所有使系统运行的关键二进制可执行文件。包含了系统管理和维护硬件配置的程序。你可以在这里找到lilo, fdisk, init, ifconfig等等。
这里有所有用户都需要的关键程序。
/usr/sbin
另一个包含系统可执行文件的目录。这个目录包含了系统管理员使用的一些其他程序。这里你可以找网络守护程序以及一些不需要维护和修理系统的管理员所使用的程序。
/bin
相对于/sbin, bin目录包含一些系统管理员和普通用户都可以使用的命令。这个目录通常包含诸如bash, csh等shell,以及诸如cp, mv, rm, cat, ls等非常有用的命令。这些命令对于用户来说是不可缺少的。
/usr/bin
包含一些其它的用户命令。从另一方面看,这些命令本质上并不是为用户准备的。
/boot
这个目录包含system.map文件以及Linux kernel。Lilo将启动扇区的备份放在这里。
/dev
这是一个非常有趣的目录,是Linux文件系统的一个闪亮的特性 - 所有对象都是文件或目录。仔细观察这个目录你会发现hda1, hda2等, 它们代表系统主硬盘的不同分区。/dev/cdrom和/dev/fd0代表你的CDROM驱动器和floppy驱动器。看上去可能有些奇怪,但比较文件 和硬件的特性这却是十分合理的。它们都可以读出和写入。例如/dev/dsp,这个文件代笔你的扬声器。那么写入这个文件的数据都回传送到喇叭。试一试 'cat /etc/lilo.conf > /dev/dsp' 你会听到一些声音。这是你的 lilo.conf 文件的声音!同样,向 /dev/ttyS0 ( COM 1 ) 读出或写入数据你可以和接到上面的设备进行通讯。
/home
Linux 是多用户环境,所以每一个用户都有一个只有自己可以访问的目录(当然管理员也可以访问)。它们以 /home/username 的方式存在。这个目录也保存一些应用对于这个用户的配置,比如 IRC, X 等。
/lib
这里包含了系统程序所需要的所有共享库文件,类似于 Windows 的共享库 DLL 文件。
/lost+found
Linux 应该正确的关机。但有时你的系统也可能崩溃掉或突然断电使系统意外关机。那么启动的时候 fsch 将会进行长时间的文件系统检查。Fsck 会检测并试图恢复所发现的不正确的文件。被恢复的文件会放置在这个目录中。所恢复的文件也许并不完整或并不合理,但毕竟提供了一些恢复数据的机会。
/mnt
这是一个普通的加载目录,在这里你可以加载你的文件系统或设备。
加载是使一个文件系统对于系统可用的过程。
在加载后你的文件可以在加载目录下访问。
这个目录通常包含加载目录或用于加载软驱和光驱的子目录。
如果需要,你也可以在这里建立其它的加载目录。
对于加载目录的位置并没有强制性的要求,你可以在系统的任意位置建立加载目录。
建立 /mnt 只是为了使系统更工整的惯例。
/opt
这个目录包含所有默认系统安装之外的软件和添加的包。一般来说你可以在这里找到 KDE 和 StarOffice 。这个目录一般并不会经常被启用,这是Unix系统安装的标准。
/proc
这是系统中极为特殊的一个目录,实际上任何分区上都不存在这个目录。它实际是个实时的、驻留在内存中的文件系统。详细信息请参阅
/root
这是root的用户用户目录。
/tmp
这里包含大多数要用到的临时文件。
许多程序在这里建立lock文件和存储临时数据。有些系统会在启动或关机时清空此目录。
/usr
这是系统中很重要的一个目录,这里包含所有用户的二进制文件、X、及其库文件,用户程序比如 telnet, ftp 等等都在这里。
/usr/doc包含系统文档。/usr/src/linux包含 Linux kernel 的源码。
/var
这里存储假脱机(spooling)数据,比如 mail 以及打印机守护的输出。
系统日志也存放在这里。你还可以在/var/named下找到BIND的数据库,在/var/yp下找到NIS的数据库。
二、嵌入式Linux文件系统详细介绍
Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。
Linux下的文件系统结构如下:
不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。
1. 基于FLASH的文件系统
Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。
闪存主要有NOR和NAND两种技术(简单比较见附录)。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因此,必须针对Flash的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系统会有诸多弊端。
在嵌入式Linux下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上面的Linux下的文件系统结构图)。使用MTD驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。
顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。
(1) jffs2
JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux, uCLinux中。
Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2)
主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。
目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。
jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。
(2) yaffs:Yet Another Flash File System
yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。
yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。
yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。
(3) Cramfs:Compressed ROM File System
Cramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。
在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。
Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。
另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。
由于以上特性,Cramfs在嵌入式系统中应用广泛。
但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。
Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback 设备可以把它安装别的文件系统里。
(4) Romfs
传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以XIP(eXecute In Place,片内运行)方式运行,在系统运行时,节省RAM空间。uClinux系统通常采用Romfs文件系统。
其他文件系统:fat/fat32也可用于实际嵌入式系统的扩展存储器(例如PDA, Smartphone, 数码相机等的SD卡),这主要是为了更好的与最流行的Windows桌面操作系统相兼容。ext2也可以作为嵌入式Linux的文件系统,不过将它用于FLASH闪存会有诸多弊端。
2. 基于RAM的文件系统
(1) Ramdisk
Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。
在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。
(2)ramfs/tmpfs
Ramfs是Linus Torvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。)
Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。
Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。
Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。
3. 网络文件系统NFS (Network File System)
NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。
以上讨论的都是基于存储设备的文件系统(memory-based file system),它们都可用作Linux的根文件系统。实际上,Linux还支持逻辑的或伪文件系统(logical or pseudo file system),例如procfs(proc文件系统),用于获取系统信息,以及devfs(设备文件系统)和sysfs,用于维护设备文件。
附录:NOR闪存与NAND闪存比较:
NOR FLASH |
NAND FLASH |
接口时序同SRAM,易使用 |
地址/数据线复用,数据位较窄 |
读取速度较快 |
读取速度较慢 |
擦除速度慢,以64-128KB的块为单位 |
擦除速度快,以8-32KB的块为单位 |
写入速度慢(因为一般要先擦除) |
写入速度快 |
随机存取速度较快,支持XIP(eXecute In Place,芯片内执行),适用于代码存储。在嵌入式系统中,常用于存放引导程序、根文件系统等。 |
顺序读取速度较快,随机存取速度慢,适用于数据存储(如大容量的多媒体应用)。在嵌入式系统中,常用于存放用户文件系统等。 |
单片容量较小,1-32MB |
单片容量较大,8-128MB,提高了单元密度 |
最大擦写次数10万次 |
|