我们一直在使用文件系统。我们开发的时候用文件系统,浏览网页的时候用文件系统,玩手机的时候也用文件系统。对于非专业人士,可能不知道什么是文件系统。因为,一般来说,我们在使用文件系统的时候,一般不会感知到文件系统的存在。即使是程序开发人员,很多人对文件系统也是一知半解。虽然文件系统往往不为人知,但文件系统非常重要。在Linux操作系统中,文件系统是Linux内核的四大子系统之一;在Windows之前,微软的DOS系统,它的全称是DiskOperatingSystem,也就是磁盘管理系统,简单来说就是一个文件系统。深究文件系统如果想更深入地了解文件系统,首先要了解什么是文件系统。业界并没有对文件系统给出明确的定义。笔者阅读了《操作系统概念》和《现代操作系统》等知名的操作系统书籍,但并未找到文件系统的明确定义。文件系统的以下描述是在维基百科上找到的:Incomputing,afilesystemorfilesystem(oftenabbreviatedtofs)controlshowdataisstoredandretrieved。另一个描述文件系统概念的地方是Definitions,这是一个提供各种定义的专业网站。给出如下解释:在计算中,文件系统是一种数据存储,可用于存储、检索和更新文件。虽然我们没有找到明确的定义,但是从前面找到的文件系统的描述中我们可以知道,文件系统是一种控制数据访问的系统。通常,我们所指的文件系统是建立在磁盘上的(包括SSD盘和SD卡等)。因此,我们通常所说的文件系统实际上是一个管理磁盘空间和实现数据访问的系统。从狭义上讲,文件系统实现了对磁盘、软盘或光盘等块设备的数据访问。从广义上讲,文件系统不一定要建立在磁盘上,也可以建立在网络或内存上。无论建立在什么样的设备上,最重要的是实现对数据的访问。文件系统除了实现对数据的访问之外,还有一个比较重要的功能就是文件系统抽象出一个接口,以便于访问存储空间。这里的接口包括程序开发的API接口和普通用户的操作接口。为了便于理解,我们可以用图1来表示文件系统对磁盘空间的管理。图1从磁盘到文件系统对于上图,我们简单说明一下。最底层是硬件设备,这里以硬盘为例。硬盘驱动器和操作系统在硬盘抽象方面做得很好,它们将复杂的硬盘抽象成一个连续的线性空间。最后是文件系统,对线性空间进行管理和抽象,将层次结构呈现给用户。这里的层级结构是我们平时看到的目录、子目录、文件等元素的集合,如图2所示。图2文件系统实例上图可能无法清楚地理解文件系统的层级结构.我们对Linux操作系统中的文件系统进行了概述,如图3所示。从图中可以看出,文件系统中的数据是以树状结构呈现的。每个目录和子目录之间存在层次结构。图3树形结构的文件系统文件系统的数据管理文件系统的核心特性自然是数据管理。这里的数据管理包括两部分:对整个磁盘的数据管理和对文件的数据管理。磁盘的管理主要是将磁盘划分为不同的功能区。最简单的绘制方法是将磁盘分为元数据区和数据区。实际文件系统的处理比较复杂。以Ext2为例,它将磁盘空间划分为大小相等的块组,然后对每个块组进行管理。图4Ext2磁盘空间管理在一个块组中,最基本的信息包括数据位图、inode表位图、inode表和数据区。磁盘空间的管理实际上是通过位图来管理的,位图用来标记一段数据是否被使用过。当然,不同文件系统的管理略有不同,但原理大同小异。另一个重要的地方是文件数据的管理。对于普通用户来说,文件就是一个线性的数据空间,就像一个大数组。但是磁盘上可能没有那么多空间。因此,文件系统在管理文件时,会将文件切割成一定大小的逻辑块。这样,文件系统的做法就是在文件的逻辑块和磁盘的物理块之间建立对应关系。这样,当我们访问文件某个位置的数据时,就可以在磁盘上找到它了。经过上面的介绍,相信大家对文件系统有了一个大概的了解。如果想对文件系统的细节有更深入的了解,可以进一步阅读本期相关专栏。
