通用文件模型

通常一个完整的 Linux 系统由数千到数百万个文件组成,文件中存储了程序、数据和各种信息。层次化的目录结构用于对文件进行编排和分组

在这里插入图片描述

ReiserFS(新型的文件系统)–>Reiser4
它通过一种与众不同的方式—完全平衡树结构来容纳数据,包括文件数据、文件名、日志支持。它还可以支持少量磁盘和磁盘阵列,并能在上面继续保持很快的搜索速度和很高的效率。
特点:先进的日志机制。日志机制保证了在每个实际数据修改之前,相应的日志已经写入硬盘,文件与数据的安全性有了很大提高。高效的磁盘空间利用、独特的搜寻方式、支持海量磁盘、优异的性能、搜寻方式、空间分配和利用情况。

Ext4–>Linux系统下的日志式文件系统,Ext3应用广泛
更大的文件系统和更大的文件( Ext3 文件系统最多只能支持 32TB 文件系统和 2TB 文件,实际要比容量少很多,文件系统 2TB 和 16GB 文件。Ext4 文件系统容量达到 1EB,文件容量则达到 16TB。);更多的子目录数量;更多的块和 i-节点数(Ext3 文件系统使用 32 位空间,Ext4 文件系统扩充到 64 位);多块分配;持久性预分配;延迟分配;盘区结构;新的i节点结构;日志检验功能;在线碎片整理。

XFS–>高性能的日志文件系统:XFS极具伸缩性、非常健壮
数据完全性、可扩展性(最大支持文件大小为 9exabytes,最大文件系统尺寸为 18exabytes)、传输特性、传输带宽(单个文件系统测试,吞吐量最高达7GB每秒,对意念文件读写操作吞吐量可达4GB每秒)内核支持40多种文件系统,MS-DOS 的 FAT 文件系统,UFS(berkeley UNIX)、网络文件系统(coda 和 NFS)和虚拟文件系统(如 proc)

文件系统类型一般可以分为3种:
(1)基于磁盘的文件系统( Disk-based Filesystem);
(2)虚拟文件系统( Virtual Filesystem);
(3)网络文件系统( Network Filesystem);

在这里插入图片描述

Linux 内核文件系统最重要的数据结构为 inode,一个inode就代表一个文件,inode结构体保存文件的大小,文件的块大小、创建时间等各种参数。一个文件(和目录)的inode只有唯一一个。
在这里插入图片描述

在 linux 系统中有种文件是链接文件,可以为解决文件的共享使用。
链接分为两种:一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link)。
硬连接】相当于给一个文件取了多个名称,多个文件名称对应同一个索引节点,索引节点的成员i_nlink是硬链接计数。
软链接】这种文件的数据是另一个文件的路径,软链接可对文件或目录创建。软连接是一个独立的文件所以有独立的 inode

VFS结构

在VFS接口实现当中,涉及大量的数据结构。VFS结构由两个部分组成:文件和文件系统,这些都需要管理和抽象。

inode是 Linux 内核选择用于表示文件内容和相关元数据的方法。
在抽象对底层文件系统的访问时,并未使用固定的函数,而是使用了函数指针。这函数指针保存在两个结构中,包括了所有相关的函数。
(1) inode操作:创建链接、文件重命名、在目录中生成新文件、删除文件。
(2) 文件操作:作用于文件的数据内容。它们包含一些显然的操作(如读和写),还包括如设置文件位置指针和创建内存映射之类的操作。

文件系统和超级块信息

VFS支持的文件系统类型通过一种特殊的内核对象连接进来,该对象提供了一种读取超级块的方法。除了文件系统的关键信息(块长度、最大文件长度,等等)之外,超级块还包含了读、写、操作inode的函数指针。
内核还建立了一个链表,包含所有活动文件系统的超级块实例。之所以使用活动(active)这个术语替代已装载(mounted),是因为在某些环境中,有可能使用一个超级块对应几个装载点。

打开的文件总是分配到系统中一个特定的进程,内核必须在数据结构中存储文件和进程之间的关联。
各个文件系统实现也能在 VFS inode 中存储自身的数据(不通过VFS层操作)。尽管每个文件系统在file_system_type中只出现一次,但所有超级块实例的链表中,可能有几个同一文件系统类型的超级块实例,因为在各个块设备/分区上可能存储了同一类型的几个文件系统。

Linux 将磁盘块分为三个部分:
1)超级块,文件系统中第一个块被称为超级块。这个块存放文件系统本身的结构信息。比如,超级块记录了每个区域的大小,超级块也存放未被使用的磁盘块的信息。
2) i-节点表,超级块的下一个部分就是i-节点表,每个文件都有一些属性,如文件的大小、文件所有者、和创建时间等,这些性质被记录在一个称为 i-节点 的结构中。所有 i-节点 都有相同的大小,并且 i-节点表 是这些结构的一个列表,文件系统中每个文件在该表中都有一个i-节点
3)数据区,文件系统的第3个部分是数据区。文件的内容保存在这个区域。磁盘上所有块的大小都一样。如果文件包含了超过一个块的内容,则文件内容会存放在多个磁盘块中。一个较大的文件很容易分布上千个独立的磁盘块中。
https://blog.csdn.net/ds1130071727/article/details/89409426

VFS 的 inode 结构
在这里插入图片描述

inode 操作:
内核提供了大量函数,对inode进行操作。为此定义了一个函数指针的集合,以抽象这些操作,因为实际数据是通过具体文件系统的实现操作的。调用接口总是保持不变,但实际工作是由特定于实现的函数完成的。
在这里插入图片描述
inode 结构有两个指针(i_opi_fop),指向实现上述抽象的数组。inode 结构和 file 结构包括一个指向file_operations结构的指针。file_operations用于操作文件中包含数据,inode_operations负责管理结构性的操作(删除一个文件)和文件相关的元数据(属性等)。

文件操作:
在这里插入图片描述

目录项缓存

由于块设备速度较慢,可能需要很长时间才能找到与一个文件名关联的inode。即使设备数据已经在页缓存。Linux使用 目录项缓存(简称dentry 缓存) 来快速访问此前的查找操作的结果。该缓存围绕着struct dentry建立。
在 VFS 连同文件系统实现读取的一个目录项(目录或文件) 的数据之后,则创建一个 dentry 实例,以缓存找到的数据。

在这里插入图片描述

dentry 结构不仅使得易于处理文件系统,对提高系统性能也很关键。dentry 对象在内存中的组织,涉及下面两个部分。
(1) 一个散列表( dentry_hashtable)包含了所有的dentry对象。
(2) 一个LRU(最近最少使用, least recently used)链表,其中不再使用的对象将授
予一个最后宽限期,宽限期过后才从内存移除。

dentry 操作
dentry_operations结构保存了一些指向各种特定于文件系统可以对dentry对象执行的操作的函数指针。该结构定义如下:
在这里插入图片描述

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部