当前位置: 首页 > article >正文

Linux:Ext系列文件系统

文章目录

  • 前言
  • 一、理解硬件磁盘
    • 1.1 磁盘物理结构
    • 1.2 磁盘的存储结构
    • 1.3 磁盘的逻辑结构
  • 二、文件系统
    • 2.1 引⼊"分区”概念和“块"概念
    • 2.2 inode(重要)
    • 2.3 文件与inode
  • 三、软硬链接
    • 3.1 硬链接
    • 3.2 软链接
    • 3.3 acm
  • 总结


前言

提示:以下是本篇文章正文内容,下面案例可供参考


一、理解硬件磁盘

1.1 磁盘物理结构

在这里插入图片描述
在这里插入图片描述

磁盘可以存储大量的二进制数据,并且断电后也能保持数据不丢失。磁盘通常由盘片、磁头、电机驱动系统和接口等组件构成。盘片是磁盘存储数据的基础,由硬质合金材料或玻璃材料等涂布磁性材料形成。磁头则是读取和写入数据的关键部件,悬浮在盘片上方几微米的距离,可以读取和写入数据。

1.2 磁盘的存储结构

在这里插入图片描述
扇区:是磁盘存储数据的基本单位,通常为512字节,块设备
在这里插入图片描述
在这里插入图片描述
⽂件 = 内容+属性 都是数据,⽆⾮就是占据那⼏个扇区的问题!所以对文件的访问物理上就是找寻扇区的问题。

  • 磁盘容量=磁头数 × 磁道(柱⾯)数 × 每道扇区数 × 每扇区字节数

CHS寻址:

是一种寻址模式,对早期的磁盘⾮常有效,知道⽤哪个磁头,读取哪个柱⾯上的第⼏扇区就可以读到数据了。但是CHS模式⽀持的硬盘容量有限,因为系统⽤8bit来存储磁头地址,⽤10bit来存储柱⾯地址,⽤6bit来存储扇区地址,⽽⼀个扇区共有512Byte,这样使⽤CHS寻址⼀块硬盘最⼤容量为256102463*512B=8064MB(1MB=1048576B)(若按1MB=1000000B来算就是8.4GB)

1.3 磁盘的逻辑结构

对于软件层面上,我们应该这么理解磁盘:将整个磁盘视为一个线性结构的数组,然后每个扇区可以看作为这个数组的下标,数组存储的就是文件数据
在这里插入图片描述
在这里插入图片描述

这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种硬盘寻址模式叫做LBA(Logical Block Addressing),LBA寻址方式将硬盘上的所有扇区依次从“0”开始进行编号,直到硬盘的最大扇区数减1,相比于CHS简化了数据访问过程。
在这里插入图片描述

在磁盘使⽤者看来,根本就不关⼼CHS地址,⽽是直接使⽤LBA地址,磁盘内部⾃⼰会用特定的方法转换。
所以:从现在开始,磁盘就是 ⼀个元素为扇区 的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使⽤磁盘,就可以⽤⼀个数字访问磁盘扇区了。

二、文件系统

章节一我们主要讲解了磁盘的结构和访问里面数据的方式,有了上面对于磁盘的理解,接下来我们自然要来引入磁盘里面的数据,因为我们要对磁盘中的文件进行管理自然要先描述其各种属性,组织起来再管理。

2.1 引⼊"分区”概念和“块"概念

其实磁盘是可以被分成多个分区(partition)的,以Windows观点来看,你可能会有⼀块磁盘并且将分区成C,D,E盘。
软件层面上其实就是定义一个结构体,其中记录每个区的结束和起始LAB,然后定义结构体类数组来存放每一个区

struct partition
{
    int start;
    int end;
}


struct partition   part[n];

其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个”块”(block)。
硬盘的每个分区是被划分为⼀个个的”块”。⼀个”块”的⼤⼩是由格式化的时候确定的,并且不可以更改,最常⻅的是4KB(八个扇区大小),即连续⼋个扇区组成⼀个 ”块”。”块”是⽂件存取的最⼩单位。

注意:

  • 区相当于对整个磁盘做出划分,接着将区划分为块组(block group),块组中每个块都包含了存储文件属性和内容的具体管理方式!!!
  • 磁盘就是⼀个三维数组,我们把它看待成为⼀个"⼀维数组",数组下标就是LBA,每个元素都是扇区
  • 每个扇区都有LBA,那么8个扇区⼀个块,每⼀个块的地址我们也能算出来。
  • 知道LBA:块号=LBA/8
  • 知道块号:LAB=块号*8+n.(n是块内第⼏个扇区)
  • 当我们写入一个文件哪怕只有一个比特位,但是操作系统依然会为我们在硬件上申请四个字节的区域!

