【Linux】深入理解文件系统

系列文章

收录于【Linux】文件系统 专栏

关于文件描述符与文件重定向的相关内容可以移步 文件描述符与重定向操作。

可以到 浅谈文件原理与操作 了解文件操作的系统接口。

想深入理解文件缓冲区还可以看看文件缓冲区


目录

系列文章

磁盘

结构介绍

定位数据

抽象管理

文件系统

分组管理

属性存储

内容存储

深入解析文件操作

如何理解inode

创建和删除文件

文件访问

如何存储大文件


磁盘

🧊以前的文章里,我们只讲了文件在内存中的打开时的状态,而今天便是要讲文件于磁盘中是如何存储的。

🧊相信大家虽然经常在讲磁盘,但是实际上对于磁盘的了解并不多,磁盘又分作机械硬盘与固态硬盘,而我们今天所讲的磁盘是机械硬盘,下面一起先来看看它的基本结构吧。

        

结构介绍

🧊盘片:
磁盘通常由一个或多个盘片组成,这些盘片通常是由金属或玻璃等材料制成的圆形薄片。一个盘片有正反两个面。
🧊磁头:
磁头负责读取和写入数据。每个扇面都有一个磁头,它浮动在盘片表面上方,通过微小的电流在磁盘表面上读写数据。
🧊磁道(柱面):
扇面表面被划分为许多同心圆,每个圆被称为一个磁道。数据被写入或读取时,磁头会在特定磁道上移动。
🧊扇区:
磁道被进一步划分为多个扇区,每个扇区存储一定量的数据。磁盘中存储的基本单元,通常为 512 字节或 4 KB。

🧊总结一下,我们存储的数据就是存在一个个扇区之中,通过磁头来对数据内容进行访问。

定位数据

🧊那我们该如何定义扇区的位置呢?

首先要确定在哪个扇面上(根据磁头),之后确定在哪个磁道(根据半径),最后根据扇区编号定位目标扇区的位置。

🧊因此以后找一个扇区只要

  • 磁道(柱面):  cylinder
  • 磁头:            head
  • 扇区:            sector

🧊而这种定位扇区的方法被称作 CHS 定位法。

抽象管理

🧊而在 OS 内部并不是直接使用 CHS 定位法的。

[原因]:

  • 万一硬件发生变化,则 OS 也要变化,因此 OS 的实现需要与硬件解耦
  • 一个扇区的大小(512B)不足 OS 一次 IO 的最小读取单位(4Kb)。

所以,OS 要有自己的一套地址,来进行块级别的管理。

🧊我们沿着磁道,将磁盘展开将盘面抽象成一个数组。于是,我们定位一个扇区便可定位它的下标,因为 OS 是以 4KB 为单位进行 IO 的,故 OS 读取的数据块要包括 8 个扇区,在 OS 的角度甚至可以不关心扇区。

🧊只需要像计算机常规的访问方式那样: 起始地址 + 偏移量,即获取数据块第一个扇区的地址(下标) + 4KB(块的类型)即能访问的整个数据块。

🧊由此我们便可以通过线性下标定位任何一个块了,而这种 OS 管理磁盘的方式被称为逻辑块地址(LBA)。

🧊从 LBA 出发,我们还能够转化得到扇区的 CHS。

  • C: LBA / 每个面的大小 / 每个磁道的大小
  • H: LBA / 每个面的大小
  • S: LBA % 每个磁道的大小

文件系统

分组管理

🧊学习完上面的知识后,我们知道 OS 通过先描述再组织的方式将磁盘抽象成一个大数组进行管理。

🧊而具体管理的方法,就是我们接下来要讲解的内容了。

由于磁盘抽象成的数组过于庞大,首先第一步就需要将其分作几个区域。每个区域的管理方式都是一样的,因此只要管理好一个区域就相当于管理好整个磁盘了。(类似于 begin 和 end 进行下标的划分)

🧊虽然磁盘已经经历过一次分区,但是每个区的大小依旧十分庞大,我们还需要再进行一次分组

🧊由此管理每个区的任务就简化到了管理每个组只要实现一个组的管理通过复制粘贴就可完成其他组的管理,进而完成整个区的管理,而管理好每个区就相当于管理好了整个盘

🧊在每个区内都会有一个Boot Block,又名为启动块,在开机时会通过它读取 OS 镜像的地址,从而找到操作系统,若是这个区域损坏则会直接影响操作系统的启动

🧊同时,组内还划分了不同的块承担了不同的职责: 

  • Super Block: 存储了文件系统的所有属性信息: 文件系统的类型、整个分组的情况等。
  • Group Descriptor Table: 简称 GDT 又叫做组描述符,内部统计了该组内详细的属性信息,例如: 组内各个块如何划分。
  • Block Bitmap: 块位图,标志数据块是否被使用。
  • inode Bitmap: inode 位图,每个比特位表示 inode 是否可用。
  • inode Table: 专门保存 group 内所有文件的 inode 节点。
  • Data Blocks: 具体的数据块。

