【Linux】了解磁盘/文件系统/inode

时间:2023-01-21 15:53:57


一.磁盘

1.磁盘的结构

【Linux】了解磁盘/文件系统/inode

【Linux】了解磁盘/文件系统/inode

问题1:什么是磁盘?

磁盘是在冯诺依曼体系结构中几乎唯一的机械设备,机械设备意味着它的效率低,那么我们为什么还会使用磁盘呢?因为磁盘相比我们所熟知的内存有一个极大的优势,那就是永久性,磁盘是一种永久性存储介质,而内存是一种掉电易失存储介质,也就是没电了,存储的数据就没了。因此目前所有的普通文件都是存储在磁盘上的。

磁盘在冯诺依曼体系结构当中既可以充当输入设备,有可以充当输出设备。
【Linux】了解磁盘/文件系统/inode

问题2:了解磁盘结构

介绍一下磁盘中的几个重要部分
盘片(Platter):磁盘一般是由多个盘片组成的,而每个盘片都有上下2个盘面。
磁头(Head) :每个盘面都有一个对应的磁头,也就是一个盘片都有上下2个磁头。磁头的作用是对磁盘进行写入和读取
磁道(Track) :当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在盘片的表面画出一个圆形轨迹,这个圆形轨迹就称为磁道。
扇区(Sector) :每个磁道都被切分为很多扇形区域,这个扇形区域被称为扇区,磁盘在寻址的时候,基本单位是扇区(512字节)。如图所示,越靠近同心圆的扇区面积越小,越远离扇区的同心圆面积越大,但是每一个扇区的存储大小均为512字节
柱面(Cylinder):不同盘片的相同编号的磁道构成的圆柱面就被称之为柱面。

磁盘是计算机中唯一一个机械结构并且是一个外设,相对于其他存储设备来说较慢。但是价格低廉、存储量大,成为了企业存储设备的首选。磁盘磁头和盘面之间的距离极近,不能进灰尘,使用时禁止搬移抖动刮花盘面,以免造成数据丢失。

磁盘通过磁头充放电,完成盘面南北极的调转,即二进制数据的写入

2.磁盘的定位(寻找方案)

对磁盘进行读写操作时,一般有以下几个步骤(CHS定位法):
1、先定位磁道(cylinder)(柱面)
2、定位磁头(head)(即盘面)
3、定位扇区(sector)。

磁头会通过摆动确认在哪个磁道,通过盘片高速旋转让磁头定位扇区。(磁盘转速与磁头寻址速度匹配,所以盘片旋转速度越快,该磁盘的IO效率越高)

3.磁盘的分区与格式化介绍

1.线性存储介质

将一摞磁盘沿磁道“拉直”,就抽象成了线性结构。想想磁带,当磁带被卷起来时,其就像磁盘一样是圆形的,但当我们把磁带拉直后,其就是线性的。那么整个磁盘可以看做一个sector arr[n]数组,对磁盘数据的管理就变成了对数组的管理。只要知道了扇区的下标,就可以定位扇区。这个下标在操作系统内部称为LBA地址。根据LBA地址可以转化为CHS地址,从而找到对应扇区。
【Linux】了解磁盘/文件系统/inode

为什么操作系统要将CHS定位法抽象为LBA地址?

1.便于操作系统管理硬盘;
2.不想让操作系统的代码和硬件强耦合,硬件的变化并不会影响操作系统。

2.磁盘分区

看作线性存储介质后,就方便我们对磁盘进行管理了。因为磁盘的容量很大,我们可以对磁盘进行分区管理。磁盘通常被称为块设备,一般以扇区为单位,一个扇区的大小通常为512字节。我们若以大小为512G的磁盘为例,该磁盘就可被分为十亿多个扇区。在分区之后,对每个区域的管理都是相同的,不同的目录与文件就可以存储进不同的分区,这将很大程度的减少工作量。

在Linux中,我们可以通过以下命令查看我们磁盘的分区信息:

1 | [zxn@VM-0-15-centos ~]$ ls /dev/vda* -l

在分区之后,我们可以每个区域进行格式化。
  
大小为4KB的页框和页帧

操作系统中内存以4KB大小划分,每个空间被称为页框

磁盘中的文件,尤其是可执行文件也时安装4KB大小划分好的,每个块被称为页帧

磁盘的最小单位是扇区,512个字节。操作系统的文件系统每次读取数据会以1KB,2KB,4KB为基本单位(大部分是4KB)读取至内存。以4KB为基本单元进行IO时,有时4KB的数据并不能完全被利用,但是这不代表浪费。根据局部性原理,当计算机访问某些数据时,它附近的数据也有非常大的概率被访问到,加载4KB有助于提高IO效率,同时增大缓存命中率。(本质上是一种数据预加载,以空间换时间的做法)。

3.磁盘的格式化

当磁盘完成分区后,我们还需要对磁盘进行格式化。磁盘格式化就是对磁盘中的分区进行初始化的一种操作,这种操作通常会导致现有的磁盘或分区中所有的文件被清除。
简单来说,磁盘格式化就是对分区后的各个区域写入对应的管理信息。

其中,写入的管理信息是什么是由文件系统决定的,不同的文件系统格式化时写入的管理信息是不同的,常见的文件系统有EXT2、EXT3、XFS、NTFS等。

二.理解inode

