解析磁盘文件系统
目录
磁盘
数组--磁盘文件--文件系统
重点来了!!!
(1)inode Table:
那inode是什么?
Inode Bitmap
Dateblocks:
Block Bitmap:
四大模块串联:
那么我们如何存储一个文件?(在组的视角)
inode与block间的映射
如何找到文件--文件名与inode
磁盘
引:对于我们的文件我们分为已打开的和未打开的:
今天我们就磁盘文件和文件系统展开描述!
1.首先我们先来了解硬件设备磁盘:
这是我们日常生活中常用的磁盘内部结构,其中的光滑面上就是我们储存文件的地方,那它是如何工作的?
(1)磁盘储存结构:
a.光面上存在多个同心磁道,每个磁道上的扇区是磁盘存储的基本单位,一般为512字节(规定)!
b.磁盘高速旋转,利用主臂上的磁头进行左右移动进行信息读取,注意磁盘外壳内处于真空状态。
上面三图从平面到立体整个展示了主要的存储结构。
其中文件信息就在扇区上,那么如何定位扇区?
理解:同半径磁道卷起来就是一个柱面,不同半径的柱面卷起来就形成了上面的蓝色圆柱(像果丹皮)
磁盘常用CHS定位法:
C:确定磁头访问哪一个柱面(cylinder)
H:定位哪一个磁头(header)
S:定位扇区(sector)
c.多个磁头随传动臂共进退
(语言层)d.每个柱面展开相当于一个矩形(大的数组),每个矩形中的扇区就相当于小数组都有一个下标,则我们查询扇区时就可以利用数组的查询方式LBA,则LBA与CHS可以相互转换。
LBA = 柱面号C单个柱面总的扇区数 + 磁头号H每个磁道扇区数+ 扇区号S -1
总结:对于OS来说我们访问磁盘文件就是用LBA查。
数组--磁盘文件--文件系统
我们可以将磁盘抽象成下图:
OS对于这么大的数组采用分治的思想进行管理。Linux规定OS单次以4kb的大小进行IO,即八个扇区。相当于地区管理中的省,那么我们还可以分出市,所以我们将八个扇区化为一个区,一个区又可以分多个组:
那么我们只要管理好一个组,将这种模式应用到其他组就可以很容易管理整个磁盘文件。
(软件层面)OS对于一个组提出了下面的结构:
一个就一个这样的管理结构,对于一个组又提出了上图最下面的6块,接下来我们以这六块介绍OS管理文件的方法。
Block Group:相当于每个省里的市,将磁盘分区又划分为不同的组。
Super Block:记录inode和data blocks的数量,即一个分区里有多少个文件属性和与之对应的数据块,也是文件进行创建删除修改的信息读取处,其与文件系统共存亡。
GDT:
引:一个分区一个文件系统,不同分区可以用不同的文件系统,如:
而GDT里存的是不同文件系统下块组的属性信息。
重点来了!!!
我们已知文件 = 属性 + 数据
接下来的四个模块就是,描述属性和数据的,也是整个文件系统的核心。
(1)inode Table:
这是一张存储文件属性的集合,上面也是以4KB为一块的数组,每个元素存的是inode。
那inode是什么?
inode是属性数据的集合,相当于一个文件的索引节点,本质上也是一个结构体:
inode结构体主要的信息就是上图。在此声明文件名不在inode中,具体在哪?后面会讲。
a.我们可以用下面的指令查看一个文件的inode
ls -l -i
b.对于这个结构体Linux默认一般为128字节
/////////////////////////////////////////////////////////////////////////////////
前面我们说过一个分区一个文件系统,而且我们还知道了文件的属性存在于inode中,inode存在于Inode Table里,那么我们如何知道Inode Table里哪些块是否已经存在inode?
Inode Bitmap
我们了解到Linux中分组是以4KB大小的,那我们如何以小的字节数标记数万个文件属性的储存?我么就引入了Inode Bitmap以位来存储:
假设我们有10000个文件属性,10000/8 = 1250字节 /1024 约为2KB这就实现了以少存多。
我们规定0为空1为已经存储!
Dateblocks:
其也形似数组,Linux规定它也是以4KB为一个数据块,来存储文件的内容
Block Bitmap:
与inode相似也是一种按位记录哪些数据块有数据哪些没有。
四大模块串联:
总结和补充:
(1)有了这样一套管理结构,我们也是将磁盘文件从硬件转变为软件,并将其抽象为一个超大的数组,并在OS层面实现了管理文件的办法--文件系统应运而生。
(2)
我们要了解在一个分区里每个组都有自己的始末inode
(3)我们对于文件的增删查改就可以在map上进行0/1交换,而且对于OS来说,在内存上有专门的结构体struct_sb/gdt将一个分区中的super_block(sb)与GDT读取,进而将每个组的文件信息像链表一样链接起来,这样就变成了链表的增删查改。
(4)格式化:将bitmap上的1全变成0,使inode和block失效。
那么我们如何存储一个文件?(在组的视角)
(1)首先我们会去其inodebitmap上找一个位用来记录刚文件已存在,然后在GDT上查找每个组的起始inode,然后将自己的位数和初始inode相加后得到的值在去Inode Table上的对应位置储存文件属性。
所以有了始末inode我们就可以跨组进行储存!!!
(2)与inode储存方式相同,数据也是按照这种方式进行数据储存,但由于其大小可能很大,所以它也可能存储的是其他的储存该文件数据的块号。将起始块号(下标)给Inode。
inode与block间的映射
这些索引块便会指向不同的数据块,然而数据块有可能存储其他的块号,这样便可以存储大量数据。
如何找到文件--文件名与inode
我们访问文件是用文件名进行访问的,而OS则用inode这两者间的联系是什么?
我们开始就讲过我们通过文件路径进行访问文件,所以OS给用户提供了目录,然而目录也是文件!
目录 = 属性 +数据
其中目录的数据块就存储的是文件名与文件inode的映射关系,然后起始目录也就是我们找到不同文件在哪个区的依据。(磁盘层面)
当我们进行文件路径逆序解析找到根目录后(用户理解层面),OS便会正序按照这个路径找到文件,为了减少对磁盘文件系统的解析访问,OS会进行路径缓存,将访问到的路径以树的形式储存。(dentry tree)