Linux中VFS 虚拟文件系统

文件系统
Linux支持多种文件系统
ext2:Linux基本文件系统
ext3:ext2的增强版本
ext4:ext文件系统的第四个版本 这三个是磁盘类型 还有xfs
swap:交换文件系统
nfs:网络文件系统,适合Linux或UNIX机器间共享
smbfs:适合Linux或UNIX和windows季期间共享
vfat:windows早期文件系统
ntfs:windows默认文件系统,功能非常强大
ISO9660:cd光盘的只读文件系统
GFS:Google专用存储海量搜索数据而设计的专用文件系统
reiserfs:早期Linux使用的日志功能的文件系统
Linux内核采用虚拟文件系统层(VFS),通过该中间层对各类文件系统提供了完美的支持。对于用户来说,这些文件系统几乎是透明的,用户不需要关心底层文件系统的具体实现

VFS 基本结构

super  block
dentry
inode
data

Super block 超级块
存储文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式。文件系统中第一个块被称为超级块
将物理相邻的若干个扇区称为一个块。操作系统读写磁盘的基本单位是扇区,而文件系统的基本单位是块。块越大存储性能越好,但空间浪费严重。块越小性能相对越低,但空间利用率高
inode 索引节点
保存的其实是实际的数据(文件内容)的一些信息,这些信息称为“元数据”(也就是对文件属性的描述),例如文件大小,文件拥有者(owner),文件属组(group),文件权限,文件读取或修改的时间戳,链接数量。同时记录此文件的数据所在的block号码(数据块),文件类型等等
注意:数据分成:元数据+数据本身
每个inode节点的大小,一般是128字节或256字节。inode节点的总数在格式化就给定,一般每2kb就设置一个inode一般文件很少有文件小于2kb的所以预订按照2kb分,一般inode是用不完的
inode号是唯一的,表示不同的文件。其实Linux内核访问文件都是通过inode号来进行的,所谓文件名仅仅是inode号的别名,方便用户识别和使用的。当我们打开一个文件的时候,首先,系统找到这个文件名对应的inode号;然后,通过inode号,在inode table中找到inode信息,最后在inode信息中找到文件数据所在的block,接着就可以处理文件数据了。
当创建一个文件(包括目录)的时候,就给文件分配了一个inode。inodes最大数量就是文件的最大数量。

dentry 目录项
目录项是描述文件的逻辑属性,只存在于内存中,并没有实际对应的磁盘上的描述,更确切的说是存在于内存的目录项缓存,为了提高查找性能而设计。注意不管是目录还是最终的文件,都是属于目录项,所有的目录项在一起构成一颗庞大的目录树。例如:打开一个文件/opt/data/a.txt,那么/、opt、data、a.txt都是一个目录项,VFS在查找的时候,根据一层一层的目录项找到对应的每个目录项的inode,那么沿着目录项进行操作就可以找到最终的文件。
注意:目录也是一种文件(所以也存在对应的inode)。打开目录,实际上就是打开目录文件。
data 数据
记录文件的实际内容,若文件太大时,会占用多个 block
下图为一个文件系统存取文件的大体流程
Linux中VFS 虚拟文件系统