linux的虚拟文件系统一(框架)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16777851/article/details/82914484

1.什么是文件系统

文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念  代替了硬盘和光盘等物理设备是使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件即可。

Linux 中允许众多不同的文件系统共存,如 ext2,ext3,vfat ,nfs等。通过使用同一套文件 I/O 系统 调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,对文件的 操作可以跨文件系统而执行。如下图所示,我们可以使用 cp 命令从 vfat 文件系统格式的硬盘拷贝数据到 ext3 文件系统格式的硬盘;而这样的操作涉及到两个不同的文件系统。

 跨文件系统的文件操作

图片示例_跨文件系统的文件操作

“一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、 套接字等在 Unix/Linux 中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作界面。

一切皆是文件

图片示例_一切皆是文件

2..磁盘分区与目录

       所有磁盘分区都必须被挂载到目录上才能使用。所谓的"挂载"就是利用一个目录当成进入点,将磁盘分区的数据放置在该目录下;也就是说,进入该目录就可以读取该分区的意思。这个操作我们称为"挂载",那个进入点的目录我们称为"挂载点"。由于整个Linux系统最重要的是根目录,因此根目录一定需要挂载到某个分区的。至于其他的目录则可依用户自己的需求来给予挂载到不同的分区。

http://dl2.iteye.com/upload/attachment/0035/1568/df42b0ed-056f-3a09-a035-13aecd84c002.jpg

上图中,假设我的硬盘分为三个区,分区1被挂载到根目录,分区2被挂载到/home这个目录,分区3被同时挂载在/var和/tmp目录上,也就是说,通过/home,我们可以访问到分区2的数据。同理,分区3的数据,我们可以通过/var和/tmp访问到。而分区1里的数据,我们则可以通过/及其以下的目录访问到。所以,所有磁盘分区都必须被挂载后才可以使用,否则系统会不知道这个分区的存在。每个分区可以包含一个文件系统。一个分区只有建立了文件系统(即分区的格式化)后,才可以使用。

3.虚拟文件系统的作用

而虚拟文件系统正是实现上述两点 Linux 特性的关键所在。虚拟文件系统(Virtual File System, 简称 VFS), 是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个 抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。

为了能够支持各种实际文件系统,VFS 定义了所有文件系统都支持的基本的、概念上的接口和数据 结构;同时实际文件系统也提供 VFS 所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式 上与VFS的定义保持一致。换句话说,一个实际的文件系统想要被 Linux 支持,就必须提供一个符合VFS标准 的接口,才能与 VFS 协同工作。实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS 层和内核的其他部分看来,所有文件系统都是相同的。下图显示了VFS在内核中与实际的文件系统的协同关系。

VFS在内核中与其他的内核模块的协同关系

图片示例_VFS在内核中与其他的内核模块的协同关系

我们已经知道,正是由于在内核中引入了VFS,跨文件系统的文件操作才能实现,“一切皆是文件” 的口号才能承诺。而为什么引入了VFS,就能实现这两个特性呢?在接下来,我们将以这样的一个思路来切入 文章的正题:我们将先简要介绍下用以描述VFS模型的一些数据结构,总结出这些数据结构相互间的关系;然后 选择两个具有代表性的文件I/O操作sys_open()和sys_read()来详细说明内核是如何借助VFS和具体的文件系统打 交道以实现跨文件系统的文件操作和承诺“一切皆是文件”的口号。

猜你喜欢

转载自blog.csdn.net/qq_16777851/article/details/82914484
今日推荐