在这里插入图片描述

2.2 inode(重要)

文件 = 内容 + 属性 ,而文件内容数据存放在块的Data blocks中,inode存放文件属性(如文件创建日期,权限等),是一个结构体,一般为128字节,一般而言一个文件一个inode

以下图片就是一个被分组涵盖的内容分区,Boot Block涵盖开机关机信息不做赘述,
在这里插入图片描述
inode table:
保存分组内部所有可用的(已经使用+没有使用)的inode。
Data blocks:
保存分组内部所有可用的(已经使用+没有使用)的数据快。
Inode Bitmap:
Inode对应的位图结构。假设inode一共有n个,位图结构中的比特位的个数至少也为n个。
位图中比特位的位置与当前文件的对应的ID是一一对应的,比特位的1和0表示是否被占用。
block Bitmap:
数据块对应的位图结构。位图中比特位的位置和当前data block对应的数据块的位置是一一对应的。

  • 文件属性存储在Inode中,Inode是固定大小,一个人文件,一个Inode。一个文件的所有属性几乎都存储在Inode中,但是文件名并不存储在Inode中。
  • 文件的内容存储在data block数据块中,数据块随着应用类型的变化,大小也会发生变化。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在inode,有一个关于数组块的数组,data block block[15]。个数组元素的个数是固定的。但并表示这个文件可以写入的数据量是一定的。如图:每一个数据块都有自己的编号,这个数组中存放的就是该文件所使用的数据块的编号,通过这个数组就可以实现我们查找内容的行为。虽然只有15元素,但并不代表我们仅可以使用15个数据块。从下表为12的元素开始,所指向的数据块里边保存的是其他数据块的编号,下一级数据块中的内容可以使下下一级数据块的编号。如此,就可以增加我们可使用数据块的个数。
如果一个分组是10GB,但文件大小是20GB,但这影响吗,不影响,因为上面的映射关系是可以跨组访问的,但不建议这么做,因为一旦跨组访问了,意味所有的块不连续了,磁盘寻址效率也会大大降低。

如果要知道inode一共有多少个,没有使用的是多少个,如果通过计算获取结果,效率太低了,这时Group Descriptor Table出现了。

Group Descriptor Table:
包含对应分组的宏观属性信息,包括:一共有多少个数据块,使用了多少;一共有多少个Inode,使用了多少等等。

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

并且超级块通常在分组内多个组有一个超级块,在系统中是有一定比例的,假设我一个100G的分区有1000个分组,每20个分组就有一个super block,那么总共就有50个超级块。为什么需要这些超级块呢?本质上还是为了数据备份,如果某个块组或者inode丢失,那么就 可以通过super block来进行恢复

inode是以分区为单位的,每个区都有自己的inode编号,它们编号可以相同

所以当我们删除一个块(文件内容)的时候,不需要删除块,只需要把对应inode bitmap和block bitmap的位置零即可。

2.3 文件与inode

目录也是文件=属性+内容,目录的内容中放的是文件名和inode的映射关系。inode唯一,文件名也就唯一;查找文件的顺序,先文件名再寻对应的inode编号。这就解释了为什么去掉了目录的r权限,就不能访问目录中的内容了。没有r权限就不能访问文件名和inode的映射关系,就找不到这个文件。w权限:新建文件,最后一定要向当前所处目录内容中写入,文件名和inode的映射关系。

文件的增删查改:

  1. 增加文件:
  • 当在Linux系统中创建一个新文件时,系统会为该文件分配一个唯一的inode号码,并在inode中存储该文件的属性信息。
  • inode数量是有限的,因此当文件系统中的inode耗尽时,即使磁盘空间还有剩余,也无法再创建新文件。
  1. 删除文件:
  • 删除文件时,系统实际上只是删除了文件名与inode号码之间的链接关系,并释放了inode号码和其所占用的磁盘空间。但文件的实际内容在磁盘上仍然存在,直到其占用的磁盘空间被其他文件覆盖。在文件内容上:删除=允许被覆盖!!!
  • 如果删除了一个目录,并且该目录下有子目录或文件,那么该目录下的所有子目录和文件都将被一并删除(除非使用了-r选项来递归删除)。
  1. 查询文件:
  • 查询文件时,系统首先通过文件名找到对应的inode号码,然后读取inode中的信息以获取文件的实际内容位置。(找到指定的文件->文件所在的目录->根据文件名:inode->目标文件的inode,当我们目标文件的路径非常的复杂的时候,OS会做路径的逆向解析,但不是每次都做,OS会对常用的路径做缓存)
  • 使用如ls -i命令可以查看文件的inode号码。
  1. 修改文件:
  • 修改文件时,系统会根据文件的inode号码找到对应的inode,并修改其中的文件属性信息(如修改时间戳、权限等)。
  • 如果修改的是文件的内容,那么系统实际上是在磁盘上找到文件内容所在的块,并直接修改这些块的内容。但inode中的文件字节数等属性信息会相应地更新。

