Linux文件:EXT2文件系统工作原理 软硬链接

Linux文件:文件系统究竟是什么?如何管理文件?

  • 前言
  • 一、磁盘结构、存储策略
    • 1.1 磁盘存储结构
    • 1.2 磁盘存储策略
    • 1.3 磁盘的逻辑存储结构
  • 二、如何管理磁盘文件
  • 三、如何管理组
    • 3.1 每个组保存的数据种类
    • 3.2 如何管理数据
      • 1、节点表(inode Table)
      • 2、inode Bitmap
      • 3、Data blocks
      • 4. Block Bitmap
      • 5. Group Descriptor Table
      • 6. 超级块(Super Block)
  • 四、目录、文件名和inode映射关系
  • 五、挂载
    • 5.1格式化
    • 5.2 挂载
  • 六、操作系统查找、打开、创建文件过程
    • 6.1 查找文件
    • 6.2 打开文件
    • 6.3 创建文件
  • 七、软硬链接
    • 7.1 软硬链接创建 及 软硬链接的区别
    • 7.2 软连接和硬链接是啥?

前言

 文件系统用于管理打开的文件(即加载到内存)和未被打开的文件(即磁盘中)。并且计算机中,绝大部分文件时未被打开,存放在磁盘中的!

一、磁盘结构、存储策略

1.1 磁盘存储结构

 磁盘在计算机中被用于存储数据。其中磁盘会被分为多个盘面,每个盘面存在多个同心磁道。而每个磁道会存在很多扇形的扇区。扇区是磁盘的最小存储单元,一般为512Byte。但操作系统一般是每次直接读4Kb。
在这里插入图片描述
在这里插入图片描述

1.2 磁盘存储策略

 如果我们需要像一个扇区中写入数据,如何寻址定位呢?
磁盘采用的是CHS定位法:

  1. C:Cylinder。即数据存储在那个柱面,或者说那个磁道。
  2. HHead,即磁头。磁盘存在多个盘面,每个磁头对应一个盘面。
  3. S:Sector,即扇区。

 当我们确定好待写入区域的盘面,磁道,扇区后,即可准确定位。我们可以向一个扇区写入,就可以向多个扇区写入;也可以连续多个连续扇区写入,当然也可以随机写入!!

1.3 磁盘的逻辑存储结构

 由于磁盘存在多个盘面,我们可以把每个盘面当作数组元素。而每一个盘面存在多个磁道,我们可以将磁道作为盘面数组的数组元素。而每个磁道又由多个扇区组成,同上。最后可以将磁盘盘面抽象为下图的线性空间!!
在这里插入图片描述
 我们将磁盘抽象成一块线性空间后,操作系统可以按扇区进行存储。但一个扇区较小,通常操作系统都是基于文件系统,以文件块(一般为4KB)为单位进行存储!!!最后将磁盘抽象以4KB为单位的数组块。
