【Linux】学习-基础IO拓展篇

Linux基础IO拓展篇—详解文件系统

理解文件系统

在Linux基础IO篇中,我们站在用户的视角对文件进行了理解,主要是针对被打开的文件,那么有没有没有被打开的文件呢?当然有!今天我们换个视角,来站在系统的角度侧重于磁盘级别的文件是如何被存储以及管理的

要了解磁盘文件,我们先来了解一下磁盘

磁盘文件

内存是一种掉电且易失存储的介质

磁盘是一种永久性存储介质,类似的还有SSD,U盘,flash卡,光盘,磁带,都是永久性存储介质

磁盘是一个外设,并且是我们计算机内部中唯一的一个机械设备,因此,其速度非常缓慢,所以操作系统一定会有一些提速方式来提高用户体验感。

磁盘基本知识

参考以下博文:

[磁盘的结构](5 分钟图解 磁盘的结构(盘片、磁道、扇区、柱面)_磁道和扇区_一剑何风情的博客-CSDN博客)

硬盘基本知识

了解完基本结构后,我们再来思考,数据存在磁盘的哪里呢?

  • 磁盘的盘面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据

由于磁盘的磁道被分为一个个扇区,每个扇区就是一个“磁盘块‘,并且各个扇区的数据量是相同的(一般是512字节),因此越里面的扇区,其中二进制数据就越密集,越往外则相反。

如何在磁盘中读写数据?

  • 需要把”磁头“移动到想要读/写的扇区所在的磁道,磁盘会在音圈马达的带动下转起来,让目标扇区从磁头下划过,才能完成对扇区的读/写操作。

磁盘的物理寻址方式?—CHS寻址方式

  • 我们可以用柱面号,盘面号,扇区号来定义任意一个”磁盘块“。这个块号就可以转换成地址的形式

  • 根据此地址,我们就能读取一个”磁盘块“

  • 先根据”“柱面号”移动磁臂,让磁头指向指定柱面

  • 再根据“盘面号”激活指定盘面对应的磁头

  • 最后根据“扇区号”,在磁盘旋转时,指定的扇区会从磁头下面划过,这样就成功找到地址并完成读/写

文件元

文件由文件内容和文件属性构成,其中文件属性正是描述此文件的一些基本信息,比如文件名,大小以及创建时间,文件的属性由被称为元信息,也叫文件元数据:

当我们使用命令ls -l 显示的信息正是文件的属性—文件元信息:每行包含七列,其中有:

  • 模式
  • 硬链接数
  • 文件所有者
  • 大小
  • 最后修改时间
  • 文件名

image-20230925175431180

文件元还能通过命令stat来读取更详细的信息:

image-20230925210039170

文件内容与文件属性在磁盘中是分开存储的,其中保存文件元信息的结构为inode,称之为文件的编号,这个编号在所有的文件中是唯一且每个文件都有:

使用命令:ls -i 就可以查看每个文件对应的inode编号:

image-20230925205657236

在详细介绍inode之前,我们先来了解一下文件结构

文件系统

前面我们提到过,数据是存储在磁盘的盘面上的,而想要进行文件的读/写操作则通过CHS寻址法来找到对应的“磁盘块”。

那这种寻址法究竟是如何做到的呢,整个文件系统又是如何运作起来的呢?

我们不妨可以这样想象一下,磁盘是圆的,但我们可以将其向磁带一样抽象成线性结构,也就是将原本是圆形的磁盘拉成直带:

image-20230925210758095

image-20230926123047517

经过这样一个抽象的过程,我们可以将磁盘的管理,想象成对这个数组结构的管理,而CHS寻址方式,就是通过一系列操作,将数组下标转化成对应的柱面号,盘面号以及扇区号,这样一来,想要访问一个扇区,只需要知道数组下标即可

  • 将数据存储到磁盘,也就是将数据存储到数组
  • 找到磁盘特定的扇区位置,就变成了找到数组的特定位置
  • 对磁盘的管理也变成了对数组的管理

在我们的电脑中,有分为C盘和D盘,这又是什么意思呢?难道指的是哪个盘号吗?当然不是!磁盘会根据用户使用情况,进行磁盘分区,因此磁盘也叫块设备,分区的单位为扇区,也就是说,若磁盘上一共分了100个扇区,那么会根据用户的情况,将这100个盘区进行划分管理,比如C盘占有80个扇区,而D区占有20个扇区,这就是磁盘分区,

image-20230926123135512

这样一来,对磁盘的管理,又变成了对每个分区的管理,而每个分区都会初始化,也就是磁盘格式化,会对每个分区又进行细分管理,这就相当于磁盘是一个国家,而扇区相当于国家占有的面积的划分单位,国家又细分成省份,各个省份的占地面积都不同,也就是分到的扇区大小各异,而省份又会被分为各个市,也就是分区也是要被分出来管理的,但每个分区的管理框架都一样,只是填入的信息不同:

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

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。

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

  • GDT,Group Descriptor Table:块组描述符,描述块组属性信息

  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用

  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。

  • i节点表(inode Table):存放文件属性 如 文件大小,所有者,最近修改时间等

  • 数据区(Data blocks):存放文件内容

  • Super Block

Super Block是需要被备份的,因为磁盘有可能会出现物理上的数据丢失,其里面记录的整个文件分区的属性集合就会随之丢失,因此在每一个分区中都会有Super Block的备份,并且因为记录的都是整个分区的属性集合,因此看起来会很冗余,但也大大加强了对文件系统属性信息的保护。

  • Data block

数据块是多个4KB(扇区*8)大小的集合,保存的都是特定文件的内容

为什么不以扇区大小为单位?

  • 虽然磁盘的基本单位是扇区(512字节),但是操作系统(文件系统)和磁盘进行IO的基本单位是4KB,因此磁盘又被称为块设备,如果以512字节为单位进行IO会导致多次的IO,进而导致效率的降低。还有一个原因就是如果操作系统和磁盘使用一样的大小,如果换了磁盘使得磁盘大小变化,那么操作系统的源代码也得跟着变化,所以这样做有利于软硬件之间的解耦合。

  • inodeTable

前面我们提到过,Linux下文件内容与文件属性在磁盘中是分开存储的,其中保存文件元信息的结构为inode,称之为文件的编号,这个编号在所有的文件中是唯一且每个文件都有。

inode本质究竟是什么?

inode是一个大小为128字节的空间,保存的是对应文件的属性,inodeTable其实就是所有文件的inode空间的集合,由于每个文件都对应自己的属性,且inodeTable块组内存在着所有文件的inode空间与文件一一对应,因此这些空间是需要被标识且具有唯一性,也就是每一个inode空间都要对应一个inode编号,这样才能将文件对应的文件属性与inode联系起来并将文件属性保存在inode内。

一般而言,一个文件一个inode,一个inode编号,文件内容就在datablock中申请空间并写进去

  • Blockbitmap

blockbitmap利用位图的思想用来判断datablock有没有被占用,假设有100个datablock,就有100个比特位,每个比特位和特定的block是一一对应的,若比特位被置为1则表示该block被占用

  • inodebitmap

同理blockmap,inodebitmap也是利用了位图的思想,不过是用来判读inode空间有没有被占用

  • Group descriptor table

块组描述符,用来描述块组大小,已用空间,inode个数,被占用inode个数,剩余inode个数,datablock个数等到信息

一个文件只有对应一个inode编号,那只能有一个datablock吗?

肯定不是的!因为inode是描述文件属性的,文件的属性当然只能是特定的,因此只对应一个inode空间,在inode空间会存放该文件对应在数据块中申请的内容空间的位置,以此来找到对应的文件内容:

struct inode
{//文件大小//文件inode编号//其他属性//存放文件内容的数据块的位置int blocks[SIZE];   
};

创建一个文件,系统做了什么?又是如何将文件内容与属性分开存放的?

主要有四个操作:

  • 存储属性

    内核先遍历inodebitmap,找到一个空闲的i节点(这里是263466)并将此比特位置为1。然后在inodeTable中,找到此inode对应的inode空间,内核把文件信息记录到其中。

  • 存储数据

    该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据

    复制到300,下一块复制到500,以此类推。

  • 记录分配情况

    文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。也就是将块编号填入了inode中

  • 添加文件名到目录

    新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文

    件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

理解创建文件名的最后一步:添加文件名到目录

  • 目录本身也是文件,有自己的datablock,其datablock中存储的是目录存放的文件的文件名与inode间的映射关系,因此创建文件最后一步,就是要把文件名与inode的映射关系通过写到磁盘上目录对应的datablock中,因此同一目录下文件名不能重复也就是因为inode是唯一的。这也能解释为什么创建文件要有写权限,访问文件名需要有r权限,因为创建文件就是对目录文件的datablock进行写入的过程!访问文件名则需要到目录文件的datablock读的过程!

为什么删除文件比创建文件快?

  • 因为删除文件只需要将inodebitmap中对应的inode编号和blockbitmap对应的数据块位置 置为0->无效化。而inodeTable中对应的inode空间和datablock中的内容是不做处理的,因为不需要,他们是可以被覆盖写的,所以删除文件速度快,顺便说一下,如果误操作删除了文件,短时间内是可以恢复的,只要不进行创建文件等操作将被删除的inode号申请走了并进行了覆盖,在下一次被覆盖之前,都可以恢复。

以上就是文件系统的全部内容,如果有帮助的话,你的三连是我学习的最大动力!如果有不正确的内容,欢迎批评指正!!

软硬链接

是不做处理的,因为不需要,他们是可以被覆盖写的,所以删除文件速度快,顺便说一下,如果误操作删除了文件,短时间内是可以恢复的,只要不进行创建文件等操作将被删除的inode号申请走了并进行了覆盖,在下一次被覆盖之前,都可以恢复。

以上就是文件系统的全部内容,如果有帮助的话,你的三连是我学习的最大动力!如果有不正确的内容,欢迎批评指正!!

软硬链接

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

95.网游逆向分析与插件开发-游戏窗口化助手-窗口化助手显示与大小调整

内容参考于:易道云信息技术研究院VIP课 上一个内容:地图数据获取的逆向分析与C代码还原 码云地址(游戏窗口化助手 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:e85c0fc8b85895c8c…

备战蓝桥杯---数学基础3

本专题主要围绕同余来讲&#xff1a; 下面介绍一下基本概念与定理&#xff1a; 下面给出解这方程的一个例子&#xff1a; 下面是用代码实现扩展欧几里得算法&#xff1a; #include<bits/stdc.h> using namespace std; int gcd(int a,int b,int &x,int &y){if(b…

【MySQL】MySQL函数学习和总结

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-Ny0xnYjfHqF7s3aS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Springboot+vue的社区智慧养老监护管理平台设计与实现(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的社区智慧养老监护管理平台设计与实现&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的社区智慧养老监护管理平台设…

OpenAI推出ChatGPT已经过去一年多了,AI 取代了内容创作者吗

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

OnlyOffice-8.0版本深度测评

OnlyOffice 是一套全面的开源办公协作软件&#xff0c;不断演进的 OnlyOffice 8.0 版本为用户带来了一系列引人瞩目的新特性和功能改进。OnlyOffice 8.0 版本在功能丰富性、安全性和用户友好性上都有显著提升&#xff0c;为用户提供了更为强大、便捷和安全的文档处理和协作环境…

CentOS在VMWare中扩容

1.相关概念 物理卷&#xff1a;简称PV&#xff0c;逻辑卷管理中处于最底层&#xff0c;它可以是实际物理硬盘上的分区&#xff0c;也可以是整个物理硬盘&#xff0c;一块硬盘&#xff0c;或多块硬盘&#xff0c;如/dev/sdb。 卷组&#xff1a;简称VG&#xff0c;建立在物理卷之…

配置VMware实现从服务器到虚拟机的一键启动脚本

正文共&#xff1a;1666 字 15 图&#xff0c;预估阅读时间&#xff1a;2 分钟 首先祝大家新年快乐&#xff01;略备薄礼&#xff0c;18000个红包封面来讨个开年好彩头&#xff01; 虽然之前将服务器放到了公网&#xff08;成本增加了100块&#xff0c;内网服务器上公网解决方案…

HarmonyOS 状态管理装饰器 Observed与ObjectLink 处理嵌套对象/对象数组 结构双向绑定

本文 我们还是来说 两个 harmonyos 状态管理的装饰器 Observed与ObjectLink 他们是用于 嵌套对象 或者 以对象类型为数组元素 的数据结构 做双向同步的 之前 我们说过的 state和link 都无法捕捉到 这两种数据内部结构的变化 这里 我们模拟一个类数据结构 class Person{name:…

Java 学习和实践笔记(3)

安装和配置成功&#xff1a; 运行第一个程序时出现这个错误&#xff1a;javac不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 找到这篇文章看了下&#xff1a;javac 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。_javac 不是内部或外部…

假期day5

TCP UDP区别 共同点&#xff1a;都是属于传输层的协议 TCP&#xff1a;稳定。面向连接的&#xff0c;有可靠的数据传输服务。传输过程中数据无误&#xff0c;无丢失&#xff0c;无失序&#xff0c;无重复。传输效率低&#xff0c;耗费资源多。数据收发不同步&#xff0c;有沾…

从源码学习final的使用

从源码学习final的使用 final的作用 ​ final字面意思&#xff0c;意为最终的、不可变的。在Java中&#xff0c;final可以用来修饰类、方法和变量&#xff0c;可以分别起到不同的作用。 final修饰类&#xff1a;表示该类不可以被继承&#xff1b;final修饰方法&#xff1a;表…

Netty Review - NioEventLoopGroup源码解析

文章目录 概述类继承关系源码分析小结 概述 EventLoopGroup bossGroup new NioEventLoopGroup(1); EventLoopGroup workerGroup new NioEventLoopGroup();这段代码是在使用Netty框架时常见的用法&#xff0c;用于创建两个不同的EventLoopGroup实例&#xff0c;一个用于处理连…

【Linux】内核中的链表

&#x1f525;博客主页&#xff1a;PannLZ &#x1f38b;系列专栏&#xff1a;《Linux系统之路》 &#x1f94a;不要让自己再留有遗憾&#xff0c;加油吧&#xff01; 文章目录 链表1.创建和初始化2.创建节点3.添加节点4.删除节点5.遍历 链表 内核开发者只实现了循环双链表&am…

1. pick gtk dll 程序的制作

文章目录 前言预览细节要点初始窗口尺寸提示音快速提示信息对话框AlertDialog鼠标移入移出事件布局与父子控件关系图片 后续源码及资源 前言 在之前的打包测试中我提到了需要一个挑选dll的程序于是我打算用Gtk来制作这个程序 预览 细节要点 初始窗口尺寸 只有主窗口有set_d…

基于无线传感器网络的LC-DANSE波束形成算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1LC-DANSE算法原理 4.2 LCMV算法原理 5.完整程序 1.程序功能描述 在无线传感器网络中&#xff0c;通过MATLAB对比LC-DANSE波束形成算法和LCMV波束形成算法。对比SNR&#xff0c;mse等指标…

Java中的IO介绍

本章内容 一 、File概念 File可以代表一个目录或者一个文件&#xff0c;并不能代表文件的内容 文件和流的区别&#xff1a;File关注的是文件本身的特征&#xff0c;如名称、路径、修改时间、大小。 流关注的是文件的内容。 二、File基本的操作 常见构造方法 | File(String p…

以用户为中心,酷开科技荣获“消费者服务之星”

在企业顺应消费升级的道路中&#xff0c;企业自身不仅要着力强化对于消费者服务意识的提升&#xff0c;并且要树立诚信自律的行业示范带头作用&#xff0c;助力消费环境稳中向好&#xff0c;不断满足人民群众对美好生活的期待。企业的发展需要消费者的认可&#xff0c;酷开科技…

常见的单片机及其功能

在当今电子技术快速发展的时代&#xff0c;单片机作为核心组件&#xff0c;在各类电子项目和产品中扮演着至关重要的角色。它们的应用范围从简单的家用电器控制到复杂的工业自动化系统&#xff0c;几乎无处不在。接下来&#xff0c;我们将以轻松的语言&#xff0c;探讨几种广泛…

放大器设计

目录 简介单阶段放大器:低噪声放大器例题例题2例题3简介 放大器能够放大信号,是电路设计中不可或缺的一种重要软件。根据应用和结构的不同,可以将放大器分为三类。 小信号:设计目标是在输入输出匹配条件下,获取一个特定的传输增益,对输出信号的功率没有要求。低噪声:相…