磁盘文件由两部分构成,分别是文件内容和文件属性。文件内容就是文件当中存储的数据,文件属性就是文件的一些基本信息,例如文件名、文件大小以及文件创建时间等信息都是文件属性,文件属性又被称为元信息。

在Linux操作系统中,文件的属性信息和内容是分离存储的,其中保存元信息的结构称之为inode,因为系统当中可能存在大量的文件,所以我们需要给每个文件的属性集起一个唯一的编号,即inode
,inode是一个文件的属性集合,Linux中几乎每个文件都有一个inode,为了区分系统当中大量的inode,我们为每个inode设置了inode编号。

在命令行当中输入ls -i,即可显示当前目录下各文件的inode编号
【Linux】了解磁盘/文件系统/inode

三.ext2文件系统的存储方案

磁盘采用分而治之的思想,例如一块500G的磁盘可以划分成4个125G进行管理,每个125G又可以分为多个5G进行管理等。计算机为了更好的管理磁盘,会对磁盘进行分区。而对于每一个分区来说,分区的头部会包括一个启动块(Boot Block),对于该分区的其余区域,EXT2文件系统会根据分区的大小将其划分为一个个的块组(Block Group)。每个组块都有着相同的组成结构,每个组块都由超级块(Super Block)、块组描述符表(Group Descriptor Table)、块位图(Block Bitmap)、inode位图(inode Bitmap)、inode表(inode Table)以及数据表(Data Block)组成。

注意: 启动块的大小是确定的,而块组的大小是由格式化的时候确定的,并且不可以更改。
【Linux】了解磁盘/文件系统/inode

【Linux】了解磁盘/文件系统/inode
1.Super Block(超级块): 存放文件系统的结构信息。记录的信息主要有:Data Block和inode的总量,未使用的Data Block和inode的数量,一个Data Block和inode的大小,最近一次被挂载的时间,最近一次写入数据的时间,最后一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统的结构就破坏了,幸运的是,在一个分区中,超级块的数量不止一个,起到了备份的作用。

2.Group Descriptor Table(块组描述符表): 描述该分区中块组的属性信息。

3.Block Bitmap(块位图): 块位图当中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。用0表示某位没有被使用,用1表示某位数据块已经被使用。

4.inode Bitmap(inode位图): inode位图当中记录着每个inode是否空闲可用。用0表示某位没有被使用,用1表示某位inode已经被使用。

5.inode Table(inode表): 保存了分组内部所有的可用(已使用+未使用)的inode。用来存放文件的属性信息的,如文件的大小、权限、类型、创建时间、所属组、所属用户等。我们使用ls -l看到的信息,都是从这里获取的。每个文件对应一个inode,因此每个inode中都存储一个inode编号用来区分。唯独文件名不在inode表中存储。一个文件对应一个inode,inode是固定大小。每个分组中的inode为了区分彼此,它们都有自己的ID。同一分区的inode是连续的,不同分区的inode是无关联的

6.Data blocks(数据块): 保存的是分组内部所有文件的数据块。单个Data block:存放文件内容,大小随文件大小变化而变化。但是对于目录文件:会存放目录下的所有文件名到其中。文件名保存在它所在目录的数据块中!

如何理解创建一个空文件?

1.通过inode的位图,找到一个未使用的inode,然后将某个空闲位置的inode值修改为1。;
2.在inode表中找到对应的inode,并将文件的属性信息填入到inode结构中;
3.将该文件的inode编号与文件名这对映射关系添加到目录文件的数据块中。

如何理解对文件写入信息?

1.通过文件的inode编号找到对应的inode结构,扫描Block Bitmap,找到空闲的块,将其值改为1;
2.通过inode结构找到存储该文件的数据块,并将数据写入数据块,建立数据块和inode结构的对应关系;
3.说明:一个文件使用的数据块和inode结构的对应关系,是通过一个数组来进行维护的,该数组一般可以存储15个元素,其中前12个元素分别对应该文件使用的12个数据块,剩余的三个元素分别是一级索引,二级索引和三级索引,当该文件使用的数据块的个数超过12个时,可以用这三个索引进行数据块的扩充。

如何理解删除一个文件?

1.将该文件的inode在inode位图中置为无效;
2.将该文件申请过的数据块在块位图中置为无效。

此操作并不会真正将文件的属性信息和内容删除,而只是将其inode号和数据块号置为了无效,所以我们如果想要恢复文件,只需要找到被删除的文件的inode编号,将inode Bitmap中的比特位由0置1,找到该文件在inode Table中的位置,根据其中的映射关系找到文件的数据块,并把Block Bitmap由0置1即可恢复文件。注意文件被删除后,如果想恢复,就不要再创建文件,因为后续创建其他文件或是对其他文件进行写入操作申请inode号和数据块号时,可能会将该置为无效了的inode号和数据块号分配出去。

如何理解目录?

通过以上学习,我们知道了文件系统是使用inode编号查找和删除文件的,但是用户用的可不是inode编号,而是文件名。
1.都说Linux下一切皆文件,目录当然也是个文件,也有自己的inode编号和数据块;
2.目录的inode结构当中存储的就是目录的属性信息,比如目录的大小,拥有者等;
3.但是目录的数据块中存储的是该目录下的文件名以及对应文件的inode编号(文件名和inode的映射关系),所以在一个目录下创建文件,必须要有写入权限,原因就是创建文件需要在目录的数据块中写入文件名和inode。

这同时也解释了一个目录下不能出现同名文件的原因,