【Linux-基础IO】磁盘的存储管理详解

磁盘的存储管理

由于一个磁盘中包含了大量的扇区,为了方便管理,我们对磁盘进行了分区,其中每个分区又进一步划分为多个块组(Block Group),每个块组中包含该块组的数据存储情况以及具体的数据

假设有一个800GB的磁盘,先将其划分为5个区,第1个200GB,第2个100GB,第3个150GB,第4个150GB,第5个200GB

由于每个分区的存储空间依然很大,每个分区进一步分为不同的块组(Block Group)

  • Boot Block(引导块)

★ 在许多文件系统中,特别是在类Unix操作系统中,磁盘的第一个块通常是引导块(Boot Block)或引导扇区(Boot Sector)

什么是引导块?

位置:引导块位于磁盘的最开始部分,通常是第一个扇区(Sector),也就是 Cylinder 0, Head 0, Sector 1(CHS地址)或逻辑块地址(LBA)0。
大小:在传统的硬盘上,一个扇区通常是512字节,但现代硬盘可能使用4KB的扇区大小。
功能:引导块包含了启动计算机所需的最基本的代码,这些代码负责加载操作系统的核心(Kernel)到内存中,并开始执行。
内容:
引导加载程序(Boot Loader):例如,Linux系统的GRUB或GRUB2,Windows系统的NTLDR或BOOTMGR。
分区表:磁盘分区的信息,通常在主引导记录(MBR)或全局唯一标识分区表(GPT)中。

引导块与块组的关系

独立性:引导块是独立于文件系统的块组结构的。它不包含在任何一个块组内,因为它需要在文件系统被识别和挂载之前就被执行。
顺序:在启动过程中,计算机的BIOS或UEFI固件首先读取引导块中的代码,然后根据引导加载程序的指示,加载操作系统的其他部分。
保护:由于引导块对于启动过程至关重要,通常会有一些措施来保护它不被意外覆盖或损坏。

引导块与MBR

在传统的MBR(Master Boot Record)分区方案中,引导块通常就是MBR本身,它包含引导加载程序的前446字节和分区表的后64字节,以及一个2字节的结束标志。
在GPT(GUID Partition Table)分区方案中,引导块是独立的,GPT分区表位于磁盘的其它位置。

为什么需要引导块?

启动过程:引导块是启动过程的起点,没有它,计算机无法知道如何加载操作系统。
系统恢复:在系统崩溃或其他问题时,引导块中的代码可以用来恢复系统或进入救援模式。
多系统启动:多引导加载程序(如GRUB)可以驻留在引导块中,允许用户选择要启动的操作系统。

 

★ 每个块组又包含着Block BitMap、Inode BitMap、Inode Table、Data Block、Group Descriper Table还有可能包含Super Block(超级块);接下来我们一个一个介绍

  • Super Block(超级块)

在文件系统中,超级块(Super Block)是一个包含文件系统全局信息的特殊数据结构。它是文件系统元数据的一部分,存储了文件系统的配置参数和总体状态信息。记录的信息主要有:block和inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说是整个文件系统结构被破坏了

但是,Super Block并不是全部都是不一样的,反而在同一个分区中,所有的Super Block内容都是一样的,并且并不是每个块组都有Super Block;有了这个特性,如果某个Super Block损坏,可以使用其他Super Block进行恢复文件系统

  • Group Descriptor Table(组描述符表)

在类Unix文件系统中,组描述符表(Group Descriptor Table)是一个数据结构,它包含了文件系统中每个块组(Block Group)的元数据。组描述符表中的每个条目都对应一个块组,并提供了该块组的管理信息。

组描述符表是文件系统内部结构的一个重要组成部分,它帮助操作系统高效地管理磁盘空间和文件系统元数据。在处理文件系统操作时,组描述符表会被频繁地访问和更新。

组描述符的内容:

块组ID:块组的唯一标识符。
块位图的位置:指向块组中块位图(Block Bitmap)的指针,块位图用于跟踪哪些块是空闲的,哪些是已分配的。
inode位图的位置:指向块组中inode位图(Inode Bitmap)的指针,inode位图用于跟踪哪些inode是空闲的,哪些是已分配的。
inode表的位置:指向块组中inode表的指针,inode表包含了块组中所有inode的列表。
空闲块计数:块组中空闲块的数量。
空闲inode计数:块组中空闲inode的数量。
目录数量:块组中包含的目录数量。
未使用的数据块数量:块组中未使用的数据块数量。
未使用的inode数量:块组中未使用的inode数量。

组描述符的作用:

文件系统结构管理:组描述符表帮助文件系统管理器了解每个块组的结构和状态。
空间分配:在分配新的文件或目录时,文件系统使用组描述符表来确定哪个块组有足够的空闲空间。
文件系统检查:在文件系统检查(如fsck)期间,组描述符表用于验证文件系统的完整性。

 

