Linux支持多种文件系统,这些具体的文件系统并不是直接都挂载到系统中的,实际上是按需挂载的,这些文件系统只有挂载到系统中,VFS才能够真正管理起来,否则如果只是注册,不会产生任何文件系统实例。
文件系统挂载(安装)后,将会产生多个数据结构实例,挂载过程实际上就是构造这些数据结构实例的过程。Linux在文件系统的设计中,汲取了Unix的设计思想,抽象出四个基本数据结构:超级块(super_block),索引节点(inode),目录项(directory entry)和文件对象(file)
一、基本数据结构
超级块(super_block):存放系统中已挂载文件系统的有关信息,同一个文件系统如果被挂载多次,将会产生多份超级块实例
索引节点(inode,index node): 存放具体文件的一般信息,同时归集了文件的操作表,通过inode可以访问文件属性,操作具体文件
目录项(dentry,directory entry):文件目录树的组成部分,不管是目录还是普通的文件,都是一个目录项对象,目录项只有内存结构,它是文件树的缓存,通过目录项可以快速找到索引节点
文件(file):存放打开文件与进程之间进行交互的有关信息
数据结构 (fs.h、dcache.h) | 主要内容 | 结构说明 |
超级块(super_block) | 存放系统中已挂载文件系统的有关信息: 文件系统类型s_type 超级块方法:s_op 超级块链表指针:s_list 该类型的超级块列表指针:s_instance | 1)超级块用来描述整个文件系统的信息,每个具体的文件系统都有各自的超级块 2)超级块物理结构,一般是文件系统的第一个block 3)超级块是各种具体文件系统在安装时建立的,并在卸载时被自动删除 4)所有超级块对象以双向环形链表的形式链接在一起 5)与超级块关联的方法就是超级块操作表,这些操作是由数据结构super_operations来描述 |
索引节点(inode) | 索引节点对象存储了 文件的一般信息,代表了 存储设备上的一个实际的 物理文件: 编号i_ino 所属用户i_uid 用户组i_gid atime ctime mtime 对应的超级块i_sb 操作表i_op | 1)当一个文件首次被访问时,内核会组装相应的索引节点对象,以便向内核提供对一个文件进行操作时所必需的全部信息; 2)inode信息一部分存储在磁盘特定位置(存储结构),一部分是在加载时动态填充的,所以inode要占用存储空间(内存结构)。 |
目录项(dentry) | 文件目录树的组成部分,不管是目录还是普通的文件,都是一个目录项对象,便于索引节点的查找: 文件名d_name 父目录项d_parent 父目录的子项d_child 当前目录子目录d_subdirs 操作表d_op 对应的索引节点d_inode 对应的超级块:d_sb | 1)引入目录项的概念主要是出于方便查找文件的目的。 2)一个路径的各个组成部分,不管是目录还是普通的文件,都是一个目录项对象。 3)目录项没有对应的磁盘数据结构,所以不占用存储空间,VFS在遍历路径时,现场将它们逐个地解析成目录项对象,放到内存中管理。 |
文件(file) | 文件对象是已打开的文件在内存中的表示,主要用于 建立进程和磁盘上的文件的对应关系: 文件信息f_path包含两部分1)对应的文件系统vfsmount *mnt 2)对应的目录项dentry *dentry 操作表:f_op | 1)文件对象它由sys_open()现场创建,由sys_close()销毁。 2)文件对象和物理文件的关系有点像进程和程序的关系一样。 3)当我们站在用户空间来看待VFS,我们只需与文件对象打交道,而无须关心超级块,索引节点或目录项。 4)因为多个进程可以同时打开和操作同一个文件,所以同一个文件也可能存在多个对应的文件对象。 5)一个文件对应的文件对象可能不是惟一的,但是其对应的索引节点和目录项对象是惟一的。 |
二、完整结构关系图
链接:查看原图
参考资料:
《003 虚拟文件系统VFS基本数据结构》有3个想法