【Linux】文件系统

理解文件系统

我们使用 ls -l 的时候看到的除了看到文件名,还看到了文件元数据。
[rAL linux]# ls -l
总用量 12
-rwxr-xr-x. 1 root root 7438 "9 13 14:56" a.out
-rw-r--r--. 1 root root 654 "9 13 14:56" test.c
每行包含 7 列:
模式
 
硬链接数
 
文件所有者
 
  
大小
 
最后修改时间
 
文件名
其实这个信息除了通过这种方式来读取,还有一个 stat 命令能够看到更多信息
上面的执行结果有几个信息需要解释
inode
为了能解释清楚 inode 我们先简单了解一下文件系统
在命令行当中输入 ls -i 即可显示当前目录下各文件的inode编号:
注意:无论是文件内容还是文件属性,他们都是存储在文件中的

         1 .磁盘的概念

什么是磁盘?

磁盘是一种永久性存储介质,在计算机中,磁盘几乎是唯一的机械设备。与磁盘相对应的就是内存,内存是掉电易失存储介质,目前所有的普通文件都是在磁盘中存储的。

磁盘在冯诺依曼体系结构当中既可以充当输入设备,又可以充当输出设备。

磁盘的基本概念:

磁盘的寻址方式:

对磁盘进行读写操作的时候,通常我们需要找到需要修改地方的地址,一般来说有以下几个步骤去寻找:

确定读写信息在磁盘的哪一个盘面也就是哪一个磁头

确定读写信息在哪一个柱面也就是哪一个磁道

确定信息在哪一个扇区也就是磁道的哪一块

这种方法也叫CHS寻址:

线性存储的介质:

理解文件系统,我们首先要把磁盘想象作为一个线性的介质,比如磁带。磁带拉直后,就是线性的,同样的,磁盘也要想象为每一圈拉直。

磁盘分区:

磁盘通常呗称为块设备,一般以扇区作为读写的基本单位,一个扇区的大小通常是512字节,当然也有的是4kb。若我们以512字节为例,一个512G的磁盘就可以分为十亿多个扇区,也就是这么多个基本单位。

计算机为了更好的管理磁盘,于是对磁盘进行了分区。磁盘分区就是使用分区编辑器在磁盘上划分几个逻辑部分,盘片一旦划分成数个分区,不同的目录与文件就可以存储进不同的分区,分区越多,就可以将文件的性质区分得越细,按照更为细分的性质,存储在不同的地方以管理文件,例如在Windows下磁盘一般被分为C盘和D盘两个区域。

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

ls /dev/vda* -l

EXT2文件系统的存储方案

计算机为了更好的管理磁盘,会对磁盘进行分区。而对于每一个分区来说,分区的头部会包括一个启动块(Boot Block),对于该分区的其余区域,EXT2文件系统会根据分区的大小将其划分为一个个的块组(Block Group)。

注意: 启动块的大小是确定的,而块组的大小是由格式化的时候确定的,并且不可以更改。

其次,每个组块都有着相同的组成结构,每个组块都由超级块(Super Block)、块组描述符表(Group Descriptor Table)、块位图(Block Bitmap)、inode位图(inode Bitmap)、inode表(inode Table)以及数据表(Data Block)组成。

Super Block: 存放文件系统本身的结构信息。记录的信息主要有:Data Block和inode的总量、未使用的Data Block和inode的数量、一个Data Block和inode的大小、最近一次挂载的时间、最近一次写入数据的时间、最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。

Group Descriptor Table: 块组描述符表,描述该分区当中块组的属性信息。


Block Bitmap: 块位图当中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。
inode Bitmap: inode位图当中记录着每个inode是否空闲可用。通过位图0/1记录

 
inode Table: 存放文件属性,即每个文件的inode。这里的datablocks[N]是具体可能会采用多级索引的技术,将空间按需求扩大


Data Blocks: 存放文件内容。

注意:
其他块组当中可能会存在冗余的Super Block,当某一Super Block被破坏后可以通过其他Super Block进行恢复。
磁盘分区并格式化后,每个分区的inode个数就确定了。

创建一个空文件是怎样的?

创建一个文件,可以通过找到一个未被使用的inode,在inode table中找到对应的inode,并将文件的属性填充进inode结构体中。

将该文件的文件名和inode指针映射起来添加到目录文件的数据块中。

因此创建一个新文件主要有一下4个操作:  

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

通过文件的inode编号找到对应的inode结构。
通过inode结构找到存储该文件内容的数据块,并将数据写入数据块。
若不存在数据块或申请的数据块已被写满,则通过遍历块位图的方式找到一个空闲的块号,并在数据区当中找到对应的空闲块,再将数据写入数据块,最后还需要建立数据块和inode结构的对应关系。

注意:
一个文件使用的数据块和inode结构的对应关系,是通过一个数组(datablock[ ])进行维护的,该数组一般可以存储15个元素,其中前12个元素分别对应该文件使用的12个数据块,剩余的三个元素分别是一级索引、二级索引和三级索引,当该文件使用数据块的个数超过12个时,可以用这三个索引进行数据块扩充。这样就可以对空间进行扩充了

删除一个文件是什么?

将该文件对应的inode在inode bitmap当中置为无效。
将该文件申请过的数据块在块位图(block bitmap')当中置为无效。
因为此操作并不会真正将文件对应的信息删除,而只是将其inode号和数据块号置为了无效,所以当我们删除文件后短时间内是可以恢复的。

 
因为该文件对应的inode号和数据块号已经被置为了无效,因此后续创建其他文件或是对其他文件进行写入操作申请inode号和数据块号时,可能会将该置为无效了的inode号和数据块号给其他地方申请内存使用,此时删除文件的数据就会被其他数据覆盖,因此也就无法恢复文件了。

为什么删除文件很快,拷贝文件很慢?

因为拷贝文件需要先创建文件,然后再对该文件进行写入操作,该过程需要先申请inode号并填入文件的属性信息,之后还需要再申请数据块号,最后才能进行文件内容的数据拷贝,而删除文件只需将对应文件的inode号和数据块号置为无效即可,无需真正的删除文件,因此拷贝文件是很慢的,而删除文件是很快的。

如何理解目录?

在Linux下一切皆文件,目录当然也可以被看作为文件。
目录有自己的属性信息,目录的inode结构当中存储的就是目录的属性信息,比如目录的大小、目录的拥有者等。
目录也有自己的内容,目录的数据块当中存储的就是该目录下的文件名以及对应文件的inode指针。

注意: 每个文件的文件名并没有存储在自己的inode结构当中,而是存储在该文件所处目录文件的文件内容当中。因为计算机并不关注文件的文件名,计算机只关注文件的inode号,而文件名和文件的inode指针存储在其目录文件的文件内容当中后,目录通过文件名和文件的inode指针即可将文件名和文件内容及其属性连接起来。

磁盘格式化:

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

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

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

何陈陈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值