🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
文章目录
- 一、关于磁盘
- ①磁盘
- ②CHS寻址
- ⑤磁盘结构的抽象
- 二、文件系统
- ①inode与文件的关系
- ②创建文件,系统做的事
- ③删除文件,系统做的事
- ④删除的文件能够恢复吗?
- ⑤查找文件,系统做的事
一、关于磁盘
磁盘是一个外设(外设即冯诺依曼中承担输入输出角色的设备),而且,磁盘还是计算机中唯一一个机械设备,因为磁盘是外设,同时又是机械设备,就意味着磁盘会非常的慢(相对而言),所以OS一定会有提速的方式
磁盘物理结构:
①磁盘盘片 ②磁头 ③音圈马达 ④伺服系统(也就是一系列的硬件电路) …
当通电之后,随音圈马达的带动下,磁盘盘片(磁盘判断是一摞,有很多面)快速旋转,磁头就会左右摇摆去寻址
无论是磁盘还是光盘,最终盘面上会存储数据,计算机只认识二进制,所以说磁盘上本质存储的就是二进制,内存可以用优点和没有来存储,那么磁盘这种,就只能通过极性的方式来读写,也就是说磁头来回进行读写,在盘面特定位置产生放电行为,改变特定位置的正负极性,从而向磁盘写入数据。
①磁盘
磁盘是由一系列同心圆构成的,数据并不是在任意位置写入,而是写在这些划分好的同心圆上,而中间空着的区域是不进行数据存储的,当然可以把这些同心圆划分的很紧密,而一个同心圆就被称为一个磁道,我们很大可能不会用完一个磁道,所以又将磁道划分为一个个扇区,这一摞磁盘盘面,半径相同的磁道称作柱面,一整个磁盘也就是很多个柱面的集合。
②CHS寻址
我们要确定数据写在哪一个扇区,那么就要先确定在哪一个磁盘盘面,也就是用磁头来寻找盘面,磁头(Head),然后需要确定在哪一个磁道(Cylinder/Track),然后确定在哪一个扇区(Sector),就知道了在哪一个扇区,通过磁头的寻址,把数据写进去就可以了,所以被称作CHS寻址方式(Cylinder Head Sector)
⑤磁盘结构的抽象
可以把磁盘想成一个卷起来的磁带,这一圈一圈的就是磁道,我们可以把磁盘盘面想象成线性结构,那么就可以看做是一个数组,扇区的大小一般是512字节,所以就可以看成是有n个512字节的数组,那么访问一个扇区,只要知道数组下标,就可以找到。
操作系统访问磁盘用的就是LBA地址(Logic Block Adress逻辑块地址),然后驱动将LBA转化成CHS去找到,最终实现CHS寻址到扇区读写数据。
每个扇区的大小一般为512字节,那么每个磁道的半径都不太,他是怎么确保的呢?其实是用磁道的密度来实现的,通过对磁盘内和外的密度不同来达到不同长度相同大小的目的。
二、文件系统
所以我们把磁盘想象成了一个大数组,将数组存储到磁盘在操作系统层面就转化成了将数据存储到数组,对磁盘的管理,也就转化成了对大数组的管理,但是又因为磁盘对应的数组太大,我们又可以拆分成多个小数组,分区管理
对磁盘的管理,就转化成了对每个小分区的管理,又因为机器及其相似,所以我们只需要管理好一个小分区再Ctrl CV即可。
Block group:块组
Boot Block:启动块
Super Block:包含了整个文件系统的属性信息,因为磁盘可能刮花,所以放在块组当中,如果不存在块组
里,正好将Super Block刮花,那么整个分区就全乱了,比如蓝屏修复,就要就是修复Boot
Block要么就是从块组中拷贝Super Block,以能正常运行文件系统
Group Descriptor Table 块组描述符表,存储的是块组的相关属性,比如有多少个块组,还有哪些块组
空着,然后该块组中有多少个inode,多少个block,还剩下多少inode,多少block等等
Block Bitmap:块的位图,比如有10000+个数据块,那么Block Bitmap就应具有10000+个比特位,比特位
和特定的Block是一一对应的,比如该比特位为1,就代表该Block正在被使用
inode Bitmap:inode的位图,功能和Block Bitmap类似
inode Table:inode表,一般而言inode是一个大小为128字节的空间,它里面保存的是对应文件的属性,这
个表中就是该块组内,所有文件的inode集合。(inode就是一块空间,存的文件属性)
Data blocks:文件=文件内容+属性,Linux在存储的时候,将内容和属性分开存储,Data blocks保存的都
是特定文件的内容,Data blocks就是多个4KB块大小的集合
我们只要把这些信息管理好,那就就能够让一个文件的信息可追溯,可管理,我们将块组分割成上面的内容,并且写入相关的管理数据,每一个块组都这样做,整个分区就被写入了文件系统信息,整个过程就叫做格式化,重装系统的时候,就会让用户分区,格式化,格式化就是在磁盘写入文件系统(进行划分)
虽然磁盘的基本单位是扇区(512字节),但是操作系统(文件系统模块)和磁盘进行IO的基本单位是4KB,就算就想读1字节的数据,一次IO也要取出4KB,所以也称磁盘为块设备
操作系统与磁盘的IO为什么不以512字节为基础单位呢?
①因为512太小,一般要做数据拷贝的时候,都会超过512字节,此时就会导致多次IO,浪费时间,降低效率
②如果磁盘和操作系统使用一样的大小,万一磁盘扇区的基础单位变小,那文件模块与磁盘的一次IO要不要该呢?(修改源码),所以要对硬件和软件(OS)进行解耦,彼此用彼此的规定
一个文件一般只有一个inode结点(因为用128字节的inode就可以存下文件的属性,一个文件一般有多个blocks,因为blocks存的是文件的内容,只要文件内容大于4K,因为一个block块就是4K,那么就需要多个block来存储。)
那么如何确定哪个block属于哪一个文件呢?
是通过找到inode tables,用inode编号去找到该文件对应的inode属性集合,而在一个inode里,如下所示
在inode中,保存了对应block的块号,通过响应的映射关系,就能依次找到文件内容,那么此时文件的属性和内容就都拿到了,然后一般是划分了某个区域有固定大小的inode和block,比如在Group Descriptor Table中可以找到,所以使用了哪个inode或者块,就可以更改inode bitmap和block bitmap的对于比特位
①inode与文件的关系
Linux下一切皆文件,目录也是文件,他也有自己的inode和Data Blocks,不过目录的Data Blocks里面存的就是目录下的 文件名 和 对应inode编号 的映射关系,文件名和inode编号互为Key值,文件系统既可以用inode编号作为key,也可以用文件名作为key去查找
找到inode编号是要依托于文件系统的,因为在目录的block当中,保存了某一个文件的映射,所以,因为我们找的时候是用文件名来找的vim test/test.cc
,然后找到映射到的inode,给操作系统去文件系统当中找到我们对应的文件的inode以及blocks。
②创建文件,系统做的事
创建文件,系统根据文件系统,找到这个目录对应的分区,然后再找到对应的块组,然后确定保存这个文件的块,也就是blocks,然后将inode Bitmap和block Bitmap做已存在修改,将新建文件的属性写进inode,在inode中建立文件的内容也就是data blocks的映射,最后系统返回一个inode编号,然后在目录的block块中,存储该文件的文件名和inode编号的映射。
③删除文件,系统做的事
首先通过目录的blocks找到对应文件名的inode编号,然后系统通过文件系统找到对应分区,块组,然后通过inode编号去inode table中找到inode属性集合,然后去将inode属性集合里面对应的Blocks的Block Bitmap中进行不存在修改(不用去删数据什么的,下一次再使用这个块,直接覆盖即可),然后inode Bitmap也做不存在修改,然后再从目录的data blocks中将文件名和inode编号映射关系删掉即可。
另外,因为inode和block的大小是固定的,所以有可能看到磁盘某个区域还有空间,但是创建文件失败,就是因为划分给别人的空间没用完
④删除的文件能够恢复吗?
恢复的原理就是再找到原来的那个文件的inode编号(可以在删除日志当中找到),然后通过inode编号找到分区,块组,将inode Bitmap和Block Bitmap恢复,然后通过inode table找到inode属性,再找到data blocks,就可以恢复了。但是前提是该文件所属的这些块都没有被覆盖,所以当把重要的文件误删了之后,最好的做法就是不要动,交给专业的人来恢复文件
⑤查找文件,系统做的事
ls的时候,在目录,下找到data,将文件名全部打印出来,就完