LInux 文件系统

目录

认识磁盘

初识inode

磁盘的概念

磁盘分区和格式化介绍

文件系统EXT2的存储方案

[Data Blocks : 数据表,存文件内容的区域](#Data Blocks : 数据表,存文件内容的区域)

[inode Table](#inode Table)

[Block bitmap](#Block bitmap)

[inode bitmap](#inode bitmap)

[Group Descriptor Table](#Group Descriptor Table)

[Super Block](#Super Block)

如何理解目录

文件的三个时间


认识磁盘

文件分为磁盘文件和内存文件,内存文件前面我们已经谈过了,下面我们来谈谈磁盘文件

初识inode

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

在命令行当中输入ls -l,即可显示当前目录下各文件的属性信息。

其中,各列信息所对应的文件属性如下:

在Linux操作系统中,文件的元信息和内容是分析存储的,其中保存元信息的结构称之为inode,因为系统当中可能存在大量的文件,所以我们需要给每个文件的属性集中在一起然后起一个唯一的编号,即inode

也就是说,inode是一个文件的属性集合,Linux中几乎每个文件都有一个inode,为了区分系统当中可能存在大量的inode,我们为每个inode数值了inode编号

在命令行当中输入ls -i ,即可显示文件对应inode编号

**注意:**无论文件属性还是文件内容都存储在磁盘中

磁盘的概念

什么是磁盘?

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

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

磁盘的基本概念

磁盘被访问的最基本单元 : 512byte / 4KB

磁盘的寻址方式

对磁盘进行读写操作时,一般有以下几个步骤:

  1. 确定读写信息在磁盘的那个盘面(定位使用哪一个磁头)

  2. 确定读写信息在磁盘的那个柱面

  3. 确定读写信息在磁盘的那个扇区

通过以上三个步骤,最终确定信息在磁盘的读写位置

这种方法也叫:C (cylinder) H (head) S(sector) 寻址方式

磁盘分区和格式化介绍

线性存储介质

理解文件系统,首先我们必须将磁盘想象成一个线性的存储介质,例如磁带,当磁带被卷起来时,其就像磁盘一样是圆形的,当我们将磁带拉直后,它就是线性的

抽象理解磁盘

从逻辑结构来看,磁盘是线性的,所以为了更好的理解磁盘,我们将磁盘理解成一个数组

所以我们可以根据下标28888反推回它在线性结构的那个区域,然后进行访问

**例如:**一个磁盘有5个盘片,每个盘面有2w给扇区每个盘面50个磁道,每个磁道400个扇区

1.确定在那一面

28888 / 20000 = 1面(从第0面开始),它在第一面

2.在哪一个扇区

28888 % 20000 = 8888(在第一面的第8888个扇区)

3.在那个磁道上

8888 / 400 = 22(在第22个磁道上)

4.在这个磁道的那个扇区

8888 % 400 = 88 (在第22个磁道上的第88个扇区上)

以上就是逻辑扇区地址 LAB地址

转换为 物理地址 就是

C磁道:22

H磁头:1

S扇区:88

这就是CHS和LAB的转换

磁盘分区

计算机为了更好的管理磁盘,于是对磁盘进行了分区,磁盘分区就是使用分区编辑器在磁盘上划分几个逻辑部分,盘片一旦划分成数个分区,不同的目录与文件就可以存储进不同的分区,例如:在windows下磁盘一般被分成C盘和D盘两个区域

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

磁盘格式化

当磁盘完成分区之后,我们还需要对磁盘进行格式化处理。格式化-处理就是对磁盘中的分区进行初始化的一种操作,这种操作通常会导致现有的磁盘或分区中所有的文件被清除

简单来说,磁盘格式化就是对分区后的各个区域写入对应的管理信息

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

文件系统EXT2的存储方案

Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化 的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的

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

简述以下启动块(Boot Block)的作用:给操作系统扫描到,让它知道磁盘的相关配置,分区划分,操作系统的位置,它默认处于0面0磁道的1号扇面上,其他的磁道上也可能存在Boot Block

为什么其他分区也存在Boot Block

如果Boot挂掉了,操作系统整个计算机就起不来了文件系统就挂了

**修复:**使用修复工具可以将其他分区中的Boot拷贝会来,从而进行修复

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

其次,每个组块都有相同的组成结构

Data Blocks : 数据表,存文件内容的区域

整个分区大部分的空间其实都在Data Block中

当你在磁盘中创建并打开一个文件时,文件系统会给你分配一个块的空间大小(4KB),每个块中都有自己的数据,就算你往文件中写入了1个字节的内容,该文件也是4KB

**空间浪费:**任何文件基本上只有最后一个块的空间会有浪费

每个块都有自己的编号

怎么找到对应的文件和内容呢?

这时就需要inode Table了

inode Table

inode: 单个文件的所有属性,大小128字节,一般而已一个文件一个inode,一个扇区可以存4个inode

注意: 在Linux中,inode里面不包含文件名,在Linux标识文件名用的是inode编号

文件系统中使用inode结点来描述inode

总结:

文件的属性保存在inode结点里,该结点中有inode编号也有与数据块关联的字段

文件的内容保存在Data Blocks中

怎么知道那些块被使用过,那些快没有被使用?

Block bitmap

**Block bitmap:**块位图中记录着那个Data Block中哪个数据块已经被占用,那个数据块没有被占用

假设:Data当中有15000个数据块,那么对应的Block bitmap中对应的就有15000个比特位,位图通过将使用过的数据块设置为1,来表示该数据块被使用过

inode bitmap

**inode bitmap:**inode位图中记录着,该inode有没有被占用,inode是否合法并且空闲可使用

使用inode编号去就可以到inode bitmap中去查询

Group Descriptor Table

Group Descriptor Table: 块组描述符表,描述该分区某个分组的基本使用情况

Super Block

Super Block(超级块): 文件系统的基本信息,**整个分区的基本使用情况。**记录的信息主要有:一共有多少组,每个组的大小,每个组inode的数量,每个组block的数量,每个组的起始inode,文件系统的类型与名称.... , 所以如果Super block出问题了,文件系统就怕崩了 ,所以系统会在不同的group分区随机安置几个Super block

注意每一个分区再被使用之前,都必须提前先将部分文件系统的属性信息,提前设置进对应的分区中,方便我们后续使用这个分区或者分组

如何理解新建一个文件?

根据文件系统的工作原理:

1.新建:在系统某个路径新建,确认在那个分区,在这个分区中创建文件,在这个分区中获取inode编号,查看GDT(Group Descriptor Table)是否还有inode,然后去inode bitmap查找是否还有最近的没有被使用的inode编号,使用inode编号去inode Table查找对应inode

2.文件写入:给block bitmap说明你想写入文件的大小,遍历位图查看那些块没有被使用,然后将块号放入struct inode中blocks数组中,在跟存入的块号去Data blocks中找到对应的块将文件内容写到块中

以上操作就完成了对文件内容以及属性的新建

如何理解删除一个文件?

根据所处目录查看你在哪一个分区,确定这个文件对应的inode,在对应的inode bitmap中进行索引,将对应比特位由1置0,根据blocks数组中对应的块号去block bitmap中寻找然后把对应的位图中的数据由1置0,至此文件成功删除

以上操作并不是真正删除文件数据,而是将该文件inode编号,数据块号置为无效,并允许该文件被覆盖

如果你误删了重要文件,不要继续进行操作,因为删除文件是可以恢复的,,至于为什么不要继续进行操作,在后续的操作中,你如果创建了文件或者对其他文件进行写入操作,可能会将置于无效的inode编号和数据块分配出去,此时该文件数据被覆盖,就无法恢复文件了

如何查找一个文件?

确定该文件的inode,去对应inode bitmap中检查是否有效,然后去inode Table中找到block数组,再到Data blocks中找到对应块,把块拼接好之后,文件就出来了

如何修改一个文件?

找到文件对应inode,将对应属性进行更新,找到对应数据块,修改对应块的数据

为什么拷贝文件的时候很慢,而删除文件的时候很块?

因为拷贝文件需要先创建文件,然后在对文件进行写入操作,该过程需要去GDT中查看有没有inode,然后到inode bitmap中查看该inode编号是否有效,到inode Table中找到对应inode将文件属性写入,再去Data blocks中申请数据块吗,将块号放入到blocks数组中,最后进行对文件数据的一个拷贝

而删除文件只需要对应的inode号和数据块号置为无效即可,无需真正的删除文件,因此拷贝文件是很慢的,而删除文件很快

就像建楼一样,我们建一栋楼需要很久,而拆一栋楼只需要,再这栋楼上写上一个 "拆" 字即可

如何理解目录

我们知道Linux下一切皆文件,目录也是文件,目录也是属性+内容,也有的inode和数据块

目录的属性存储的就是,目录的大小,拥有者,权限等

目录的数据块存储的是什么?

目录的数据块中,存储的就是该目录下文件的文件名和对应文件的inode指针

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

为什么在同一个目录下不能有同名文件?

在目录下文件名作为Key值可以找到对应的inode,如果key值相同,那么多个文件会对应到同一个inode,在上面的文件系统中我们提到过,一个文件只能有一个inode

目录下没有w权限我们无法创建文件?

没有w权限,该文件的文件名和inode的映射关系无法写到这个目录文件对应的数据块中

目录下,没有r权限,我们无法查看文件

使用ls指令无法看到该文件的属性,读文件以及其它数据时,需要找到对应的inode和数据,但没有r所以读取不到

目录下,没有x权限我们无法进入这个目录

在进行cd 目录名------拿不到对应的目录名,无法对环境变量中PWD作更新,因为没有x权限无法打开文件并更新环境路径

怎么知道这个目录的inode呢?

我们知道目录的数据块中存储的是它其下文件的文件名和inode编号,该目录也是也是一个文件,找它的inode我们需要找到它的上级目录来得到它的inode,上级目录的inode同样的找它的上级目录,一直到往上找一定会找到根目录,根目录是所有目录的父目录,它的inode我们是清楚的,从根目录一直往下找,我们就能找到所有目录的inode,所以这就是为什么我们在访问任何一个路径时一定会带 绝对路径/相对路径的原因

文件的三个时间

在Linux当中,我们可以使用命令stat 文件名 来查看对应文件信息

这其中包含了文件的三个时间信息:

  • Access: 文件最后被访问时间
  • Modify: 文件内容最后修改时间
  • change: 文件属性最后被修改时间

当我们修改文件内容时,文件的大小一般也会随之改变,所以一般情况下Modify的改变会带动Change一起改变,但是修改文件属性一般不会影响到文件内容,所以一般情况下Change的改变不会带动Modify的改变

我们若是想将文件的这三个时间都更新到最新状态,可以使用命令 touch + 文件名 来进行时间更新

**注意:**当某一文件存在时使用touch命令,此时touch命令的作用更新文件信息

相关推荐
Charary16 分钟前
字符设备驱动开发与杂项开发
linux·驱动开发
梦游钓鱼1 小时前
在window终端创建docker容器的问题
运维·docker·容器
孤寂大仙v1 小时前
【Linux笔记】理解文件系统(上)
linux·运维·笔记
沉默的八哥1 小时前
K8S高可用Web应用部署方案
运维
winyh51 小时前
Vite 打包后Nginx部署配置
运维·nginx
钢板兽2 小时前
Java后端高频面经——JVM、Linux、Git、Docker
java·linux·jvm·git·后端·docker·面试
byxdaz2 小时前
NVIDIA显卡驱动、CUDA、cuDNN 和 TensorRT 版本匹配指南
linux·人工智能·深度学习
pyliumy2 小时前
在基于Arm架构的华为鲲鹏服务器上,针对openEuler 20.03 LTS操作系统, 安装Ansible 和MySQL
服务器·架构·ansible
大白的编程日记.2 小时前
【Linux学习笔记】Linux基本指令分析和权限的概念
linux·笔记·学习
运维小贺3 小时前
Nginx常用的模块
运维·nginx·正则表达式