目录
Group Description Table(组描述表):
前言:
在之前我写过一篇关于linux的虚拟文件系统的博客,不过那篇主要是介绍打开的文件是如何在linux系统中被管理和存储的,那么这篇进阶版文件系统就要介绍一下,当文件没有被打开的时候,它在linux系统中是如何被管理和存储的。
认识磁盘:
对于文件的不带电存储,肯定第一想到的是磁盘,当然现在磁盘已经几乎没有民用的了,民用的磁盘已经被固态硬盘取代了,因为固态硬盘的读取效率更高,但也意味着成本更高。所以对于企业级的存储设备,大多数企业还是会选择磁盘这种性价比更高的存储设备,下面我们来简单认识一下磁盘:
磁盘:圆形的碟片,主要存储数据的地方,磁盘工作时会被中间的马达带动高速转动,磁盘上面其实就是有很多小磁铁,用于存储数据。
磁头臂:被马达带动上面的磁头左右扫描磁盘。
注意磁盘不止一片,下面还有好几片,磁头臂也不止一个,每个磁盘上面都有一个磁头臂,磁头臂和磁盘是不接触的!!!磁头臂是悬浮在磁盘上的,工作时通过磁头改变对应磁盘上的小磁铁的磁极来实现数据0和1的转换。
CHS寻址法:
如上图所示,我们要找到一个文件,就得先确定它在哪个磁盘也就是找到柱面(Cylinder),然后再通过这个柱面找到这个柱面上得磁头(Header),磁头左右扫描定位磁道,磁盘的高速旋转来确定数据在哪个扇区(Sector), 这就是CHS寻址法。所以我们只要有每一个文件的CHS就能找到每一个文件。
上述讲的是物理的寻址方法,但liunx操作系统并不是这样定位文件的,因为CHS方法耦合度太高了,linux是采用LBA(Logical Block Address)逻辑区块地址的方法来对磁盘的存储进行逻辑抽象。
LBA寻址法:
想必大家小时候都见过磁带:
磁带在里面的数据一开始卷在一起的,当开始读取的时候就会转动齿轮开始读取,然后卷着得数据,我们就可以线性读取,我们的磁盘也可以做到。磁盘被操作系统扫描后,也可以看作成一个线性的数组,这样对磁盘的管理就是对数组的管理,所以整个磁盘可以抽象成下图:
我们将数组的每4kb规定为一个逻辑块,以后我们的文件都以块为单位存储,内存大于一个块的,用多个块存储,小于一个块的,就用一个块存储(这个块中剩余的被浪费) ,分为块后,因为数组可能太大不好管理,就进行了分区,进行分组管理,接下来就看看每个分组里面是怎么管理的吧:
每个分区内部又都被分为块组,每个块组里面又还有细分不同的功能区,下面我来详细介绍一下这些功能区:
Data blocks数据块:
顾名思义这里是用来存放文件数据的地方,里面的结构大致如下图:
里面都是以块为单位的,块的大小有1kb,2kb,4kb,一般使用4kb大小,每个块都有编号,这样方便inode记录,每个区块只能存放一个文件的数据。
Block Bitmap(块位图):
这里面存放的是01序列,用来表示Data blocks里的哪些块被占用了,哪些块没有被占用,占用的用1表示,没占用的用0表示。
Inode Table(inode 表):
这块表非常重要,里面存放了文件的属性主要有:
文件的权限。
文件的拥有者和所属组。
文件的大小。
文件的建立和改变状态的时间。
最近一次读取时间。
文件的inode编号。
文件的真正内容指向。(int datablocks[N])
注意这里面是没有文件名的哦!!!为什么?后面讲。
里面文件内容的指向仅用了一个数组(datablocks[N])这里面的N一般是15,这里你肯定会有疑问,这么小的一个数组,如果我有一个大文件他该怎么办呢?这就需要我们看看这个数组内部:
0-11号直接寻址,12号间接寻址,13号双间接寻址,14号三间接寻址,通过这样的方法就可以找到更多的块,实现大文件的存储。
再来谈谈inode编号,inode编号对文件来说很重要,一个文件对应一个inode编号,我们每次查找文件都必须先得到文件得inode,如何得到呢?文件属性里面是没有文件名的,那文件名在哪呢?在目录的文件内容里,目录也是一个文件,它的文件内容就是文件名和它的inode,没错目录文件就像一张映射表,里面有这个目录下每个文件的文件名和inode编号,所以每次查找文件linux都会先查找目录文件的内容来获取该文件的inode编号,再通过inode编号去inode table里面查找该文件的属性,在属性里面找到databalock数组,通过这个数组最后找到文件的数据。
Inode Bitmap(Inode位图):
和block bitmap功能相似,里面是01序列,用来表示inode table里哪些块被占用了。
Group Description Table(组描述表):
这个主要用来描述这个群组在这个分区的开始与结束区块,以及说明每个区段(inode table,inode bitmap,data block等等)分别介于哪个区块之间。
Super Block(超级区块):
这个区块对文件系统来说很重要,里面主要存放了:
数据区块与inode的总量。
未使用与已使用的inode与数据区块的数量。
数据区块与inode的大小。
文件最近一次修改时间,最近一次检验磁盘。
一个有效位数值,若此文件系统已被挂载,则有效位为0,若未被挂载则有效位为1。
看似Surper Block里面存放的数据关乎整个分区,但它不是放在这个分区的最开始,而是放在了这个分区的几个组里,为什么?因为Surper Block太过重要,如果磁盘不小心被刮花,刮到这片区域,整个文件系统就彻底报废,所以多设置几个Surper Block同步更新里面的数据,当部分Surper Block里的数据损坏时,就可以用其他没有损坏的Surper Block里的数据来对其进行恢复,从而保证了文件系统的稳定性。
文件系统的挂载:
上述讲到的文件系统是linux入门级文件系统ext2,在之后还有ext3,ext4,在最初一个分区只能使用一个文件系统,要使用这个文件系统我们就要先挂载该文件系统,再使用。
如何挂载:
查看挂载的文件系统:
mount
查挂载的分区:
df -h
先创建一个目录:
makdir mymnt
先准备一个分区disk.img,其实就是一个文件,这个文件的大小决定了分区的大小,在这个分区挂载目录mymnt:
mount disk.img mymnt
以后在目录mymnt里面新建文件,就是在新建的分区disk.img里面新建文件。
卸载分区:
umount mymnt/