安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

深入剖析虚拟文件系统(VFS)

4月12日 藏于心投稿
  1。前言
  Linux采用VirtualFilesystem(VFS)的概念,通过内核在物理存储介质上的文件系统和用户之间建立起一个虚拟文件系统的软件抽象层,使得Linux能够支持目前绝大多数的文件系统,不论它是windows、unix还是其他一些系统的文件系统,都可以挂载在Linux上供用户使用。
  VFS,VirtualFileSystem虚拟文件系统,也称为虚拟文件系统开关(VirtualFilesystemSwitch),就是采用标准的Linux系统调用读写位于不同物理介质上的不同文件系统,即为各类文件系统提供了一个统一的操作界面和应用编程接口,VFS是一个内核软件层。
  VFS是一个可以让open、read、write等系统调用不用关心底层的存储介质和文件系统类型就可以工作的抽象层:
  2。VFS结构
  这里以Ext4文件系统示例
  VFS中包含着向物理文件系统转换的一系列数据结构,如VFS超级块(SuperBlock)、VFS的Inode、各种操作函数的转换入口等。Linux中VFS依靠四个主要的数据结构来描述其结构信息,分别为超级块、索引结点、目录项和文件对象,这些数据结构大都会与磁盘上的对应上。
  VFS对每种类型的对象都定义了一组必须实现的操作。这些类型的每一个对象都包含了一个指向函数表的指针。函数表列出了实际上实现特定对象的操作函数。
  超级块(SuperBlock):超级块对象表示一个文件系统。它存储一个已安装的文件系统的控制信息,包括文件系统名称(比如Ext2)、文件系统的大小和状态、块设备的引用和元数据信息(比如空闲列表等等)。超级块与磁盘上文件系统的超级块对应。
  所有超级块对象都以双向循环链表的形式链接在一起,对象的自旋锁(strongsblockstrong)保护链表免受多处理器系统上的同时访问。
  索引结点(Inode):索引结点对象存储文件的相关元数据信息,例如:文件大小、设备标识符、用户标识符、用户组标识符等等。strongInodestrong分为两种:一种是strongVFSstrong的strongInodestrong,一种是具体文件系统的strongInodestrong。前者在内存中,后者在磁盘中。所以每次其实是将磁盘中的strongInodestrong调进填充内存中的strongInodestrong,这样才算是使用了磁盘文件strongInodestrong。当创建一个文件的时候,就给文件分配了一个strongInodestrong。一个Inode只对应一个实际文件,一个文件也会只有一个strongInodestrong(UnixLinux系统中目录也是一种文件,打开目录实际上就是打开目录文件。目录文件的结构非常简单,就是一系列目录项(strongdirentstrong)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码)。
  从文件的角度来看,目录就是一个特殊的文件
  目录项(Dentry):引入目录项对象的概念主要是出于方便查找文件的目的。不同于前面的两个对象,目录项对象只存在于内存中,实际对应的是磁盘的目录stronginnodestrong对象。strongVFSstrong在查找的时候,根据一层一层的目录项找到对应的每个目录项的strongInodestrong,那么沿着目录项进行操作就可以找到最终的文件。
  文件对象(File):文件对象描述的是进程已经打开的文件。因为一个文件可以被多个进程打开,所以一个文件可以存在多个文件对象,但多个文件对象其对应的索引节点和目录项对象肯定是唯一的
  2。1SuperBlock
  SuperBlock表示特定加载的文件系统,用于描述和维护文件系统的状态,由VFS定义,但里面的数据根据具体的文件系统填充。每个SuperBlock代表了一个具体的磁盘分区,里面包含了当前磁盘分区的信息,如文件系统类型、剩余空间等。SuperBlock的一个重要成员是链表slist,包含所有修改过的INode,使用该链表很容易区分出来哪个文件被修改过,并配合内核线程将数据写回磁盘。SuperBlock的另一个重要成员是sop,定义了针对其INode的所有操作方法,例如标记、释放索引节点等一系列操作。https:elixir。bootlin。comlinuxv6。0sourceincludelinuxfs。hL1451结构体已删减
  strongstructstrongstrongsuperblockstrong{
  指向链表的指针
  设备标识符
  以字节为单位的块大小
  文件大小上限
  文件系统类型
  SuperBlock操作函数,writeinode、putinode等
  磁盘限额函数
  根目录
  }
  2。2DEntry和INode
  Linux文件系统会为每个文件都分配两个数据结构,目录项(DEntry,DirectoryEntry)和索引节点(INode,IndexNode)。
  DEntry用来保存文件路径和INode之间的映射,从而支持在文件系统中移动。DEntry由VFS维护,所有文件系统共享,不和具体的进程关联。dentry对象从根目录开始,每个dentry对象都会持有自己的子目录和文件,这样就形成了文件树。举例来说,如果要访问homeccsa。txt文件并对它操作,系统会解析文件路径,首先从根目录的strongdentrystrong对象开始访问,然后找到home目录,其次是ccs,最后找到a。txt的dentry结构体,该结构体里面dinode字段就对应着该文件。https:elixir。bootlin。comlinuxv6。0sourceincludelinuxdcache。hL81结构体已删减
  strongstructstrongstrongdentrystrong{
  父目录
  文件名称
  关联的inode
  父目录中的子目录和文件
  当前目录中的子目录和文件
  }
  每一个dentry对象都持有一个对应的inode对象,表示Linux中一个具体的目录项或文件。INode包含管理文件系统中的对象所需的所有元数据,以及可以在该文件对象上执行的操作。https:elixir。bootlin。comlinuxv6。0sourceincludelinuxfs。hL593结构体已删减
  strongstructstrongstronginodestrong{
  文件权限及类型
  userid
  groupid
  inode操作函数,如create,mkdir,lookup,rename等
  所属的SuperBlock
  文件大小
  文件最后访问时间
  文件最后修改时间
  文件元数据最后修改时间(包括文件名称)
  文件操作函数,open、write等
  文件系统的私有数据
  }
  虚拟文件系统维护了一个DEntryCache缓存,用来保存最近使用的DEntry,加速查询操作。当调用open函数打开一个文件时,内核会第一时间根据文件路径到DEntryCache里面寻找相应的DEntry,找到了就直接构造一个file对象并返回。如果该文件不在缓存中,那么VFS会根据找到的最近目录一级一级地向下加载,直到找到相应的文件。期间VFS会缓存所有被加载生成的dentry。
  INode存储的数据存放在磁盘上,由具体的文件系统进行组织,当需要访问一个INode时,会由文件系统从磁盘上加载相应的数据并构造INode。一个INode可能被多个DEntry所关联,即相当于为某一文件创建了多个文件路径(通常是为文件建立硬连接)。
  对于inode结构而言,可能有三种主要情况:
  存在内存中,未关联到任何文件,也不处于活动使用状态;
  存在内存中,正在由一个或多个进程使用,正在由一个或多个进程使用,通常表示一个文件。两个计数器(icount和inlink)的值都必须大于0。文件内容和inode元数据都与底层块设备上的信息相同。也就是表示从上一次与介质同步依赖,该inode没有改变过;
  处于活动使用状态。其数据内容已经改变,与存储介质上的内容不同。这种状态的inode被称作脏的。
  2。3fd与file
  每个进程都持有一个fd数组,数组里面存放的是指向file结构体的指针,同一进程的不同fd可以指向同一个file对象;
  file是内核中的数据结构,表示一个被进程打开的文件,和进程相关联。当应用程序调用open函数的时候,VFS就会创建相应的file对象。它会保存打开文件的状态,例如文件权限、路径、偏移量等等。https:elixir。bootlin。comlinuxv6。0sourceincludelinuxfs。hL940结构体已删减
  strongstructstrongstrongfilestrong{
  
  
  
  
  
  
  
  }
  https:elixir。bootlin。comlinuxv6。0sourceincludelinuxpath。hL8
  strongstructstrongstrongpathstrong{
  
  
  }
  3。抽象层VFS到实现层文件系统3。1挂载
  VFS可以管理各种文件系统,那么VFS和文件系统怎么关联的呢?给用户如何展示的呢?通过挂载。
  如下图所示,该系统根文件系统是Ext3文件系统,而在其mnt目录下面又分别挂载了Ext4文件系统和XFS文件系统。最后形成了一个由多个文件系统组成的文件系统树。
  挂载是在用户态发起的命令,也就是我们使用的mount命令,该命令执行的时候需要指定文件系统的类型(这里假设是Ext2)和文件系统数据的位置(也就是device)。通过这些关键信息,VFS就可以完成Ext2文件系统的初始化,并将其关联到当前已经存在的文件系统当中,也就是建立起上面所示的文件系统树。
  挂载的过程中,最重要的数据结构就是vfsmount,vfsmount代表的是一个挂载点。其次再是dentry和inode,这两个都是对文件的表示,且都会缓存在哈希表中以提高查找的效率。
  其中inode是对磁盘上文件的唯一表示,其中包含文件的元数据(管理数据)和文件数据等内容,但不含文件名称。而dentry则是为了Linux内核中查找文件方便虚拟出来的一个数据结构,其中包含文件名称、子目录(如果存在的话)和关联的inode等信息。
  dentry结构体最为关键,其维护了内核中的文件目录树。其中里面比较重要的几个结构体分别是dname、dhash和dsubdirs。其中dname代表一个路径节点的名称(文件夹名称)、dhash则用于构建哈希表,dsubdirs则是下级目录(或文件)的列表。这样,通过dentry就可以形成一个非常复杂的目录树。
  3。2文件处理流程
  文件处理流程包括两步:我们在访问一个文件之前首先要打开它(open)文件访问,然后进行文件的读写操作(read或者write)。
  我们知道,在用户态打开一个文件返回的是一个文件描述符,其实也就是一个整数值;同时,访问文件也是通过这个文件描述符进行的。那么操作系统是怎么通过这个整数值实现不同类型文件系统的访问呢?不同文件系统的差异其实就是inode中初始化的函数指针的差异。
  在Linux操作系统中,文件的打开必须要与进程(或者线程)关联,也就是说一个打开的文件必须隶属于某个进程。
  在linux内核当中一个进程通过taskstruct结构体描述,而打开的文件则用file结构体描述,打开文件的过程也就是对file结构体的初始化的过程。在打开文件的过程中会将inode部分关键信息填充到file中,特别是文件操作的函数指针。在taskstruct中保存着一个file类型的数组,而用户态的文件描述符其实就是数组的下标。这样通过文件描述符就可以很容易到找到file,然后通过其中的函数指针访问数据。
  我们以Ext2文件系统的写数据为例来看看文件处理流程和各个层级之间的关系,如下图。
  在调用用户态的写数据接口的时候,需要传入文件描述符。内核根据文件描述符找到file,然后调用函数接口(filefopwrite)文件磁盘数据。其中file结构体的fop指针就是在打开文件的时候通过inode初始化的。
  4。总结
  虚拟文件系统是操作系统中非常重要的一层抽象,其主要作用在于让上层的软件,能够用统一的方式,与底层不同的文件系统沟通。在操作系统与底层的各类文件系统之间,虚拟文件系统提供了标准的操作接口,让操作系统能够很快地支持新的文件系统。也因为VFS的支持,众多不同的实际文件系统才能在Linux中共存,跨文件系统的操作才能实现。
  附上一张各组件交互图吧
  参考资料:
  《深入理解Linux内核》第三版
  《Linux虚拟文件系统》
