本篇博主将带大家深入底层探秘系统是如何与磁盘进行相互交流的,配合精美配图,细节讲解来带大家深入探究(注:本篇文章建议了解磁盘内部物理结果组成及设计再进行阅读)。
欢迎拜访:羑悻的小杀马特.-CSDN博客本篇主题:秒懂系统磁盘交互
制作日期:2025.01.18
隶属专栏:linux之旅
目录
一·磁盘内部的划分:
首先就先默认我们都已经学习了解了磁盘物理结构和设计,那么下面磁盘是分成这样,请看图:
首先是分区:我们最小单位是扇面,其次可以比它大来分区如: c d盘:。
然后就是我们的分组。
下面分讲一下每个组含有的都是啥意思:
1.1superblock:
存放文件系统本身的结构信息,描述整个分区的文件系统信息。记录的信息主要有: bolck和inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等他文件系统的相关信息
说白了就是储存着每一个分区的一些信息,对分区很重要,因此需要多个备份放在当下分区的不同组块中(防止被删除)
1.2GDT:
对块组的介绍以及记录块组内其他部分有啥分布等
1.3block bitmap:
每个bit表⽰⼀个inode是否空闲可⽤。
1.4inode bitmap:
判断块占用情况,方便到时候知道哪个文件被删除了,还是要创建哪里的文件 。
1.5inode table:
存放⽂件属性如⽂件⼤⼩,所有者,最近修改时间等,当前分组所有Inode属性的集合。
多个结构体的集合;
里面存放着不仅仅是inode及一些其他属性还有inode对应的块(可以同组也可以不同组,后面讲)
每个结构体的大小都是相等的都是128字节;又因为这个集合大小是4kb故我们可以得出最多可以放32个inode结构体。
这里我们再阐述一个事实:
inode和block都可以跨组但是不能跨分区:
即同一个分区内部inode和块编号都是唯一的。
下面我们来解释一下:
就是我们的inode和块的编号可以从组之间是连续的;但是分区和分区之间不能连续每个分区开始的编号都是0。
其实inode结构体有一个记录它所对应的块的类似数组的东西,可以方便我们根据inode找到对应的文件数据位置;下面形象看一下:
这样就实现了我们小的空间可以找到inode对应的大量的块了。
那么下面我们该如何知道对应文件名字它的inode(指令ls -li):
1.6Data blocks:
据不同的⽂件类型有以下⼏种情况:
1·对于普通⽂件,⽂件的数据存储在数据块中。
2·对于⽬录,该⽬录下的所有⽂件名和⽬录名存储在所在⽬录的数据块中看到的其它信息保存在该⽂件的inode中。
二·目录与文件:
访问文件,必须打开当前目录,根据文件名,获得对应的inode号,然后进行文件访问(目录中内容是里面文件以及和inode对应关系) ;本质是必须能打开当前工作目录文件,查看目录文件的内容!
当然了目录它也是文件了;遵循着文件的规律也就适用于目录了;只需要目录结构就好了。
三·系统与磁盘如何交互:
3.1路径解析:
都要从根目录开始,依次打开每一个目录,根据目录名,依次访问每个目录下指定的目录,直到访问到test.c。这个过程叫做Linux路径解析。
本质就是在磁盘文件系统中,新建目录文件。而你新建的任何文件,都在你或者系统指定的目录下新建,这不就是天然就有路径了嘛 !
说白了就是查找某个文件首先要先上推然后返回来找到的过程罢了。
3.2路径缓存:
如果向上面一样查找一直往回找到根目录的话就太慢了,因此实际不是这样的。
这里系统默认从根(/)开始缓存。
因此我们下面就要引出dentry:
Linux中,在内核中维护树状路径结构的内核结构体叫做: struct dentry;来缓存历史路径
每个文件相当于一个dentry结构体节点把他们串起来:
下面大概举例一下一些dentry存的结构:
每个文件都对应的有dentry然后系统把它多叉起来(其中这个结构不仅参与文件查找还有一系列与文件相关的任务->"网状")
3.3 挂载分区:
谈到这里,我们首先要明白:
分区写⼊⽂件系统,⽆法直接使⽤,需要和指定的⽬录关联,进⾏挂载才能使⽤。
所以,可以根据访问⽬标⽂件的"路径前缀"准确判断我在哪⼀个分区。
因此我们可以知道每个目录都会挂有分区,我们对其内文件操作必然要通过这个目录找到分区.
下面我们就来看看分区是如何挂到目录上的:
四·系统(进程)与文件交互总结:
首先先看张图:
五·软硬链接:
5.1软链接:
软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和被引⽤的⽂件的inode不同,应⽤常⻅上可以想象成⼀个快捷⽅式。
说白了我们可以理解为快捷方式即:
这就是一个软链接。
指令: ln -s 要软链接源文件 链接文件(快捷方式) ;取消是unlink +链接文件
里面存的是abc的文件路径,访间abc.s即去拿到abc路径再访间abc:而册掉abc.s后abc还是存在的。
用途:作为快捷方式,方便查找(当我们删除后,它真正文件并没有删除)
5.2硬链接:
我们看到,真正找到磁盘上⽂件的并不是⽂件名,⽽是inode。其实在linux中可以让多个⽂件名对应于同⼀个inode。
指令:ln 要软链接源文件 链接文件(快捷方式) ;取消是unlink +链接文件
这里其实就用到了引用计数。
硬链接文件inode和源文件相同也就是都是指向同一个inode这就产生了引用计数:
故:
1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
用途:./..的使用以及备份工作。
六.软硬链接在系统中的差异:
软连接是独⽴⽂件;硬链接只是⽂件名和⽬标⽂件inode的映射关系;下面请看图:
这里还有个小疑问:就是目录可以软链接但是不能硬链接?
解释下: linux系统只允许自己硬链接(./..),但是不允许用户操作;而软链接无要求。