VFS虚拟文件系统

VFS虚拟文件系统及引申

一、虚拟文件系统(VFS)是什么?

虚拟文件系统(VFS)作为内核的子系统,为用户空间程序提供了文件和文件系统的相关接口。总的来说,其作用就是提供一套标准化的通用接口给上层使用,而下层可以是不同的文件系统,VFS可以看作是一个抽象的中间层。

VFS抽象层之所以能够衔接各种各样的文件系统,是因为它定义了所有文件系统都支持的、基本的、概念上的接口和数据结构。同时,实际的文件系统也将自身的操作在形式上与VFS的定义保持一致。通俗点说就是VFS提供基本的接口和数据结构,实际文件系统去实现具体的细节

VFS为不同设备或文件系统间的访问提供了媒介,用户读写文件,对用户来说是不用关心底层是否跨越文件系统和设备的,具体都通过VFS抽象层实现对不同文件系统的读写操作。

VFS为了提供对不同底层文件系统的统一接口,需要有一个高度的抽象和建模,这就是VFS的核心设计——统一文件模型。目前的Linux系统的VFS都是源于Unix家族,因此这里所说的VFS对所有Unix家族的系统都适用。

二、VFS的四种对象

VFS采用面向对象的设计思路,使用一组数据结构来表示通用的文件对象。这些数据结构类似于对象(因为使用c语言实现,但是c语言中没有对象这个概念,因此用结构体表示),其中包含了数据以及操作这些数据的函数指针,而这些操作函数由具体的文件系统实现

Unix家族的VFS的文件模型定义了四种对象,这四种对象构建起了统一文件模型。

1.超级块对象,代表一个具体的已安装文件系统

该对象用于存储特定文件系统的控制信息。各种文件系统都必须实现超级块对象。在文件系统安装时,文件系统会调用相关函数从磁盘中读取超级块信息,并将其填充到内存的超级块对象中。

2.索引节点对象,具体的文件

包括了文件或目录的全部信息。如果实际的文件系统中没有索引节点这一概念(例如有些文件系统将文件信息和文件内容放在一起),文件系统也必须从中提供这些信息初始化到内存中的索引节点来供VFS使用。

一个索引节点代表文件系统中的一个文件,索引节点只有当文件被访问是才会在内存中被创建。

3.目录项对象,路径的组成部分

VFS把目录也当作文件对待,但是VFS经常需要执行目录相关的操作,为了方便,引入了目录项的概念。在路径中,每一个部分都是目录项对象,VFS在执行目录操作时,会现场创建目录项对象。

4.文件对象,由进程打开的文件

文件对象是已打开文件在内存中的表示,由系统调用open创建,close系统调用撤销。文件对象中包含了访问文件时的一些信息,例如,文件的访问模式、当前的偏移等。

  • 和文件系统相关的数据结构

file_systerm_type

用来描述特定的文件系统类型,因为Linux支持众多文件系统,因此内核必须由一个特殊的结构来描述每种文件系统的功能和行为(也就是说,每种文件系统都必须实现该结构)。

vfsmount

当文件系统被安装时,会有一个vfsmount结构体在安装点被创建。该结构体用来代表文件系统的安装点。

  • 和进程相关的数据结构

系统中每个进程都有自己的一组打开的文件,像根文件系统、当前工作目录、安装点等。有三个数据结构将VFS层和系统的进程紧密联系在一起。它们分别是:file_struct、fs_struct和namespace结构体。

file_struct

由进程描述符中的files字段指向,所有与单个进程相关的文件信息(打开的文件以及文件描述符)都包含在其中。

fs_struct

该结构体由进程描述符的fs域指向,它包含当前进程的工作目录和根目录。

mmt_namespace

该它使得每一个进程在系统中都看到唯一安装的文件系统(不仅是唯一的根目录,而且是唯一的文件系统层次结构)。

  • 索引节点(inode)

   文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

inode包含文件的元信息,具体来说有以下内容:

1. 文件的字节数

2. 文件拥有者的User ID 属主

3. 文件的Group ID 属组

4. 文件的读、写、执行权限

5. 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

6. 链接数,即有多少文件名指向这个inode

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block(块),读出数据。

通过使用ls -i命令,可以看到文件名对应的inode号码

  • 连接

一般情况下,文件名和inode号码是”一一对应”关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为”硬链接”(hard link)。

ln命令可以创建硬链接:

ln 源文件 目标文件

运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做”链接数”,记录指向该inode的文件名总数,这时就会增加1。

反过来,删除一个文件名,就会使得inode节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

  • 软连接

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的”软链接”(soft link)或者”符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:”No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此发生变化。

ln -s命令可以创建软链接。

ln -s 源文文件或目录 目标文件或目录

  • 文件系统如何操纵文件

文件系统在操作系统中负责管理文件的存储和访问,它提供了一种组织和存储数据的方式,以便用户和程序可以方便地访问和操作文件。

在Linux中,文件系统操纵文件的原理涉及到以下几个方面:

1.存储结构:文件系统负责将文件以一定的方式存储在磁盘或其他存储介质上,通常会将文件分成若干块(block)并存储在物理介质上。文件系统会记录每个文件的存储位置和相关属性信息,如文件大小、权限等。

2.文件访问:文件系统提供了一套接口,使得用户和程序可以通过文件路径来访问文件,读取和写入文件的内容。文件系统负责管理文件的读写操作,确保文件内容在存储介质上的完整性和一致性。

3.文件操作:文件系统提供了一系列操作文件的接口,如创建、复制、移动、删除等操作,通过这些接口用户和程序可以对文件进行各种操作。

4.权限管理:文件系统还负责管理文件的访问权限,包括用户和组的权限设置,确保只有具有足够权限的用户才能对文件进行操作。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值