Linux文件系统----磁盘级文件
系统中不是所有文件都被打开了,实际上大部分文件都没被打开,没有被打开的文件保存在磁盘,SSD中,操作系统需要管理磁盘中的文件,使得让其快速定位到一个文件。
1.磁盘的简单构成
磁盘主要是一个磁头加一个盘片组成,一个磁头对应一个盘片,利用磁头可以在盘片上读取和写入,磁头读取时盘面高速移动,所以磁头不能贴着盘片,否则磁头会磨损盘片导致盘片受损,如果受损的是储存的重要的文件区域会导致文件无法被读取,但是磁头与盘片的距离极近,(就像本该在在万米高空飞行的飞机,现在在距离地面1m位置低空飞行)盘片中有数百万个小磁铁,它们的作用就是用来储存信息,这些磁铁的南北极被规定为二进制的01,磁头修改磁极来改变01二进制序列,进而存储文件。
2.磁盘的物理存储
如果想访问磁盘中的一个扇区:
通过磁头定位:
1.在哪个磁道/柱面 (哪个圆环)cylinder
2.在哪个磁头(哪个盘片)head
3.在哪个扇区 (哪个最小单位)sector以上就是CHS定位法
找到了扇区就可以进行读写数据 ,任何文件都是由多个扇区组成,可以通过标记一些扇区,从而找到一个文件。
3.磁盘的逻辑存储
根据CHS定位法
sector/单盘扇区个数 = 在哪个盘面上 H
sector%单盘扇区个数 = temp
temp/一个磁道上的扇区的个数 = 在特定盘面的哪一个磁道 C
temp%一个磁道上扇区的个数 = 在特定磁道的哪个扇区 S
只需要知道磁盘总容量,有多少个盘面,每个盘面上有多少个磁道,每个磁道上有多少个扇区,知道某个文件的线性地址就能找到该文件具体的扇区。
一次和磁盘IO一个扇区(512B)太小了,OS设定IO的基本单位是4KB,即一次与磁盘IO 8个扇区这就是LBA:Logical Block Address 逻辑块地址,这样在操作系统中对硬盘进行管理转化成对4KB数据块进行管理。
考虑一个800GB的硬盘,直接管理起来太麻烦,所以进行分区管理,而一个分区就是一个文件系统。(例如:笔记本电脑上的C盘,D盘,F盘,就是操作系统进行的分区处理)。
而对于分区的100GB,还可以继续进行分组处理,从而划分成更小的区域(例如10GB),方便更好的管理,这样一个分区就分成了许多组进行管理,这样以一个组为例,探究出一个组的构造,就弄清了整个硬盘的大致结构。
以一个组为例
linux磁盘文件特性:
文件=内容+属性Linux系统中内容和属性分开存储。
内容的大小不确定,可能很大也可能很小。
属性的大小固定,属性的类型是一样的,但属性的内容不一样。
系统中,标识一个文件,用的不是文件名,而是inode,文件的属性用一个结构体类型来描述,称为inode,这个结构体大小为128B。
一个文件在一个分区内只有唯一的inode,在不同分区可以有重复相同的inode。
struct inode(128字节)
{
类型
大小
权限
类型
……
inode编号//用来区分文件的唯一性,每个分区内唯一
}
一个数据块有4KB/128byte = 32个inode,注意文件名不属于文件属性。
inode table
i节点表(inode table):存放文件属性,如文件大小,文件所有者,最近修改时间等。
inode Bitmap
inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
比特位的位置:第几个inode。
比特位的内容:表示该inode是否被使用(01区分)。
Date Block
数据区(date block):存放文件内容。
Block Bitmap
块位图(Block Bitmap):记录着dateblock中哪个数据块被占用,哪个数据块没有被占用。
比特位的位置:第几个块。
比特位的内容:表示该块是否被使用(01区分)。
文件属性inode与文件数据内容block是如何关联的?
struct inode(128字节)//在结构体中实际上,有一个block成员变量,记录着文件的数据的位置
{
……
int block[15];
……
}
在inode结构体上,有一个block成员变量,记录着文件的数据的位置。
关于block数组
block数组只有15个空间,只能储存15个数据块编号,15×4KB=60KB,也就是说文件最大只有60KB?显然不是,他的存储规则是这样的。通过这种方式储存数据就能使文件大很多。
每一个分组都规定一个起始inode的编号,而每一个分组中都有独立的inode位图,起始inode编号+inode位图中的偏移量,就是文件的inode编号。如下所示
通过inode编号查找一个文件
(根据inode编号确定分组和该分组中inode位图的位置)
给定一个文件的inode编号,先确定文件在哪个组里面,直接对比每个分组的起始编号,看文件编号位于哪两个起始inode编号之间,就可以确定分组,然后用inode编号减去该分组的起始inode编号,得到该文件在该分组的inode位图的位置(偏移量)。
Group Descriptor Table
块组描述符(Group Descriptor Table):描述块组属性信息,就是对分组进行管理。
Super Block
超级块(Super Block):存放文件系统本身的结构信息,就是对分区进行管理。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。
Super Block管理整个分区,Super Block的信息被破坏,整个分区整个文件系统结构就被破坏了。每个分组不是都有Super Block,只有个别分组有Super Block,它们的信息都是一致的,这样当一个分组的Super Block坏掉时,还有其他分组的Super Block来代替,提高了文件系统的容错性。
操作系统只需要管理Super Block,就管理了所有的分区(文件系统)。
解释一些问题
格式化的本质:向指定分区,写入全新的文件系统。
关于文件名
目录是文件,那么目录有目录的属性(属性里面有inode编号)+目录的内容,内容是什么,目录的内容存放着文件名与inode编号的映射关系。
如果一个目录权限没有 r , w , x表现是什么?
没有w:就无法在目录中创建/删除文件。(因为文件名与inode编号的映射关系无法写入目录内容,也无法删除)。
没有r:就无法查看目录中的文件。(ls指令无法在当前目录下使用)。
所以找任何一个文件都要从根目录开始查找,而且该文件所属的一系列目录的权限必须是可读权限。在Linux打开的路径会进行缓存,dentry路径缓存,所以查找操作文件时往往不需要,从根目录把所有的目录名输入来进行查找操作文件,只要 . / 文件名,操作系统会进行自动拼接路径。
查找一个文件,在内核中,都要逆向的递归般得到/,从根目录进行路径解析。
访问一个文件,可以根据路径前缀,优先区分出文件在哪一个分区。
结论:对一个文件,进行增删查改,都和文件所处的目录有关!
查找打开一个文件
首先给出文件路径和文件名,在该文件所属的目录下,在目录的内容里找到映射关系(即通过文件名找到文件的inode编号)然后通过inode编号查找一个文件。
删除一个文件
首先给出文件路径和文件名,在该文件所属的目录下,在目录的内容里找到映射关系(即通过文件名找到文件的inode编号)。
找到这个文件的inode后,在inodeBitmap中将1变成0,在inodetable中找到对应文件的属性,从而找到block Bitmap数据的位置然后将对应的block的1变成0。(只要把文件对应的inode位图与block位图置成0即可,数据并没有被删除)。
拓展:
一个被写入文件系统的分区,要被Linux使用,必须要先把这个具有文件系统的分区进行“挂载”,一个文件系统所对应的分区可以挂载到相应的目录里。
Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录下的某个目录来实现,这种关联操作就是“挂载”,这个目录就是“挂载点”,解除次关联关系的过程称之为“卸载”。
在Linux中使用mount命令来附加文件系统和可移动设备,例如USB闪存驱动器。大多数 Linux 发行版的默认文件系统是 ext4。我们还可以使用unmount命令卸载文件系统。
结论:分区的访问,都是通过所挂载的路径访问的。