组描述符与超级块的关系:

超级块(Super Block)包含了整个文件系统的全局信息,而组描述符表则提供了关于各个块组的详细信息。
通常,超级块后紧跟组描述符表,使得文件系统在挂载时可以快速读取到每个块组的信息。

组描述符的备份:

为了提高可靠性,组描述符表通常也会在文件系统中备份。在EXT文件系统中,每个块组都可以包含一个组描述符表的副本。

  • Inode Table(Inode 表、I节点表)

在类Unix文件系统中,inode表(Inode Table)是一个核心的数据结构,它存储了文件系统中的inode(索引节点)列表。每个inode代表了文件系统中的一个文件或目录,并包含关于该文件或目录的元数据。

inode表的内容:简单来说就是存放文件属性的地方

inode编号:每个inode都有一个唯一的编号,用于在文件系统中标识它。
文件类型:指示该inode代表的是文件、目录、符号链接等。
模式(权限):定义了文件或目录的访问权限,如读、写、执行权限。
文件大小:文件的数据大小,以字节为单位。
时间戳:包括创建时间、最后访问时间、最后修改时间。
链接计数:指向该inode的硬链接数量。
文件所有者ID:拥有该文件的用户ID。
文件组ID:拥有该文件的组ID。
数据块指针:指向文件数据块的指针列表。对于小文件,这些指针直接指向数据块;对于大文件,可能包含间接指针和双重间接指针。

inode表的作用:

文件系统元数据管理:inode表是文件系统管理元数据的主要方式,它允许文件系统跟踪每个文件或目录的状态和属性。
文件访问:通过inode,文件系统可以定位文件的数据块,从而实现对文件的读取、写入和执行操作。
目录维护:目录实际上也是文件,它们的inode包含指向构成目录条目的数据块的指针。

inode表与块组的关系:

在像EXT2、EXT3、EXT4这样的文件系统中,每个块组都有自己的inode表,它包含了该块组中所有文件和目录的inode。
inode表的大小取决于文件系统在创建时设置的inode数量。

inode表的特点:

固定大小:每个inode的大小通常是固定的,这取决于文件系统的设计。
有限数量:文件系统在格式化时就会决定最大inode数量,这个数量通常是固定的。

  • Inode BitMap(Inode 位图)

Inode BitMap用于跟踪文件系统中的inode(索引节点)的使用情况。inode位图与块位图(Block Bitmap)类似,但它们跟踪的是inode而不是数据块

inode位图的内容:

位图:inode位图是一个由位组成的数组,其中每个位对应文件系统中的一个inode。
位的状态:
0(或未设置):表示对应的inode是空闲的,尚未分配给任何文件或目录。
1(或已设置):表示对应的inode已被分配,正在被文件或目录使用。

inode位图的作用:

inode分配:当创建新文件或目录时,文件系统会查看inode位图,找到第一个设置为0的位,然后将该位设置为1,并将对应的inode分配给新文件或目录。
inode释放:当文件或目录被删除时,文件系统会将对应的inode位图中的位设置为0,释放该inode,使其可以再次被分配。
文件系统检查:在文件系统检查(如fsck)期间,inode位图用于验证inode的使用情况,确保文件系统的完整性。

inode位图的特点:

紧凑:由于每个inode只由一个位表示,inode位图在磁盘上占用的空间相对较小。
快速访问:文件系统可以快速扫描inode位图,以找到空闲的inode或检查特定inode的状态。

 

  • Data Blocks(数据块)

在文件系统中,数据块(Data Blocks)是用于存储文件实际数据的基本单元。每个文件或目录由一个或多个数据块组成,这些块可以是连续的,也可以是分散的。

数据块的特点:

大小:数据块的大小通常是固定的,并且是在文件系统格式化时确定的。常见的数据块大小有1KB、2KB、4KB等,但在一些现代文件系统中,数据块的大小可以达到更大的值,如8KB、16KB或更大。
地址:每个数据块都有一个唯一的地址或编号,这样文件系统就可以通过inode(索引节点)中的指针来定位和访问这些块。
分配:数据块可以根据需要动态地分配给文件。当文件增长时,文件系统可能会分配额外的数据块来存储新增的数据。

数据块的作用:

存储文件内容:数据块是文件内容实际存储的地方。对于文件来说,数据块包含了文本、图像、视频等用户数据。
存储目录信息:目录也是一种文件,其数据块中存储的是目录条目,这些条目指向其他文件或子目录的inode。

数据块的管理:

块位图:文件系统使用块位图(Block Bitmap)来跟踪哪些数据块是空闲的,哪些是已使用的。
间接指针:对于大文件,inode中的直接指针可能不足以引用所有数据块。因此,文件系统使用间接指针、双重间接指针和三级间接指针来扩展可以引用的数据块数量。