三、软硬链接

3.1 硬链接

我们看到,真正找到磁盘上⽂件的并不是⽂件名,⽽是inode。其实在linux中可以让多个⽂件名对应于同⼀个inode。

[root@localhost linux]# touch abc
 [root@localhost linux]# ln abc def
 [root@localhost linux]# ls -li abc def
263466 abc
263466 def
  • 硬链接不是一个独立的文件,因为它没有独立的inode
    所谓建立硬链接,其实就是在特定的目录下新增文件名和指向文件inode编号的映射关系!!!
  • abc和def的链接状态完全相同,他们被称为指向⽂件的硬链接。内核记录了这个连接数,inode263466的硬连接数为2。
  • 我们在删除⽂件时⼲了两件事情:1.在⽬录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
  • .和. .就是硬链接,硬链接可以做文件备份

3.2 软链接

硬链接是通过inode引⽤另外⼀个⽂件,软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和被引⽤的⽂件的inode不同,应⽤常⻅上可以想象成⼀个快捷⽅式。在shell中的做法

 [root@localhost linux]# ln -s abc.s abc
 [root@localhost linux]# ln -s abc.s abc[root@localhost linux]# ls -li
263563 -rw-r--r--. 2 root root 0 915 17:45 abc
261678 lrwxrwxrwx. 1 root root 3 915 17:53 abc.s -> abc
263563 -rw-r--r--. 2 root root 0 915 17:45 def   //权限后面的数字代表硬链接数目

在这里插入图片描述
软链接其实就相当于增加一个window下的快捷方式

3.3 acm

acm
下⾯解释⼀下⽂件的三个时间:
• Access:最后访问时间
• Modify:⽂件内容最后修改时间
• Change:属性最后修改时间


总结

本文总结了磁盘的物理结构,并抽象为软件层面上的结构,并将这个结构拆分为若干数据结构进行讲解。


http://www.kler.cn/a/430081.html

相关文章:

  • mysql message from server: “Too many connections“
  • android刷机
  • 代码随想录算法训练营第六十天|KM94.城市间货物运输Ⅰ|KM95.城市间货物运输Ⅱ|KM96.城市间货物运输Ⅲ
  • Linux(上):基本知识篇
  • eNSP之家——路由器--入门实例详解
  • C++和Python中负数取余结果的区别
  • 微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算
  • 深度学习(2)前向传播与反向传播
  • Python爬虫——猫眼电影
  • Linux setfacl lsattr chattr 命令详解
  • 什么是 k8s CNI ?
  • 研究生第一篇文献综述怎么写,文献检索,文章整理,文献归纳高效方法小技巧【学习笔记】
  • 解决view-ui-plus 中表单验证不通过问题,select 组件开启multiple模式 总是提示错误,即使不验证也提示,有值也验证失败
  • 亚马逊云科技re:Invent大会:数据与AI如何颠覆企业未来?
  • Tr0ll: 1 Vulnhub靶机渗透笔记
  • 阿里内部正式开源“Spring Cloud Alibaba (全彩小册)”
  • Android问题记录 - Inconsistent JVM-target compatibility detected for tasks
  • 05-树莓派-交叉编译
  • PHP和GD如何给图片添加滤镜效果
  • 【QNX+Android虚拟化方案】134 - QNX侧配置开机自动抓取tcpdump 报文
  • 第一篇:k8s架构与组件详解
  • 自然语言处理:从入门到精通全指引
  • 【LLMs】用LM Studio本地部署离线大语言模型
  • 从零开始的使用SpringBoot和WebSocket打造实时共享文档应用
  • 学生信息管理系统(简化版)
  • 动画Lottie