1.1.2 操作系统层面的文件系统
上文从普通用户的角度介绍了文件系统。其目的是为用户提供一个方便管理文件(数据)的方式。而从操作系统角度来说,文件系统则主要实现对硬件资源的管理,也就是对磁盘资源的管理。
任何技术的出现都是为了解决问题,文件系统也是为了解决某些问题。那么文件系统是为了解决什么问题呢?
文件系统解决的是对磁盘空间使用的问题。通常一台计算机配置一个磁盘,而磁盘的空间就是一个线性空间,就好比一个非常大的数组。然而在一个操作系统上会运行很多软件,如视频软件、浏览器、音频软件和文本编辑软件等。这些软件通常都要使用磁盘空间。如果这些软件都直接使用磁盘空间则会有如下很多问题。
(1)磁盘空间的访问会存在冲突。由于没有软件统一管理磁盘空间,各个软件各自为政,那么在访问磁盘空间时就有可能存在冲突的情况。
(2)磁盘空间的管理会非常复杂。由于各种不同格式的文件,以及不同大小的文件,没有文件系统将导致磁盘空间很难管理。
在计算机领域中有一个非常有用的定律,任何复杂的问题都可以通过分层来解决。文件系统就是这样一种思路。操作系统实现了文件系统,而文件系统是应用程序与磁盘驱动程序之间的一层软件。
文件系统对下实现了对磁盘空间的管理,对上为用户(应用程序)呈现层级数据组织形式和统一的访问接口。
基于文件系统,用户(应用程序)只需要创建、删除或读取文件即可,他们并不需要关注磁盘空间的细节,所有磁盘空间管理相关的动作则由文件系统来处理。文件系统所处的位置如图1-13所示。
图1-13 文件系统所处的位置
其实文件系统不仅可以构建在磁盘上,它还可以构建在任何块设备上,甚至网络上。在Linux中,最常见的块设备包括裸磁盘、分区、LVM卷和RAID等。我们可以对上述任何块设备进行格式化,构建文件系统。Windows中的文件系统也是可以构建在其卷组上的。
文件系统不仅仅可以构建在块设备上,甚至可以构建在一个普通的文件上。磁盘是一个线性空间,而文件也是一个线性空间。因此,在一个文件上构建文件系统是没有任何问题的。这也是我们在后面学习文件系统用到的一个便捷方法。
下面先简单看一下如何在一个文件上构建文件系统。首先要有一个内容全为0的文件。生成方法如下:
执行命令后,查看一下当前目录,可以看到生成了一个容量为1.0MB的新文件,如图1-14所示。
图1-14 生成的新文件信息
然后对该文件进行格式化。例如,构建一个Ext2文件系统,并对该文件系统进行格式化,具体方法及结果如图1-15所示。
图1-15 Ext2文件系统的格式化
从执行命令的结果可以看出,Ext2文件系统已经完成格式化。如何验证一下呢?一个简单的方法是使用dumpe2fs命令,该命令可以获取文件系统的描述信息。另外一个复杂的方法是借助Linux的循环设备(回环设备)。通过该循环设备可以将一个文件虚拟成块设备,然后将该块设备挂载到目录树中。具体需要执行的命令如下:
执行完成上述命令后,如果没有出现错误,且可以看到如图1-16所示的目录内容,则说明Ext2文件系统格式化成功。当然,为了进一步的验证,可以向该目录拷贝文件。
图1-16 Ext2文件系统挂载后的目录
综上所述,文件系统实现了对线性存储空间的管理,这里的线性存储空间既可以是磁盘等块设备,还可以是一个文件。