在这里插入图片描述
最后将对磁盘的管理,在OS层面上转化为对数组的增删查改!!每个块都存在存在一个下标位置,我们将该下标称为逻辑块地址(Logical block address。由于盘面、轨道以及扇区的大小都是固定的,所以当我们得到逻辑块地址后通过转换可以知道数据在那个盘面、那个轨道、那个扇区。即间接通过CSH定位法找到扇区!!

二、如何管理磁盘文件

 常识告诉我们仅通过中央政府来管理一个国家非常困难。所以我国设立了很多地方政府,省份,单独管理。同样直接管理一个省依旧困难,所以我国逐渐细分,设立了市、县、乡…

 同样,磁盘一般为600G往上,非常大。由操作系统直接管理,不仅困难,而且不利于用户使用。所以我们对磁盘进行分区。但分区后还是太大,所以每个区还会被细分为多个组。

 由于所磁盘文件的管理方法是相同的,所以我们仅需管理好一个组后将管理经验迁移。最后将如何管理整个磁盘,转换为如何管理一个组!!

  • 假设现在有一块400G的磁盘,假设每一个分区大小为100G。每一分区被分为50组,即每个组的大小为2G。

在这里插入图片描述

三、如何管理组

3.1 每个组保存的数据种类

 每个组存储的数据无非就两种:文件信息和管理文件的数据。而文件=内容+属性。文件是数据,属性也是数据。并且在Linux中,数据信息和属性信息是分开存储的

3.2 如何管理数据

 通常一个块组中会存在如下字段:

在这里插入图片描述
tips:

  1. Boot Block只存在于第一个分区的开始位置,其中包含引导加载程序,是计算机开机时加载操作系统的核心。 Boot Block中包含了操作系统的内核镜像相关信息、文件系统的类型和初始结构、内核数据在磁盘的大致位置等信息。当计算机启动时,基础IO系统(BIOS)会对磁盘自检,将Boot Block中的引导加载程序记载到内存。完成后,控制器会交给引导加载系统。该系统会根据 Boot Block存放的操作系统相关数据信息,将操作系统加载到内存!!!
  2. inode是啥?

在这里插入图片描述
 上述最前面的数字就是inode一般情况下,每个文件都会有inode,并且每个文件只有一个。在整个分区中,inode具有唯一性。并且在Linux文件,操作系统识别文件和文件名无关,之和inode有关。

1、节点表(inode Table)

inode Table也被称为节点表。每一个成员inode是一个结构体,即struct inode inode_Table[N]。其中存放文件的各种属性:如文件大小、拥有者、所属组、权限、ACM时间、和一个应用计数int ret_count用于表明有多少个文件名的映射关系。其中还存在一个数组,用于标记存放文件数据块的编号。并且inode大小是固定的,为128字节!! 由于inode的大小固定,所以我们很容易通过相对量或偏移量来确定具体的inode!!

 节点表中的下标保存的通常是inode在组内的偏移量,通常在组的开始都存在一个start_inode_number。而当前文件的真实inode则是组起始start_inode_number+ 偏移量!

2、inode Bitmap

 inode本质上就是下标。我们需要为新的文件分配inode,我们在给新文件分配inode前需要得到整个组中inode的使用情况!而inode Bitmap则是用于标记inode。

inode Bitmap也被称为inode位图。通过位图思想,每个bit表示一个inode是否空闲可用。0可用,1已经被使用!

3、Data blocks

Data blocks用于存放文件内容。通常是以4KB为单元仅需存储。
 在节点表中存在一个block[N]数组,用于映射数据块,通常大小为15。但有时15(即15*4KB)的空间无法将文件全部存下。
 所以一般0~12直接映射数据块下标。而block[13]也会映射到Data blocks中。不同的是这块空间(4KB)不是直接用于存储内容的,而是存放映射其他数据块的信息(1000个)。通过二次索引,找到更多数据块用于存放数据!!
 而block[14]被称为三级映射。block[14]映射到的数据块用于保存数据块下标(假设为bk1)。但又该bk1中数据指向的数据块依旧存储的数据块下标(假设为bk2)。只有bk2中映射的才是真正存放数据内容的数据块下标!!
 如果文件实在太大,文件系统指出跨组存储访问!

4. Block Bitmap

 和inode一样,操作系统要为新创建的文件创建文件缓冲区,这也意味着需要为新文件分配块空间。所以我们需要知道块的使用情况!!而块位图Block Bitmap同样利用位图实现,1表示块已经被使用,0则没有。记录整个组中块的使用情况!!

5. Group Descriptor Table

 Group Descriptor Table(GDT):块组描述符,用于描述整个块组的使用情况!比如整个组的起始inode,整个组的大小,inode的个数,inode的使用情况,块组的个数,块组的使用情况等等。

 Group Descriptor Table通常位于文件系统的起始位置或者与文件系统的Super Block相邻的位置。它存储了文件系统中每个Block Group的信息,使得文件系统能够有效地管理数据块的分配和释放,以及inode的分配和管理。

6. 超级块(Super Block)

 存放文件系统本身的结构信息以及整个区的相关信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息和文件系统类型。

 Super Block只在少数几个分组中存在。操作系统需要管理每一个分区,操作系统要对每一个分区的文件系统进行管理。所以操作系统内核中会维护一张文件系统链表,然后将Super Block记载到内存。从而将对整个文件系统的管理,转化为对多个Super Block管理。

 为何每个分区Super Block存在少数几个?在操作过程中,可能由于断电,错误刷盘等问题导致信息错误,从而导致各种问题,甚至无法加载操作系统。为了解决这个问题,我们一般在其他区域保存一些副本,即Super Block存在多个副本。一般某一个Super Block出现问题,我们可以加载其他副本信息,或者通过副本来恢复!!!至于为啥只有少数几个,原因在于如果每个块组都保存一个,刷新成本过高!!

四、目录、文件名和inode映射关系

 对于用户来说,我们查找文件是通过路径加文件名来实现的。但操作系统只认识inode。这也意味只我们需要将路径文件名转换为对应文件inode!

在解决这个问题前先来了解目录是啥?

 Linux下一切皆文件。所以目录也是文件,只是目录文件保存的是目录内部直接保存文件的文件名和inode的映射关系!

 这也是为啥创建文件时名字不能重复。原因在于文件名被作为key,索引对应文件inode,组成键值对!并且在目录下创建文件、删除文件,本质上就是新增或删除键值对,时对文件内容的修改,所以需要w权限!!

 最后我们仅需根据文件路径,从根节点来时一层一层剥开,即可找到目标文件的inode!!至于我们访问文件时,只需通过文件名即可访问。原因在于进程中存在cwd等字段,进程会自动保存路径!

五、挂载

 一个磁盘被分区格式化之后,Linux要使用分区,需要对分区进行挂载!那格式化、挂载是啥?

5.1格式化

 简单来说,我们在使用磁盘加载文件前,我们首先要先将管理磁盘的数据加载到磁盘中,在存放文件。就好比创业,我们需要先决定好管理层,然后才会招聘人员干活一样。
 而仅将管理磁盘的数据写入磁盘的行为则被称为格式化。我们日常说是的格式化不是将数据全部清理,而是将你的文件数据清理,管理磁盘的数据依旧存在!!

5.2 挂载

 通俗来讲,挂载就是将分区和一个目录绑定,在Centos7中我们可以通过df- h查看挂载情况!

在这里插入图片描述
dev/vdal是磁盘的一个分区。图中的意思时将分区dev/vdal绑定到根目录/上。即我们通过访问根目录即可确定待访问的磁盘分区!!

六、操作系统查找、打开、创建文件过程

6.1 查找文件

 首先每一个文件都有绝对路径,我们根据绝对路径的前缀即可确定文件具体所在分区。并且每一个文件都有唯一的inode,每个分区的文件inode编号是唯一的。操作系统拿到inode后,访问Group Descriptor Table,即可确定inode在那个分组中,然后访问到inode Table,进而获取到文件的相关属性信息。在通过block字段可以获取到文件内容存储在Data blocks的位置。进而获取文件内容!

6.2 打开文件

 进程打开文件时,进程中的CWD字段中保存当前的工作路径。结合工作路径和文件名,我们即可确定文件所在分区、分组、inode编号。此时进程会为被打开文件创建一个struct file结构体,通过inode将文件的相关属性加载到内存,填充到struct file结构体中;然后通过inode找到Data blocks,并加载到内存形成文件缓存区!最后按照打开方式会将数据在进程中保存。最后就是对内存缓存区文件的相关操作了!

6.3 创建文件

 创建一个新文件分为以下4个步骤:

  1. 存储属性:内核先找到一个空闲的inode节点,内核把文件信息记录到其中,并修改inode Bitmap。
  2. 存储数据。操作系统会通过 Block Bitmap为文件分配合适的数据块,用于存放文件数据,并修改 Block Bitmap。
  3. 记录分配情况。操作系统会在inode上的磁盘分布区记录数据块对应映射关系。
  4. 添加文件名到目录。Linux会将入口(263466,abc)(文件名和inode的对应关系)加到当前目录文件中。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

七、软硬链接

7.1 软硬链接创建 及 软硬链接的区别

 假设用软链接log.soft.link 链接 log,链接方式如下:

ln -s log log.soft.link

 假设用硬链接txt.hard.link 链接 txt,链接方式如下:

ln  txt txt.hard.link

【最终结构】:
在这里插入图片描述

  1. 所以软连接是一个独立的文件,而硬链接不是,因为硬链接没有对立的inode编号!

7.2 软连接和硬链接是啥?

  1. 软连接类似windows中的快捷方式,是一个独立的文件。软连接中的内容是指向目标文件的路径!
  2. 硬链接不是一个文件,没有独立的inode,所以硬链接是指定目录内容中的一种映射关系,即文件名 <—> inode的映射关系!一个文件真正意义上被删除,就是文件的硬链接数为0,即没有文件和inode的映射关系了!文件名在目录里面具有唯一性,而文件名和inode的索引也类似与指针行为!
  3. 目录文件创建默认硬链接从2开始。原因在于目录文件下默认存在2个隐藏文件,其中.文件表示当前路径,其inode和目录本身inode一样!!并且没多创建一个目录,硬链接数会+1。
  4. 硬链接应用场景就是用于路径切换,用于Linux构造整个路径结构,方便路径回退!
  5. 用户可以对目录建立软连接,但无法建立硬链接。原因在于如果可以建立硬链接会导致下面的环形结构,可能会作为查找时的一个路上节点被使用,使得在查找时无法结束查找工作。至于软连接其本身只是一个文件,查找时不会进入其中!至于Linux中.\和..两个硬链接也会构成环形结构,这是Linux特殊情况!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/791503.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

推荐算法——MRR

定义&#xff1a; MRR计算的是第一个正确答案的排名的倒数&#xff0c;并对所有查询取平均值。它衡量了模型在排序结果中快速找到正确答案的能力。 其中&#xff1a; Q 是查询的总数。ranki​ 是第 i 个查询中第一个正确答案的排名&#xff08;位置&#xff09;。如果第一个正…

设计模式8-桥模式

设计模式8-Bridge 桥模式 由来与目的模式定义结构代码推导1. 类和接口的定义2. 平台实现3. 业务抽象4. 使用示例总结1. 类数量过多&#xff0c;复杂度高2. 代码重复3. 不符合单一职责原则4. 缺乏扩展性改进后的设计1. 抽象和实现分离&#xff08;桥接模式&#xff09;2. 抽象类…

本地部署,GFPGAN: 实用的面部修复算法

目录 什么是 GFPGAN&#xff1f; 技术原理 主要功能 应用场景 本地安装 运行结果 结语 Tip&#xff1a; 在图像处理和计算机视觉领域&#xff0c;面部修复是一个重要且具有挑战性的研究方向。随着深度学习技术的不断进步&#xff0c;许多新的算法被提出&#xff0c;用于…

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现(7000字论文参考+源码+LW+部署讲解)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

打包时提示:Missing Gradle Project Information.或者在加载gradle时出错

1.Android打包弹出错误提示框&#xff1a;missing gradle project information. please check if the IDE successfully synchronized its state with the Gradble project model. 2.加载gradle出错&#xff1a;修复报错后 File -> Sync Project with Gradle Files

【DevOps】在云原生时代的角色与重要性探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是云原生 2、云原生的核心特性 3、什么是DevOps…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 找单词(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

javaweb图书商城系统带万字文档网上书城java项目java课程设计java毕业设计

文章目录 图书商城系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 图书商城系统 一、项目演示 网上书城 二、项目介绍 语言&#xff1a;java 数据库&#xff1a;…

vue2+Dexie.js基本使用——前端大容量存储IndexedDB 的包装库

文章目录 IndexedDB存储IndexedDB常用概念Dexie.js操作流程获取一个数据库实例定义对象存储空间和索引等数据库结构_基本增删查改 IndexedDB 是一个事务型数据库系统&#xff0c;类似于基于 SQL 的 RDBMS。然而&#xff0c;不像 RDBMS 使用固定列表&#xff0c;IndexedDB 是一个…

数据结构 —— BellmanFord算法

数据结构 —— BellmanFord算法 BellmanFord算法检测负权值环BellmanFord和Dijkstra思想上的区别Dijkstra算法的思想Bellman-Ford算法的思想思想上的对比 我们今天来看一个算法BellmanFord算法&#xff0c;我们之前的Dijkstra算法只能用来解决正权图的单源最短路径问题。 Bell…

linux_进程概念——理解冯诺依曼体系结构

前言&#xff1a; 本篇内容是为了让友友们较好地理解进程的概念&#xff0c; 而在真正了解进行概念之前&#xff0c; 要先了解一下冯诺依曼体系结构。 所以博主会先对冯诺伊曼体系结构进行解释&#xff0c; 然后再讲解进程的概念。 ps&#xff1a; 本篇内容适合了解一些linux指…

新兴市场游戏产业爆发 传音以技术抢抓机遇 ​

随着年轻人口的增加以及互联网的普及,非洲、中东等新兴市场正迎来游戏产业的大爆发,吸引着全球游戏企业玩家在此开疆辟土。中国出海企业代表传音以新兴市场需求为中心,秉持本地化创新理念不断加强游戏等关键领域技术攻关凭借移动终端设备为全球玩家带来极致游戏体验,收获了消费…

变位齿轮的齿高好像不变

通过这个软件的计算&#xff0c;变位尺寸的大小径都会同时变化&#xff0c;从而整个齿高好像没有变化。 下面百度答案

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及负荷时空特性的高速公路链式微网光-储-充容量优化配置方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【C++报错已解决】Invalid Use of Incomplete Type

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;完整类型定义2.2 方法二…

【云岚到家】-day05-4-项目迁移-商品搜索

【云岚到家】-day05-4-项目迁移-商品搜索 2 项目迁移-商品搜索2.1 迁移目标2.2 能力基础2.2.1 索引同步方案设计能力2.2.2 Elasticsearch全文检索应用能力 2.3 需求分析2.3.1 界面原型2.3.2 功能列表梳理 2.4 系统设计2.4.1 索引结构2.4.2 索引同步方案2.4.3 搜索自动补全2.4.4…

Java---数组

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 无论c语言还是java数组都是重中之重&#xff0…

解决keil调试遇到的hardlfault问题

在程序开发过程中遇到的程序死机问题 导致死机的原因&#xff1a;内存溢出&#xff0c;堆栈溢出&#xff0c;数组越界&#xff0c;中断错误。。。。。。 出现这个问题&#xff0c;首先查看线程的调度关系 看最后是在哪个位置死机&#xff0c;如果rt_current_thread在main_thre…

视图库对接系列(GA-T 1400)十五、视图库对接系列(本级)删除、取消订阅

说明 之前说了订阅和修改订阅,今天我们来实现删除和取消订阅二个接口。删除订阅 逻辑: 请求下级的接口成功我们就删除数据库的对应数据视图库接口定义 实现 service接口层 //删除订阅ResponseStatusListModeObject deleteSubscribes(String idList, HttpServletRequest re…

MongoDB - 集合和文档的增删改查操作

文章目录 1. MongoDB 运行命令2. MongoDB CRUD操作1. 新增文档1. 新增单个文档 insertOne2. 批量新增文档 insertMany 2. 查询文档1. 查询所有文档2. 指定相等条件3. 使用查询操作符指定条件4. 指定逻辑操作符 (AND / OR) 3. 更新文档1. 更新操作符语法2. 更新单个文档 updateO…