投诉 评论 转载

忘掉核酸检测烦心事去武汉珠峰打雪仗这几天以来,核酸检测的滥事几乎灌满了人的大脑,胡乱的封控及出现的民怨让人郁闷无比。街上关门闭户,人烟稀少,可是,在武汉珠穆朗玛峰上却是另一派景观!在那里,昨天积雪最厚10厘米!……官方回应格林汤普森球场灵异事件但奥斯曼黄色血液的后续呢?勇士和老鹰比赛中,格林和汤普森一记魔术般的传球,在网上疯传。从这个角度看,球好像消失了一样。格林诡异的传球不过,事情没过多久,NBA官方就公布了另一段视频,视频从另……4G比5G更加成熟?华为P60即将登场,第二代骁龙8加持最近中国信通院发布的《2022年11月国内手机市场运行分析报告》,2022年111月,国内市场手机总体出货量累计2。44亿部,同比下降23。2,其中,5G手机出货量1。91亿部……国家保护了我们三年这句话错在哪?最近网上经常看到这样的话:国家保护了我们三年,已经尽力了,我们要感恩。这本是一句告诫大家要感恩国家的话,却被很多网友喷。为什么?我想,首先,这句话有道德绑架的味道。感恩国……越南11个月出口3422亿美元,增13。4!广西房价有救了是老铁的,关注我的公号:虎三专栏!据越南媒体《河内时代》,今年111月,越南出口了3422亿美元,同比增长13。4。他们今年的目标是出口3680亿美元,考虑到还有12月一……都是人脸大屏视频锁,萤石极光Y3000FVS有何不同?2022年,人脸视频锁赛道火热,诸多有实力的选手频频加码。作为在视频锁领域有着优秀基因的萤石,在该赛道开辟了一条新产品系列极光,主打时尚风。该系列有Y3000F(人脸锁)……颜值和成绩哪个更重要?孩子健康但个子矮,有必要打生长激素吗现在的家长面对孩子,除了焦虑孩子的成绩,也开始焦虑孩子的个子,现在有不少地方出现了给孩子打生长激素的现象,面对孩子的成绩和个子,到底哪个更重要呢,有必要去打生长激素吗?实……如果让你成为另一个人你愿意吗?如果有人问你,你想成为什么样的人,你会怎么回答,是不是会说一些漂亮的话,成为谁谁谁?对于一个人来说,Z宝贵的是自己姑且假定你特别崇拜拿PL,想成为像他那样的盖世英雄……北京最大的湿地公园,比4个颐和园还大,不要门票却少有游客知道提到园林,或者说与它有关的那些城市旅游印象,可能大部分朋友都会想到苏州。是的,苏州是一座以江南古典园林而著称的城市。然而,在我国,除了江南地区以外,其实在其它地区和省市也散落和……2018年自驾黔东南湘西(十四)前往梵净山9月26日,早晨六点起来,外面下着淅沥沥的小雨。早晨从宾馆客房望去,远处的山峦被浓雾笼罩本想与妻子去江口县城体验当地的早餐美食,看来只能放弃了。早晨八点,到宾……雄安金湖未来城进入室内精装修阶段,预计明年6月交付北京日报客户端记者丰家卫通讯员杨晨炜杨欢假如你晚上乘飞机从雄安新区上空飞过,将看到雄安新区高速发展的美丽画卷由数千台塔吊和各种重型施工车辆夜间施工奋战组成的辉煌灯海。雄安……深入剖析虚拟文件系统(VFS)1。前言Linux采用VirtualFilesystem(VFS)的概念,通过内核在物理存储介质上的文件系统和用户之间建立起一个虚拟文件系统的软件抽象层,使得Linux能……
603升大冰箱不到2600元?内卷时代囤货好实惠Win11几个设置小技巧,让你的电脑更加好用女人怀孕有多难?只有经历过的人才能感同身受,妈妈们辛苦了5位古代名人养生秘诀各5种妙招,值得收藏瞄准RCEP机遇广西打造面向东盟先进铝制造业中心赵睿回归时间曝光,林书豪被弃用满脸沮丧,郭艾伦MVP排名仅1姚明为什么没有获得名人堂提名传统节日推动本地消费七夕主题商品销量猛涨油价调整时间确定,又下调,今天7月23日全国92号95号汽油50岁后是血管的堵塞期,若想血管通透,3个不良习惯需戒掉1000元人民币兑换越南盾330万,到越南能做什么?越南美女国行iPhone13ProMax256GB监管机只要6500

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利