根档案系统首先是核心启动时所mount的第一个档案系统,核心代码映像档案保存在根档案系统中,而系统引导启动程式会在根档案系统挂载之后从中把一些基本的初始化脚本和服务等载入到记忆体中去运行。
基本介绍
- 中文名:根档案系统
- 类别1:/bin目录
- 类别2:/sbin 目录
- 类别3:/dev目录
简介
首先要明白的是“什幺是档案系统”,档案系统是对一个存储设备上的数据和元数据进行组织的机制。这种机制有利于用户和作业系统的互动。在一篇oracle的技术文章中看到这样一句话“儘管核心是 Linux 的核心,但档案却是用户与作业系统互动所採用的主要工具。这对 Linux 来说尤其如此,这是因为在 UNIX 传统中,它使用档案 I/O 机制管理硬体设备和数据档案”,这句话我是这样理解的,在Linux没有档案系统的话,用户和作业系统的互动也就断开了,例如我们使用最多的互动shell,包括其它的一些用户程式,都没有办法运行。在这里可以看到档案系统相对于Linux作业系统的重要性。下面是Linux档案系统组件的体系结构。
用户空间包含一些应用程式(例如,档案系统的使用者)和 GNU C 库(glibc),它们为档案系统调用(打开、读取、写和关闭)提供用户接口。系统调用接口的作用就像是交换器,它将系统调用从用户空间传送到核心空间中的适当端点。
VFS 是底层档案系统的主要接口。这个组件导出一组接口,然后将它们抽象到各个档案系统,各个档案系统的行为可能差异很大。有两个针对档案系统对象的快取(inode 和dentry)。它们快取最近使用过的档案系统对象。
每个档案系统实现(比如 ext2、JFS 等等)导出一组通用接口,供 VFS 使用。缓冲区快取会快取档案系统和相关块设备之间的请求。例如,对底层设备驱动程式的读写请求会通过缓冲区快取来传递。这就允许在其中快取请求,减少访问物理设备的次数,加快访问速度。以最近使用(LRU)列表的形式管理缓冲区快取。注意,可以使用 sync 命令将缓冲区快取中的请求传送到存储媒体(迫使所有未写的数据传送到设备驱动程式,进而传送到存储设备)。
当我们在Windows下,提到档案系统时,你的第一反应是想到的是什幺?是不是Windows下的一些Fat32、NTFS等的档案系统的类型。而在Linux中,你可能会想到Ext2、Ext3,但你还必须要有一个根档案系统的概念。根档案系统首先是一种档案系统,该档案系统不仅具有普通档案系统的存储数据档案的功能,但是相对于普通的档案系统,它的特殊之处在于,它是核心启动时所挂载(mount)的第一个档案系统,核心代码的映像档案保存在根档案系统中,系统引导启动程式会在根档案系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务载入到记忆体中去运行。我们要明白档案系统和核心是完全独立的两个部分。在嵌入式中移植的核心下载到开发板上,是没有办法真正的启动Linux作业系统的,会出现无法载入档案系统的错误。
那幺根档案系统在系统启动中到底是什幺时候挂载的呢?先将/dev/ram0挂载,而后执行/linuxrc.等其执行完后。切换根目录,再挂载具体的根档案系统.根档案系统执行完之后,也就是到了Start_kernel()函式的最后,执行init的进程,也就第一个用户进程。对系统进行各种初始化的操作。如果要弄明白这里的过程的话,可要好好的看看Linux核心源码了。下图展示了VFS,核心,档案系统的层次结构:
根档案系统之所以在前面加一个”根“,说明它是载入其它档案系统的”根“,既然是根的话,那幺如果没有这个根,其它的档案系统也就没有办法进行载入的。它包含系统引导和使其他档案系统得以挂载(mount)所必要的档案。根档案系统包括Linux启动时所必须的目录和关键性的档案,例如Linux启动时都需要有init目录下的相关档案,在 Linux挂载分区时Linux一定会找/etc/fstab这个挂载档案等,根档案系统中还包括了许多的应用程式bin目录等,任何包括这些Linux 系统启动所必须的档案都可以成为根档案系统。
Linux启动时,第一个必须挂载的是根档案系统;若系统不能从指定设备上挂载根档案系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的档案系统。因此,一个系统中可以同时存在不同的档案系统。
在 Linux 中将一个档案系统与一个存储设备关联起来的过程称为挂载(mount)。使用 mount 命令将一个档案系统附着到当前档案系统层次结构中(根)。在执行挂装时,要提供档案系统类型、档案系统和一个挂装点。根档案系统被挂载到根目录下“/”上后,在根目录下就有根档案系统的各个目录,档案:/bin /sbin /mnt等,再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区的各个目录,档案。
Linux根档案系统中一般有如下图的几个目录:
1./bin目录
该目录下的命令可以被root与一般账号所使用,由于这些命令在挂接其它档案系统之前就可以使用,所以/bin目录必须和根档案系统在同一个分区中。
/bin目录下常用的命令有:cat、chgrp、chmod、cp、ls、sh、kill、mount、umount、mkdir、[、test等。其中“[”命令就是test命令,我们在利用Busybox製作根档案系统时,在生成的bin目录下,可以看到一些可执行的档案,也就是可用的一些命令。
2./sbin 目录
该目录下存放系统命令,即只有系统管理员(俗称最高许可权的root)能够使用的命令,系统命令还可以存放在/usr/sbin,/usr/local/sbin目录下,/sbin目录中存放的是基本的系统命令,它们用于启动系统和修复系统等,与/bin目录相似,在挂接其他档案系统之前就可以使用/sbin,所以/sbin目录必须和根档案系统在同一个分区中。
/sbin目录下常用的命令有:shutdown、reboot、fdisk、fsck、init等,本地用户自己安装的系统命令放在/usr/local/sbin目录下。
3、/dev目录
该目录下存放的是设备与设备接口的档案,设备档案是Linux中特有的档案类型,在Linux系统下,以档案的方式访问各种设备,即通过读写某个设备档案操作某个具体硬体。比如通过"dev/ttySAC0"档案可以操作串口0,通过"/dev/mtdblock1"可以访问MTD设备的第2个分区。比较重要的档案有/dev/null, /dev/zero, /dev/tty, /dev/lp*等。
4./etc目录
该目录下存放着系统主要的配置档案,例如人员的账号密码档案、各种服务的其实档案等。一般来说,此目录的各档案属性是可以让一般用户查阅的,但是只有root有许可权修改。对于PC上的Linux系统,/etc目录下的档案和目录非常多,这些目录档案是可选的,它们依赖于系统中所拥有的应用程式,依赖于这些程式是否需要配置档案。在嵌入式系统中,这些内容可以大为精减。
5./lib目录
该目录下存放共享库和可载入(驱动程式),共享库用于启动系统。运行根档案系统中的可执行程式,比如:/bin /sbin 目录下的程式。
6./home目录
系统默认的用户资料夹,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置档案。
7./root目录
系统管理员(root)的主资料夹,即是根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。
8./usr目录
/usr目录的内容可以存在另一个分区中,在系统启动后再挂接到根档案系统中的/usr目录下。里面存放的是共享、唯读的程式和数据,这表明/usr目录下的内容可以在多个主机间共享,这些主要也符合FHS标準的。/usr中的档案应该是唯读的,其他主机相关的,可变的档案应该保存在其他目录下,比如/var。/usr目录在嵌入式中可以精减。
9./var目录
与/usr目录相反,/var目录中存放可变的数据,比如spool目录(mail,news),log档案,临时档案。
10./proc目录
这是一个空目录,常作为proc档案系统的挂接点,proc档案系统是个虚拟的档案系统,它没有实际的存储设备,里面的目录,档案都是由核心
临时生成的,用来表示系统的运行状态,也可以操作其中的档案控制系统。
11./mnt目录
用于临时挂载某个档案系统的挂接点,通常是空目录,也可以在里面创建一引起空的子目录,比如/mnt/cdram /mnt/hda1 。用来临时挂载光碟、移动存储设备等。
12. /tmp目录
用于存放临时档案,通常是空目录,一些需要生成临时档案的程式用到的/tmp目录下,所以/tmp目录必须存在并可以访问。
那我们利用Busybox製作根档案系统就是创建这上面的这些目录,和这些目录下面的各种档案。
对于嵌入式Linux系统的根档案系统来说,一般可能没有上面所列出的那幺複杂,比如嵌入式系统通常都不是针对多用户的,所以/home这个目录在一般嵌入式Linux中可能就很少用到,而/boot这个目录则取决于你所使用的BootLoader是否能够重新获得核心映象从你的根档案系统在核心启动之前。一般说来,只有/bin,/dev,/etc,/lib,/proc,/var,/usr这些需要的,而其他都是可选的。
根档案系统一直以来都是所有类Unix作业系统的一个重要组成部分,也可以认为是嵌入式Linux系统区别于其他一些传统嵌入式作业系统的重要特徵,它给 Linux带来了许多强大和灵活的功能,同时也带来了一些複杂性。我们需要清楚的了解根档案系统的基本结构,以及细心的选择所需要的系统库、核心模组和应用程式等,并配置好各种初始化脚本档案,以及选择合适的档案系统类型并把它放到实际的存储设备的合适位置,下面是几中比较常用的档案系统。
档案系统
(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)网路档案系统NFS (Network File System)
NFS是由Sun开发并发展起来的一项在不同机器、不同作业系统之间通过网路已分享档案的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS 的根档案系统,挂载到嵌入式设备,可以很方便地修改根档案系统的内容。以上讨论的都是基于存储设备的档案系统(memory-based file system),它们都可用作Linux的根档案系统。实际上,Linux还支持逻辑的或伪档案系统(logical or pseudo file system),例如procfs(proc档案系统),用于获取系统信息,以及devfs(设备档案系统)和sysfs,用于维护设备档案。