数据块的分配策略:

连续分配:在简单的文件系统中,文件的数据块可能会被分配在磁盘上的连续位置。这种方法可能导致磁盘碎片。
链表分配:文件的数据块通过一个链表链接起来,每个块包含指向下一个块的指针。这种方法可以减少碎片,但可能会影响性能。
索引分配:使用索引块来存储数据块的地址,这样可以通过单个索引块快速访问大量数据块。

数据块的优化:

预分配:某些文件系统允许对预期会快速增长的文件进行数据块的预分配,以减少文件增长时的分配开销。
延迟分配:文件系统可能会延迟实际的数据块分配,直到确实需要写入数据时才进行,这有助于优化磁盘空间的使用。

  • Block BitMap

块位图(Block Bitmap)用于记录数据块的使用情况

块位图的概念:

定义:块位图是一个由二进制位组成的数组,每个位对应文件系统中的一个数据块。
作用:块位图用于指示每个数据块是空闲还是已被占用。

块位图的组成:

位(Bit):块位图中的每个位代表一个数据块的状态。
    0(零):表示对应的数据块空闲,未分配。
    1(一):表示对应的数据块已分配,正在使用中。

块位图的功能:

数据块分配:当文件系统需要为新文件或目录分配数据块时,会检查块位图,找到第一个值为0的位,将其设置为1,并分配相应的数据块。
数据块释放:当文件或目录被删除,或者不再需要某些数据块时,文件系统会将这些数据块对应的位从1改为0,释放这些数据块。
文件系统检查:在执行文件系统一致性检查(如fsck)时,块位图用于验证数据块的正确分配和释放。

块位图在文件系统中的位置:

块组内:在许多文件系统(如EXT系列)中,每个块组都有自己的块位图,只管理该块组内的数据块。
存储位置:块位图通常位于块组的开始部分,紧随超级块和组描述符表之后。

块位图的特点:

空间效率:由于每个数据块只由一个位表示,块位图占用的磁盘空间非常小。
访问速度:文件系统可以快速扫描块位图,以确定数据块的状态。

一个文件只有一个独立的Inode,Inode的设置是以分区为单位的,不能跨分区;Inode存储文件的属性,文件名不是Inode的属性!我们平常找文件使用的是文件名,并不是Inode,文件名与Inode有什么关联呢?我们可以通过ls -li查看当前目录下所有文件的Inode

 也可以通过 stat [文件名]查看某个文件的Inode

在Linux中目录也是文件,目录也有自己的Inode,因为目录也有自己的属性

 

目录也有自己的存储内容,目录的内容是该目录包含了哪些文件。既然有数据,目录也会有自己的数据块,目录的数据块存储着文件名和该文件的Inode映射关系,因此使用者只需要使用文件名就可以访问指定文件了,因为只要有了文件名,就能在当前目录的数据块中找到该文件名映射的Inode,就能够访问文件了 

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

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

相关文章

前端练习小项目 —— 让图片变得更 “色”

前言:相信读者在学习完了HTML、CSS和JavaScript之后已经想要迫不及待的想找一个小型的项目来练练手,那么这篇文章就正好能满足你的 “需求”。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在开始学习…

SpringBoot基础(三):Logback日志

SpringBoot基础系列文章 SpringBoot基础(一):快速入门 SpringBoot基础(二):配置文件详解 SpringBoot基础(三):Logback日志 目录 一、日志依赖二、日志格式1、记录日志2、默认输出格式3、springboot默认日志配置 三、日志级别1、基础设置2、…

Linux中的网络指令:ping、netstat、watch、pidof、xargs

目录 Ping指令 netstat指令 watch指令 pidof指令 xargs指令 Ping指令 功能:检测两台主机间的网络连通性 语法:ping [选项] 目标主机的IP地址 (192.168.1.1)或域名(google.com) 常见选项&#xff1a…

P1010 [NOIP1998 普及组] 幂次方 Python题解

[NOIP1998 普及组] 幂次方 题目描述 任何一个正整数都可以用 2 2 2 的幂次方表示。例如 137 2 7 2 3 2 0 1372^7 2^3 2^0 137272320。 同时约定次方用括号来表示,即 a b a^b ab 可表示为 a ( b ) a(b) a(b)。 由此可知, 137 137 137 可表示…

华为 HCIP-Datacom H12-821 题库 (33)

🐣博客最下方微信公众号回复题库,领取题库和教学资源 🐤诚挚欢迎IT交流有兴趣的公众号回复交流群 🦘公众号会持续更新网络小知识😼 1.VLAN Pool 只要通过一个 SSID 就能够同时支持多个业务 VLAN,从而缩小广播域&#…

draw.io 设置默认字体及添加常用字体

需求描述 draw.io 是一个比较好的开源免费画图软件。但是其添加容器或者文本框时默认的字体是 Helvetica,一般的期刊、会议论文或者学位论文要求的英文字体是 Times New Roman,中文字体是 宋体,所以一般需要在文本字体选项里的下拉列表选择 …

Spring开发最佳实践之跨域处理

1. 跨域处理 1.1 异常现象 1.2 异常原因分析 跨源资源共享的官方定义如下: 跨源资源共享(CORS,Cross Origin Resource Sharing。或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自…

线性代数入门

线性代数入门 线性代数(Linear Algebra)是数学的重要分支之一,广泛应用于工程、计算机科学、物理学、经济学等领域。它主要研究向量、矩阵及其在空间中的变换。对于程序员来说,掌握线性代数的基础知识能够帮助更好地理解数据处理…

[C++]使用纯opencv部署yolov8-cls图像分类onnx模型

【算法介绍】 使用纯OpenCV部署YOLOv8-cls图像分类ONNX模型涉及几个关键步骤。 首先,你需要将YOLOv8-cls模型从PyTorch格式转换为ONNX格式,这是为了确保模型在不同深度学习框架之间的互操作性。这个转换过程通常是通过ultralytics框架中的model.export…

Linux TFTP服务器搭建

话得多说 先水一波字 TFTP(Trivial File Transfer Protocol)是一种简单的文件传输协议。它用于在计算机网络中传输文件,特别适用于在网络设备(如开发板和Linux系统下)代码调试等操作。TFTP使用UDP(User Da…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz 简介适用场景Quartz核心概念Quartz 存储方式Quartz 版本类型引入相关依赖开始集成方式一:内存方式(MEMORY)存储实现定时任务1. 定义任务类2. 定义任务描述及创建任务触发器3.…

C语言的柔性数组

目录 柔性数组1.柔性数组的特点:2.柔性数组的使用3.柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 中,结构体中的最后⼀个元素允许是未知⼤⼩的数组&…

程序员日志之DNF手游女鬼剑异界套选择思路

目录 传送门正文日志1、概要2、剑宗3、剑豪4、剑魔5、暗帝 传送门 SpringMVC的源码解析(精品) Spring6的源码解析(精品) SpringBoot3框架(精品) MyBatis框架(精品) MyBatis-Plus Sp…

STM32 OLED

文章目录 前言一、OLED是什么?二、使用步骤1.复制 OLED.C .H文件1.1 遇到问题 2.统一风格3.主函数引用头文件3.1 oled.h 提供了什么函数 4.介绍显示一个字符的函数5. 显示十进制函数的讲解 三、使用注意事项3.1 配置符合自己的引脚3.2 花屏总结 前言 提示&#xff…

Elasticsearch要点简记

Elasticsearch要点简记 1、ES概述2、基础概念(1)索引、文档、字段(2)映射(3)DSL 3、架构原理4、索引字段的数据类型5、ES的三种分页方式(1)深度分页(fromsize&#xff09…

ndb9300public-ndb2excel简介

1 引言 ndb9300是一个自己定义的机载导航数据库劳作(不敢称为项目)代号,其中3表示是第3种数据库。 多年前,对在役民航客机中的某型机载导航数据库的二进制文件进行分析,弄明白它的数据结构后做了几个工具&#xff0c…

【Flutter】- 核心语法

文章目录 知识回顾前言源码分析1. 有状态组件2. 无状态组件3. 组件生命周期4. 常用组件Container组件Text组件Image组件布局组件row colum stack expandedElevntButton按钮拓展知识总结知识回顾 【Flutter】- 基础语法 前言 Flutter是以组件化的思想构建客户端页面的,类似于…

算法与程序课程设计——观光铁路

观光铁路 一、任务 跳蚤国正在大力发展旅游业,每个城市都被打造成了旅游景点。 许多跳蚤想去其他城市旅游,但是由于跳得比较慢,它们的愿望难以实现。这时,小C听说有一种叫做火车的交通工具,在铁路上跑得很快&#x…

Kubernetes proxy 命令与集群资源交互中起的作用

关于 Kubernetes 中的 kubectl proxy 命令,理解它的作用有助于更深入地掌握 Kubernetes 如何管理集群内的资源,以及开发和调试时如何通过代理来简化交互。kubectl proxy 提供了一种安全且方便的方式来访问 Kubernetes API 服务器,尤其是在调试…

今日指数day8实战补充(上)

1.用户管理 1.多条件综合查询 1.1 多条件综合查询接口说明 1)原型效果 2)接口说明 功能描述:多条件综合查询用户分页信息,条件包含:分页信息 用户创建日期范围 服务路径:/api/users 服务方法&#xff1…