【Linux 内核】文件系统(进阶篇)

前面相继介绍文件系统的概念以及Linux内核中与文件系统相关的数据结构及文件系统内部大致关联以及虚拟文件系统,这里我们进一步剖析我们应用操作时是如何与文件系统挂钩的。

上一篇最后有说道,要访问一个文件就得先访问一个目录,才能根据文件名从目录中找到该文件的目录项,进而找到其inode节点。这里我们以绝对路径访问方式来具体看看其流程是如何的:

假如根据绝对路径寻找文件/tem/temp/wenqian的:

1、首先找到根文件系统的根目录文件“/”的dentry和inode(通过dentry找到对应的inode);
2、通过这个inode提供的操作接口i_op->lookup(),找到下一层节点“tmp”的dentry,以及进一步找到对应的inode;inode提供的操作接口,参见inode_operations数据结构,类似于file_operations数据结构,是一个函数操作集;
3、同理,由“tmp”的inode找到“temp”的dentry和inode;
4、最后由“temp”的inode找到“wenqian”的dentry和inode,这样就找到了我们的目标文件。

可以看到,整个寻找过程是一个递归的过程。

此外,回顾到前面的硬链接和软链接,我们的目标都是先找到inode,然后再去找下一层,所以对于硬链接和软链接来说,查找是一样的,但是链接的存在有时会导致无限递归的过程(直观的理解,Windows下的快捷方式,一个目录下面就一个文件,且这个文件恰恰是这个目录的快捷方式,你点一万年都在这里转圈)。
在这个问题上,有招,就是在inode中的有个变量,设置了最长递归的次数,换言之,要是查找文件时发现路径过长,就会认为出现了无限递归。

ok,再来看点刺激的:
这里写图片描述
看得懂上面这个图的内在联系,你就算了解个基础了…
上图有三个进程打开了三个文件(进程1和进程2 是打开同一个文件),open文件之后会返回文件描述符,可以通过这个文件描述符在fd_array 指针数组中定位到对应的file结构体。(task_struct->files_struct->fd_array->file)
file结构体中则记录了文件的对应信息,比如标识,文件权限,引用计数,dentry等等,进程1和进程2 是打开同一个文件,文件名是一样的,自然其file中的目录项dentry是指向dentry cache中的同一个地方,自然也就是指向同一个inode节点了。
我们来看看进程3,它打开的是文件b,文件名不一样,所以file中的dentry指向的是dentry cache中的b,但是有趣的事这个dentry中的inode指向了与a文件一样的inode节点,为啥?因为b是a的一个硬链接。
还可以看到inode结构体中有一个指向super_block结构体的指针,super_block结构体保存着从磁盘分区的超级块读上来的信息,例如文件系统类型、块大小,super_block结构体的s_root成员是一个指向dentry的指针,表示这个文件系统的根目录被mount到哪里。上面这个图就是mount到了“/home”目录下(也可以看到这个用户是akaedu)。
(关于super_block数据结构的源码就在include/linux/fs.h中)

file、dentry、inode、super_block这几个结构体组成了VFS的核心概念。

ok,我们来看看存储设备分区:
文件系统的最终目的是把大量数据有组织的放入持久性的存储设备中,比如硬盘和磁盘。
这里写图片描述
一个典型的Linux分区包含上面各个部分(图片来源于《The Linux Programming Interface》)
分区的第一部分是启动区(Boot block),它主要是为计算机开机服务的。Linux开机启动后,会首先载入MBR,随后MBR从某个硬盘的启动区加载程序,该程序负责进一步操作系统的加载和启动。
(安装双系统后,如果要卸载Linux,可不是简单的格式化Linux所在分区(盘),而是首先要修复下MBR,不然删除Linux然后启动后是进入不了系统的,因为MBR引导的操作系统(Linux)加载程序找不到对应的Linux系统(如果你是默认进去Linux操作系统),所以会提示MBR出错,到时候就需要进入Windows PE下,手动修复MBR了)。
为了方便管理,即使某个分区中没有安装操作系统,Linux也会在该分区预留启动区。

启动区之后的是超级块区(Super block),它存储文件系统的相关信息,包括文件系统的类型,inode数目,数据块的数目,实际上inode的数目是有限的,如果你哪天新建文件失败,极有可能就是inode节点不够用了。
随后是inode table,是实现文件存储的关键,inode节点是个非常重要的节点,里面包含了打开文件的各种信息,比如最近修改、打开时间、属主以及指向具体数据存储位置的数据块指针。
在后面就是实际数据存储的地方数据块(Data block)了,这块区域也是存储设备最大的一部分。

文件数据除了文件实际内容外,通常含有非常多的属性,文件系统会将这两部分的数据分别存放在不同的区块,权限与属性放置在inode中,至于实际数据则放置到 data block 区块中,另外还有一个超级块super block 会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。

1、super block:记录此文件系统的整体信息,包括inode、block的总量、使用量、剩余量、以及文件系统的格式与相关信息等;
2、inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;所以查找文件实际就是dentry->inode->data block;
3、data block:实际记录文件的内容,若文件太大时,会占用多个block。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值