linux文件系统进阶篇

目录

前言:

认识磁盘:

CHS寻址法:

LBA寻址法:

Data blocks数据块:

Block Bitmap(块位图):

Inode Table(inode 表):

Inode Bitmap(Inode位图):

Group Description Table(组描述表):

Super Block(超级区块):

文件系统的挂载:


前言:

        在之前我写过一篇关于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/

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咬_咬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值