🧊其中,Super Block 在每个分组都存在,且统一更新,是为了防止万一其发生损坏导致整个分区都无法使用,因此做了多个备份。

属性存储

🧊我们常说,在文件 = 内容 + 属性,在 Linux 中内容和属性是被分开存储的。

一般而言,一个文件内部所有属性的集合就是 inode 节点(128字节),同时一个文件对应一个 inode

🧊在一个分区中便会有大量的文件,因此就会又大量的 inode,由此需要将 group 中所有的 inode 管理起来,即 inode Table。

其中每个 inode 都有自己对应的编号,也属于对应文件的属性 id。我们可以通过 ls -i 查看文件的 inode 编号。

ls -i     //查看文件的inode编号

🧊在之后的访问中,OS 也是根据 inode 编号来进行文件查找或读取内容。

内容存储

🧊存完属性后,那考虑的便是如何存储文件内容。我们通过数据块来保存文件内容,所以一个有效文件保存内容至少需要 1 个数据块

🧊而数据块在 Data Block 中,那么我们该如何定位文件对应的数据块呢?

🧊其实,在 inode 内部便会存入当前文件对应数据块的索引,之后在 Data Block 中定位即可。可以如此近似理解。

struct inode
{
    int number;
    ...//其他文件属性
    int datablocks[NUM]; 
};

深入解析文件操作

如何理解inode

🧊Linux 系统中只识别 inode 编号,文件的 inode 中并不存在文件名,文件名提供给用户使用的。我们又该如何理解这层关系呢?

🧊创建一个目录文件后,我们可以观察到目录文件也有自己的 inode 编号,那目录中都存了什么数据呢?

🧊实际上,目录的数据块里保存的就是该目录下文件名文件 inode 编号对应的映射关系,二者互为key值。

🧊因此,任何一个文件都应该在一个目录内部。

🧊同时,inode 可以用于确定分组,inode number 在一个分区中唯一有效,不能跨分区。(分组的起始位置 + 位图的位置)

创建和删除文件

  • 当我们创建一个文件时,首先OS 会在 inode Bitmap 找一个未被使用的 inode 编号分配给当前 inode,填入相关信息后置于 inode Table 中。
  • 再根据inode中的属性和 Block Bitmap 的情况分配对应的数据块,并填入 inode 中的索引表中。
  • 最后再更改目录中的内容,将文件名与该文件 inode 关联起来。

🧊删除文件的话只需要修改两个 bitmap 即可,将空间空闲出来,下次便会直接覆盖写入。

🧊同样电脑文件中的删除操作也并不是直接将文件删除,也是调整空间的状态,因此只要这块空间还没有被写入数据,便能够进行恢复。

文件访问

🧊当我们访问文件时:

  • 首先在当前目录下,找到输入文件名对应的 inode 编号。
  • 一个目录一定隶属于一个分区,结合编号在该分区中找到对应分组,在该分组的 inode table 中找到文件的 inode。
  • 通过 inode 与对应的 Data Block 关联起来,于是便找到了相关数据,进而根据命令进行其他操作。

如何存储大文件

🧊若是直接使用 inode 内部的数组直接索引 Data Block 中的内容,假设一个数组可以存 NUM 个内容,是否意味着我们最大只能存 NUM * 4KB 大小的文件呢?

🧊答案是否定的,我们可以使指向的数据块里的内容并非直接的数据,而是其他数据块的编号,由此拓宽文件的存储大小。

🧊这种索引方式称为二级索引

🧊若使用二级索引还是不足以构建出文件,那可以继续套娃,使用三级索引,在数据块中存储二级索引。这样只要磁盘空间允许,便可以构建出足够大的文件。


🧊好了,今天 文件系统 的相关内容到这里就结束了,如果这篇文章对你有用的话还请留下你的三连加关注。

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

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

相关文章

高速电路设计系列分享-电源噪声分析

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示:这里可以添加技术概要 例如: 当今许多应用都要求高速采样模数转换器(ADC)具有12位或以上的分辨率,以便用户能够进行更精确的系统测量。然而,更高分辨率…

【机器学习】机器故障的二元分类模型-Kaggle竞赛

竞赛介绍 数据集描述 本次竞赛的数据集(训练和测试)是从根据机器故障预测训练的深度学习模型生成的。特征分布与原始分布接近,但不完全相同。随意使用原始数据集作为本次竞赛的一部分,既可以探索差异,也可以了解在训…

使用CloudOS快速实现K8S容器化部署

关于容器技术 容器技术(以docker和Kubernetes为代表)呱呱坠地到如今,在国内经历了如下3个阶段: 婴儿期:2014-2016年的技术探索期; 少儿期:2017-2018年的行业试水期; 少年期&…

【Django | 爬虫 】收集某吧评论集成舆情监控(附源码)

