以下内容源于网络资源的整理,如有侵权请告知删除。
一、文件系统
文件系统是对一个存储设备上的数据进行组织的机制。这种机制有利于用户和操作系统的交互。
尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用的主要工具。对Linux来说尤其如此,因为UNIX使用文件I/O机制管理硬件设备和数据文件。在Linux中如果没有文件系统,用户和操作系统的交互也就断开了。
用户空间包含一些应用程序和 GNU C 库(glibc),它们为文件系统调用(文件的打开、读取、写和关闭)提供用户接口。
系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点。
VFS 是底层文件系统的主要接口。
- 这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。
- 有两个针对文件系统对象的缓存(inode 和 dentry)。它们缓存最近使用过的文件系统对象。
- 每个文件系统实现(比如 ext2、JFS 等等)导出一组通用接口,供 VFS 使用。
- 缓冲区缓存会缓存文件系统和相关块设备之间的请求。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。以最近使用(LRU)列表的形式管理缓冲区缓存。注意,可以使用 sync 命令将缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序,进而发送到存储设备)。
二、根文件系统
当我们在Windows环境下提到文件系统时,首先想到的是Fat32、NTFS等文件系统类型,而在Linux中,则会想到Ext2、Ext3等文件系统。但其实还有一种很重要的文件系统——根文件系统。
根文件系统,首先它是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,而且相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载的第一个文件系统,内核代码的映像文件保存在根文件系统中,在根文件系统成功挂载之后,系统引导启动程序会从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。
那么根文件系统是怎样挂载的呢?先将/dev/ram0挂载,而后执行/linuxrc,等其执行完后,切换到根目录,再挂载具体的根文件系统。根文件系挂载之后,也就是到了Start_kernel()函数的最后,执行init进程,也就第一个用户进程,对系统进行各种初始化的操作。
根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的“根”,它包含系统引导和使其他文件系统得以挂载所必需的文件。根文件系统包括Linux启动时所必需的目录和关键性文件,例如:Linux启动时都需要有init目录下的相关文件;在 Linux挂载分区时Linux一定会找/etc/fstab这个文件;根文件系统中还包括了许多的应用程序bin目录等。任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统。
Linux启动时,第一个必须挂载的是根文件系统。如果系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统。因此,一个系统可以同时存在不同的文件系统。
在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂装(mount)。使用mount命令可以将一个文件系统附着到当前文件系统层次结构中。在执行挂装时,要提供文件系统类型、文件系统和一个挂装点。根文件系统被挂载到根目录后,在根目录下就有根文件系统的各个目录与文件/bin、/sbin、 /mnt等,再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区的各个目录与文件。
附录:
Linux支持多种文件系统,包括 ext2、ext3、vfat、ntfs、iso9660、jffs、romfs、cramfs、nfs 等。为了统一管理,Linux引入虚拟文件系统 VFS(Virtual FILE System)。
Linux 文件系统由 4 层组成,分别是用户层、内核层、驱动层、和硬件层。
用户层:为用户提供一个操作接口。
内核层:实现了各种文件系统。
驱动层:是块设备的驱动程序。
硬件层:是嵌入式系统使用的几种存储器。
Linux启动时,第一个必须挂载的是 根文件系统。
嵌入式系统的存储介质:
JFFS文件系统:主要用于NOR型Flash存储器。其基于MTD驱动层。可读写、支持数据压缩、基于哈希表的日志型文件系统,并提供了崩溃掉电安全保护,提供“写平衡”支持。
YAFFS文件系统:专门为NAND Flash存储器设计的嵌入式文件系统。适用于大容量的存储设备。速度快,占用内存少,不支持压缩和只支持NAND Flash存储器。
根文件系统
根文件系统被存储在Flash存储器中,存储器被分为多个分区,(分区1,分区2,分区3等。)
分区1一般存储Linux内核映像文件,分区2存放根文件系统,根文件系统中存放着系统启动必须的文件和程序(包括提供用户界面的shell程序、应用程序依赖的库、配置文件等)。
内核启动后运行的第一个程序是init,其将启动根文件系统中的shell程序,给用户提供一个友好的操作界面。
构建根文件系统:
第一种方法:下载相应的命令源码,并移植到处理器架构平台上。
第二种方法:使用开源工具构建。(BusyBox、TinyLogin、Embutils)