以下内容源于网络资源的整理,如有侵权请告知删除。
参考博客
(1)https://www.cnblogs.com/alantu2018/p/8461749.html
(2)
一、Linux文件系统的简介
1.1 文件系统的概念
文件系统是对一个存储设备上的数据进行组织的机制,这种机制有利于用户和操作系统的交互。
尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用的主要工具。对Linux来说尤其如此,因为UNIX使用文件I/O机制管理硬件设备和数据文件。在Linux中如果没有文件系统,用户和操作系统的交互也就断开了。
换言之,文件系统简单来说就是一种目录结构(它将各种数据、程序、设备等内容以文件形式组织与管理起来);另外文件系统提供了用户与操作系统交互的接口。
1.2 文件系统的结构
Linux 下的文件系统由 4 层组成,分别是用户层、内核层、驱动层、硬件层,如下所示。
(1)用户层
它包含一些应用程序和 GNU C 库(即glibc),为用户提供一些系统调用接口,比如文件的打开、读取、写和关闭等API。
(2)内核层
它包含一些底层文件系统的主要接口,实现了各种文件系统。
比如JFFS文件系统,主要用于NOR型Flash存储器。其基于MTD驱动层。可读写、支持数据压缩、基于哈希表的日志型文件系统,并提供了崩溃掉电安全保护,提供“写平衡”支持。
比如YAFFS文件系统,专门为NAND Flash存储器设计的嵌入式文件系统。适用于大容量的存储设备。速度快,占用内存少,不支持压缩和只支持NAND Flash存储器。
(3)驱动层
指的是块设备的驱动程序。
(4)硬件层
指的是嵌入式系统使用的几种存储器。
由上可知,文件系统是一个广义概念:内容方面包含有软件(如用户层的库函数、内核层的底层接口、驱动层的驱动程序等)与硬件(具体的存储器);结构方面从用户层到内核层,再到驱动层和硬件层。
1.3 文件系统的分类
不同的文件系统类型具有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM(DRAM、SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2、yaffs、cramfs、romfs、ramdisk、ramfs/tmpfs等。
1.3.1 基于FLASH的文件系统
1.3.2 基于RAM的文件系统
1.3.3 网络文件系统(NFS,Network File System)
二、根文件系统的简介
2.1 根文件系统的特殊性
当我们在Windows环境下提到文件系统时,首先想到的是Fat32、NTFS等文件系统类型,而在Linux中,则会想到Ext2、Ext3等文件系统。但其实还有一种很重要的文件系统——根文件系统。
根文件系统,首先它是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,而且相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载的第一个文件系统,内核代码的镜像文件保存在根文件系统中(嵌入式linux并没有将内核代码的镜像保存在根文件系统中,而是保存到了其他地方,比如 NAND Flash 的指定存储地址、EMMC 专用分区中)在根文件系统成功挂载之后,系统引导启动程序会从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。
根文件系统之所以在前面加一个“根”,说明它是加载其它文件系统的“根”,包含了系统引导和使其他文件系统得以挂载所必需的文件。例如Linux启动时都需要有init目录下的相关文件,在 Linux挂载其他分区时会寻找/etc/fstab这个文件,根文件系统还包括存有许多的应用程序的bin目录等。
注释:Linux启动过程中,第一个挂载的文件系统必须是根文件系统。如果不能从指定设备上挂载根文件系统,则系统会出错而退出启动。挂载根文件系成功之后,可以自动或手动挂载其他的文件系统。因此,一个系统可以同时存在不同的文件系统。
2.2 根文件系统的挂载过程
理论过程见博文https://www.cnblogs.com/armlinux/archive/2011/03/30/2396825.html。
简单地说,首先将/dev/ram0挂载,然后切换到根目录,再挂载根文件系统。
根文件系统被挂载到根目录后,在根目录下就有根文件系统的各个目录,然后可以再将其他分区挂接到/mnt目录上,/mnt目录下就有各个分区的目录。
注释:可以深入理解下根文件系统的挂载过程,这对我们构建linux嵌入式开发系统是很有帮助的。
2.3 如何构建根文件系统
第一种方法:下载相应的命令源码,并移植到对应的处理器架构平台上。
第二种方法:使用开源工具构建,比如BusyBox、TinyLogin、Embutils等。