何为文件系统,何为根文件系统?

何为文件系统,何为根文件系统?

先不要管ARM Linux。也不要管其它的任何东西。

要回到源头,从源头把思路理清楚——即,数据管理的方案设计。

极简说明:如何管理数据-->数据的组织形式设计(以文件的形式管理数据)-->如何管理文件(以目录的形式管理文件)-->如何管理目录(以目录树的形式管理目录)。这就是数据管理的逻辑结构组织形式。

逻辑结构组织形式的相关信息+数据=文件系统(逻辑的部分)。不同的逻辑结构的组织方案,得到不同的文件系统。

但是,数据放在哪里?放在外存储的介质上,简称外存储(现在最简单的外存储设备是单块磁盘或硬盘)。在外存储的介质上,一切都是2进制数字。类比:字符vs.ASCII码,在计算机内部,字符实际上是一组特定的二进制(ASCII码),相对于这些特定的二进制数字(ASCII码),字符只是逻辑上的概念。

因此,文件、目录、目录树都是抽象的逻辑概念,在外存储介质上,并没有什么文件、目录、目录树,都只不过是一串串特定的二进制数字而已。

但是,现在数据的逻辑结构组织形式是文件、目录、目录树,因此,怎么将这些逻辑形式的信息保存到外存储中,即文件、目录、目录树(的二进制数字)以何种格式存放在外存储中,即映射到外存储中?这分为以下几步。

为了系统地管理外存储的存储空间,引入了分区的概念(极简),将整个存储空间划分为两种:一种用来存放分区划分方案的信息(分区表),一种用来存放数据及其相关信息(文件系统分区)。

在每个文件系统分区中,一部分存储空间用来存放文件系统的逻辑结构的组织信息,对于这一部分,不同的文件系统的叫法不一样,FAT文件系统叫FAT表,NTFS文件系统叫MFT表,等等。剩下的空间以文件和目录的组织形式存放文件数据。

对于UNIX和类UNIX(Linux、BSD)的文件系统来说,采用统一管理方式,一切都是文件,包括目录(目录文件)、文件系统(分区)、输入输出设备(设备文件)。

对于类UNIX文件系统,所有类型的文件在逻辑上形成一个目录树,而这棵目录树本身的信息,也需要存放到外存储中,于是,就形成了根文件系统,用来存储整个目录树的信息(终于说到根文件系统这个概念是如何产生的)。所以,图1就变成了图2。至于在根文件系统中存放了哪些具体的文件,比如Linux系统工具软件+设备文件等等,可以在系统安装进行设置(还记得Linux的自定义安装过程有一个“/”的设置界面吗),也可以在系统维护的时候进行调整,也可以在运行的时候进行动态添加。(这里没有讲LVM,它是一个更高级的存储空间管理技术,在分区的基础上再建立一个卷的逻辑概念,因此存储空间管理更加灵活)。

因此,操作系统(内核+文件系统)也好,应用程序也罢,通通都存放在外存储中。CPU刚上电时,内存空空如也,什么都没有。要通过引导过程,将操作系统加载到内存中,并且建立相应的数据结构(如进程控制块、文件控制块等)。要始终记得,操作系统既包括内核,也包括文件系统。

当CPU上电后,首先是CPU硬件的初始化和引导(视具体的计算机系统而定,比如有的ARM CPU有一个IROM)、再是BIOS的初始化和引导(视具体的计算机系统而定,PC是BIOS,ARM Linux是Bootloader),然后再转到硬盘引导(视具体的计算机系统而定),将操作系统加载到内存中。

不同的计算机系统,引导过程不一样,既与具体的硬件有关,也与具体的操作系统有关。

对于ARM Linux来说,硬件引导+操作系统引导。硬件引导,这是另外一个话题,且不提。简略地说,其中操作系统引导有两个阶段:将内核读入到内存中,在内存中建立根文件系统。

由于内核和根文件系统都是在Flash(外存储)中,而在引导之前,还没有在内存中建立起操作系统中的相关数据结构(进程控制块、文件控制块等),所以,是以Flash的绝对地址进行引导(读取内核)的。因此,Flash也有相应的分区方案,类似于硬盘的分区。只不过是,Flash的分区是通过硬件的地址(跳线)来进行分区的,这称之为地址布局。所以,我们在刷Android手机时,要将内核、文件系统和用户文件等刷到不同的Flash分区中。如图3中的Booting Device部分。ARM CPU采用统一地址空间(内存地址和外设I/O地址),有专门的地址空间布局方案,当然,这又是另一个话题,不提也没有影响,要善于假设。

至于ARM Linux的内存文件系统,是一种方便将根文件系统加载到内存中的设计。在过去,由于ARM嵌入式系统的Flash很小,因此,将Linux系统工具软件和设备文件(/bin, /sbin, /dev等)进行移植和精简,并形成一个文件,比如Busybox。当加载ARM Linux根文件系统时,从Flash中读取Busybox文件、在内存中开辟一块区域、采用数据结构将这块内存区域模拟为磁盘分区(这块分区称为内存文件系统)、并将Busybox“展开”到内存文件系统中。

最后,本文的外存储是极简的,只讲到单块磁盘和简略的Flash。实际上,外存储是一个很庞大的技术体系。

总结:

题外话: