SDcardFS文件系统浅析(二) - inode、dentry、super_block

SDcardFS文件系统浅析(二) - inode、dentry、super_block

在开始之前,首先得理解文件系统中inode、dentry、super_block的含义,下面简单介绍下这三个结构的作用,但不做代码层面分析,有个大概认知即可,如果详细了解,可以Google或者百度

  • inode

    inode索引节点,操作系统读取硬盘的时候,不会一个个扇区地读取,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 扇区组成一个 block。文件数据存储在block中,要怎么去查找文件数据呢?

    这样就引入的索引节点(inode),就和书的目录一样,它存储在磁盘的另外一个位置(inode区),用来指引正在的的数据存储位置。除了指引数据存储位置外,索引节点肯定还需要存储指向这个文件的一些信息供上层使用,如文件的大小、创建时间、文件的块大小、文件权限等。

    inode可以通过stat filename查看,通过stat也可以看到文件的其他信息,如权限、uid、gid等
    可以通过df -i 查看磁盘分区的inode总数和已使用数量
    这里写图片描述

​ 每个文件和目录都有自己的inode,且每个inode不同,如果inode相同就代表为同一个文件或者目录。而 文件名仅仅只是方便用户的使用,对于底层文件系统来说,都是通过inode存储文件的元信息,如文件的大小、创建时间、文件的块大小等

  • dentry

    dentry目录项缓存,是一个存放在内存里的缩略版的磁盘文件系统目录树结构,他是directory entry的缩写。其在文件系统中存在重要作用,假设不存在dentry这个数据结构

    假设我要打开/usr/bin/vim 文件,

    1. 首先需要去/所在的inode找到/的数据块,从/的数据块中读取到usr这个条目的inode
    2. 跳转到user 对应的inode,根据/usr inode 指向的数据块,读取到/usr 目录的内容,从中读取到bin这个条目的inode
    3. 跳转到/usr/bin/对应的inode,根据/usr/bin/指向的数据块,从中读取到/usr/bin/目录的内容,从里面找到vim的inode

    Linux提供了page cache页高速缓存,很多文件的内容已经缓存在内存里,如果没有dentry,文件名无法快速地关联到inode,即使文件的内容已经缓存在页高速缓存,但是每一次不得不重复地从磁盘上找出来文件名到VFS inode的关联

  • dentry和inode二者关系

    inode是内核文件对象的元数据。inode仅仅只是保存了文件对象的属性信息,包括:权限、属组、数据块的位置、时间戳等信息。但是并没有包含文件名,文件在文件系统的目录树中所处的位置信息。数据结构相对稳定,其中没有数据和文件名等变长数据,可以固定其大小,进而可以实现将整个文件系统中的inode按照一定的组织方式来集中存储在硬盘起始的一个,文件系统加载时,可以方便查找即可。

    目录项(dentry)在内核中起到了连接不同的文件对象inode的作用,进而起到了维护文件系统目录树的作用。dentry是一个纯粹的内存结构,由文件系统在提供文件访问的过程中在内存中直接建立。dentry中包含了文件名,文件的inode号等信息。

    在读取一个文件时,总是从根目录开始读取,每一个目录或者文件,在VFS中,都是一个文件对象,每一个文件对象都有唯一的一个inode与之对应。根目录的inode号为0,在superblock里,可以很快根据inode号索引到具体的inode,因此读取到的第一个inode就是根目录的。读取到了该目录后,内核对象会为该文件对象建立一个dentry,并将其缓存起来,方便下一次读取时直接从内存中取。

    而目录本身也是一个文件,目录文件的内容即是该目录下的文件的名字与inode号,目录文件的内容就像一张表,记录的文件名与其inode no.之间的映射关系。根据路径即可找到当前需要读取的下一级文件的名字和inode,同时继续为该文件建立dentry,dentry结构是一种含有指向父节点和子节点指针的双向结构,多个这样的双向结构构成一个内存里面的树状结构,也就是文件系统的目录结构在内存中的缓存了。有了这个缓存,我们在访问文件系统时,通常都非常快捷

    总而言之,Dentry 是将 Inode 和 文件联系在一起的”粘合剂”,它将 Inode number 和文件名联系起来。Dentry 也在目录缓存中扮演了一定的角色,它缓存最常使用的文件以便于更快速的访问。Dentry还保存了目录及其子对象的关系,用于文件系统的遍历。

  • super_block

    super_block超级块,其代表文件系统本身,会记录整个文件系统的整体信息,包括inode和block总量、使用情况、剩余量等。文件系统的所有inode也都要链接到超级块的链表头。Superblock 对于文件系统来说是非常关键的,因此对于每个文件系统它都冗余存储了多份。例如,如果 /var 分区的 Superblock 损坏了,那么 /var 分区将无法挂载。在这时候,一般会执行 fsck 来自动选择一份 Superblock 备份来替换损坏的 Superblock,并尝试修复文件系统。

参考:

VFS中的file,dentry和inode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值