🤵‍♂️ 个人主页: 计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。 文章目录 一、爬取帖子、二级评论二、构建数据表三、并入项目1. spider代码2. view视图代码3. 优化后台界面3. urls路由 四、定…

自然语言处理: 第三章NPLM(Neural Probabilistic Language Mode)

理论基础 NPLM的全称是"Neural Probabilistic Language Model",即神经概率语言模型。这是一种基于神经网络的语言模型,用于生成自然语言文本。最早是由Bengio 在2003年的A Neural Probabilistic Language Model一文中提出来的, NP…

【永久服务器】EUserv

1. 请先自行准备网络(我用的伦敦还可以)、以及visa卡,淘宝可以代付,我总共花了97人民币(10.94欧代付费) 现在只能申请一台,多了会被删除,也就是两欧元,然后选择visa卡 选…

MySQL(六):基本的SELECT语句

基本的SELECT语句 前言一、SELECT...二、SELECT ... FROM三、列的别名四、去除重复行五、空值参与运算六、着重号七、查询常数八、显示表结构九、过滤数据 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主&#…

AI2:仅凭开源数据,可达ChatGPT 83%表现

夕小瑶科技说 原创 作者 | Python ChatGPT强大的性能让人爱不释手,ChatGPT迟迟不开源让人恨得牙根痒痒。那仅通过开源数据,能够取得怎样的效果呢?近期,AI2的一篇论文显示,最好的65B规模的模型能够达到ChatGPT表现的8…

【MySQL事务】保证数据完整性的利器

1、事务的认识 事务:事务就是将多个SQL给打包在一起,组成一个整体。组成这个整体的各个SQL,要么全部成功,要么全部失败。 举例说明: 情人节到了,滑稽老铁打算给他女朋友小美发给红包,但是他又害…

Spring 是什么?IoC 和 DI的区别

1. Spring 是什么?2. IoC是什么? 2.DI概念说明 1. Spring 是什么? 我们通常讲的Spring指的是Spring Framework(Spring框架),它是一个开源的框架,有着活跃而庞大的社区,这也是它之所谓经久不衰的原因。官方的解读是:Spring官网 翻译过来就是:Spring使Java编程对每…

优维低代码实践:面包屑配置以及菜单配置

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 优维…

MySQL的版本从5.7跳到了8.0有哪些原因?

MySQL的版本从5.7跳到了8.0的原因? 一、引言1.1、MySQL是什么?1.2、MySQL 5.7和8.0的历史背景 二、MySQL 8.0的新功能2.1、更好的安全性2.2、更高的性能2.3、更好的可扩展性2.4、JSON支持 三、MySQL 8.0的重要改进3.1、更严格的数据类型检查3.2、其他重要…

【CSS3系列】第七章 · 过渡和动画

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

群晖nas(DS423+)和百度云盘互相自动备份

群晖nas提供了云同步功能,使用该功能,可以将百度云盘和群晖nas设置成互为备份,这样我们nas上的的重要数据就有多了一层保护。 通过设置,可以将nas上的某个目录同步到百度云盘的一个目录中,同步的方向可以自行定义&…

五、浅析[ElasticSearch]底层原理与分组聚合查询

目录 一、ElasticSearch文档分值_score计算底层原理1.boolean model2.relevance score算法2、分析一个document上的_score是如何被计算出来的 二、分词器工作流程1.character filter、tokenizer、token filter2、内置分词器的简单介绍3、定制分词器3.1默认的分词器--standard3.…

Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

目录 一、事务的相关配置 1. 添加测试标签 2. 添加对应方法 3. 测试 二、事务的传播行为 三、事务的隔离级别 四、注解配置声明式事务 1. 注册事务注解驱动 2. 加上注解 3. 配置类代替xml文件中的注解事务支持 4. 测试 往期专栏&文章相关导读 1. Maven系列专栏…

【三维编辑】Editing Conditional Radiance Fields 编辑条件辐射场

Editing Conditional Radiance Fields(ICCV 2021) 作者单位:Steven Liu, Xiuming Zhang, Zhoutong Zhang, Richard Zhang MIT, Adobe Research, CMU 代码地址:https://github.com/stevliu/editnerf 文章目录 摘要前言一、相关工作…

23. 数据结构之位图

前言 之前在讲散列表的时候,提到过位图的概念。位图(Bitmap)作为一种特殊的数据结构,它使用一系列位来表示数据,每个位只有两个状态(0或1)。由于它的高效性和节省空间的特性,位图在…

MySQL事务相关笔记

杂项 InnoDB最大特点:支持事务和行锁; MyISAM不支持事务 介绍 一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库。事务有如下特性…

使用传统图像处理算法+机器学习进行shadow detection

前言 阴影是图像中常见的现象,它们对于场景理解和分析非常重要。由于阴影区域通常比较暗淡,而且与周围物体区别较大,因此在图像处理和计算机视觉领域中,阴影检测是一个重要的研究方向。传统的阴影检测算法通常基于阈值或边缘检测…