亲宝软件园·资讯

展开

我们来看一下,关于文件系统的一些知识

LAlexH 人气:0

首先,我们来看一下磁盘的内部结构:

磁盘是由盘面+读写磁头+主轴+组合臂+磁臂组成,我们忽略机械组件,主要研究读写磁头(读取和写入数据)和盘面两(存储数据)

然后,我们再来了解一下关于磁盘的一些名词:

磁道:我们可以把盘面当成是由无数个大小不一样的圆圈组成,盘面上一圈一圈的就叫磁道

柱面:所有的盘面上同一位置的磁道会形成一个圆柱体,我们把它叫做柱面

扇区:每个磁道上面,可以分成一个一个的扇区,扇区是存储数据的最小单元

 

 之后,我们来看一下磁盘是如何工作的:

旋转:磁盘运行的时候,是由主轴带着盘面飞速旋转,转速越快的磁盘,读写的速度就会越快

寻道时间:当我们从磁盘上读数据的时候,我们会告诉磁头,我要取x盘面y磁道z扇区上面的数据(或者叫x柱面y磁头z扇区),然后对应的磁头就会指到该磁道上面,我们把这个过程叫做”寻道时间”

旋转时间:磁头找到该磁道以后,再由主轴带动旋转道对应的扇面,我们把这个过程叫做”旋转时间“

读取时间:所有磁盘读取数据的时间就是寻道时间加旋转时间

下面,我们再来看一下什么是”块“:

为了使我们告知磁盘去寻找磁盘位置的时候更加方便,我们发明了LBA(Logical Block Address)的寻址方式,把磁盘逻辑上分成一个个”块“,给这些块依次编号,比如:1、2、3...,n;我们在寻找磁盘位置的时候,只需要把”块“的编号告诉磁盘,然后磁盘会在内部将”块“编号转换成盘面+磁道+扇区来读取写入数据,格式化的过程就是将磁盘进行分”块“

接下来,我们来看一下扇区和块之间的关系:

扇区是磁盘存储数据的最小单位,磁盘本身并没有块的概念,我们可以把块看成是逻辑上的磁盘单位,不同的文件系统中,块的大小是不同的

在linux系统中,我们通过下面的命令,可以查看扇区的大小:fdisk -l | grep Sector, 查看块的大小:tune2fs -l https://img.qb5200.com/download-x/dev/vda1 | grep "Block size",ext4文件系统中,block的大小是4096byte(4k),则一个block包含8个扇区

下面,我们来思考一下,当我们想存一张48k大小的照片,流程会是什么样的呢:

有一种方法是这样的:

我们命令硬盘 ,我需要12个块来存数据,你把块的编号返回我,之后磁盘返回空闲块的编号给我,分别是3,9,11,24,33...,我们根据磁盘返回给我们的编号,将数据存入磁盘,然后记下这些块的编号,以便在下次需要读取图片的时候使用

用这个方法,一两条数据还好,要是成千上万条,那还不崩溃了。

实际上我们现在使用的方法是这个样子的:

找到一个目录,然后把图片放进去就可以了,就这么方便,我们下一次读取的时候,只需要记住文件的目录和文件名就好了,剩下的工作就交给操作系统来完成了,操作系统在这个过程中,都做了哪些事情呢

我们接着来看,当我们读取写入文件的时候,操作系统帮我做了哪些事情呢:

我们创建一个文件以后,操作系统记录文件对应的块编号,比如文件img.jpg占据磁盘块1~12,但是操作系统具体是如何管理文件对应的块的呢,它也想了很多办法。

方法一:采用连续的块来存储文件,这样做的好处是,访问文件的效率会很好,但是不连续的块无法使用,会造成磁盘严重的浪费。

方法二:采用链式的方法存储文件,文件从第一块磁盘开始,形成一条链,这样就解决了磁盘浪费的情况,但是读取的效率又慢了很多。

方法三:专门在磁盘中划分出一些特殊的磁盘块,这些块不存储真实的数据,专门存放文件对应的存放数据块的编号,我们把这样的磁盘块叫做inode索引块,这样,当我们读取文件的时候,先去inode索引块中查找对应的数据块,然后再去取数据。这个方法是不是好了很多呢

 

 

我们接受了方法三的方式,那么我们来看一下inode节点里面都放了些什么东西:

每一个文件都对应了一个inode块:inode块里面不仅存储了真实数据存放的数据块的编号,还记录了文件的权限,所有者,创建时间等等信息。

接下来,我们来看一下inode块可能会带来什么问题:

我们来举个栗子:假设我们的inode的大小是4096byte,存放非数据块信息用掉了512byte,剩下的3584byte可以用来存放数据块对应的信息,每个数据块编号的存储需要32byte,也就是这个inode可以存储3584/32=112个编号,及112个数据块,112个数据块可以存放112*4096byte大小的数据,但是文件大小要是超出这个大小怎么办呢,那inode岂不是放不下这些信息了吗

针对上面的问题,我们来看一下什么是间接块:

间接块的诞生,就是解决大文件的inode问题,如下图,我们使用一个位置,来记录指向另一个存放文件信息的块,这个叫做一次间接块,还可以以同样的方式做出二次、三次间接块,这样就解决了大文件存储的问题。

 

知道了文件的索引块,我们来看一下目录的inode索引块:

目录同样有inode索引块,但是目录里面指向的磁盘块里面存放的是子目录和文件对应的文件inode索引块的编号。

 

 

我们来看一个例子,如果我们要查看/tmp/test.log文件流程是什么样的呢:

首先我们找到/目录的inode---找到/目录磁盘块---找到tmp目录inode----找到tmp磁盘块---找到test.log的inode---找到对应的数据块

 

 

我们来看一下,如果要删除/tmp/test.log,我们需要做些什么呢:

在目录的磁盘块中删除文件指向记录,删除test.log的inode,删除数据盘中的数据

下面,我们来看一下文件时如何管理空闲块的:

我们在写入数据的时候需要知道哪些块时空闲可用的,怎么样来管理这些空闲的块呢,位图法出来了,我们找一个块,每一位都代表一个块编号,1表示使用,0表示空闲。

接下来,我们来看一下ext2文件系统对磁盘的布局组成:

MBR:主要由引导代码和磁盘分区表组成,分区表里面记录的每个分区的起始位置和结束位置

块组:每个分区又会被分成多个快组,快组的结构都是一样的,由超级块、快组描述、块位图、inode位图、inode块、数据块组成

超级块:超级块里面存着快组的一些信息,如:磁盘的块数、每个磁盘块的大小、空闲的inode和磁盘块个数等

磁盘块位图、inode位图、inode块、数据块这些不用介绍我们也知道是干什么的了。

 

至此,整个文件系统初略的架构我们大致就梳理清楚了。

加载全部内容

相关教程
猜你喜欢
用户评论