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

news/2024/10/7 16:57:31 标签: linux

磁盘的存储管理

由于一个磁盘中包含了大量的扇区,为了方便管理,我们对磁盘进行了分区,其中每个分区又进一步划分为多个块组(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.niftyadmin.cn/n/5693088.html

相关文章

MobX-Miniprogram:微信小程序的状态管理利器

MobX-Miniprogram:微信小程序的状态管理利器 在开发微信小程序时,随着应用复杂度的提升,状态管理成为了一个不可忽视的问题。传统的通过全局变量或wx.setStorageSync/wx.getStorageSync进行状态管理的方式,不仅代码可读性差&…

进程间通信——《匿名管道》

文章目录 前言:进程间通信介绍进程间通信目的进程之间如何通信?进程间通信分类 管道什么是管道?匿名管道🧨尝试使用:🍗处理细节问题: 🚀管道的4种情况和5种特征:4种情况&…

家庭用超声波清洗机好用吗?推荐四款性能绝佳的超声波清洗机!

在现代社会快节奏的日常中,高效清洁辅助工具成为了众多家庭的追求热点。超声波清洗机,作为集高效与便捷于一体的新兴清洗神器,正逐渐成为大众宠儿。但面对琳琅满目的市场选择,不同的型号搭载多样化的功能设定及波动的价格区间&…

【ECMAScript 从入门到进阶教程】第四部分:项目实践(项目结构与管理,单元测试,最佳实践与开发规范,附录)

第四部分:项目实践 第十四章 项目结构与管理 在构建现代 Web 应用程序时,良好的项目结构和管理是确保代码可维护性、高效开发和部署成功的关键因素。这一章将深入讨论项目初始化与配置,以及如何使用构建工具来简化和优化项目建设过程。 14…

前缀和算法详解

对于查询区间和的问题,可以预处理出来一个前缀和数组 dp,数组中存储的是从下标 0 的位置到当前位置的区间和,这样只需要通过前缀和数组就可以快速的求出指定区间的和了,例如求 l ~ r 区间的和,就可以之间使用 dp[l - 1…

【深度学习】交叉熵

交叉熵(Cross-Entropy)是信息论中的一个重要概念,也是在机器学习和深度学习中用于分类任务的常见损失函数。它衡量的是两个概率分布之间的差异,特别是模型的预测概率分布与真实分布的差异。 交叉熵最初是从信息论引入的&#xff0…

Python小示例——质地不均匀的硬币概率统计

在概率论和统计学中,随机事件的行为可以通过大量实验来研究。在日常生活中,我们经常用硬币进行抽样,比如抛硬币来决定某个结果。然而,当我们处理的是“质地不均匀”的硬币时,事情就变得复杂了。质地不均匀的硬币意味着…

掌握 WPF 开发:基础、数据绑定与自定义控件

WPF(Windows Presentation Foundation)是用于构建现代桌面应用程序的强大框架。它通过 XAML(Extensible Application Markup Language)与丰富的控件体系,提供了灵活的 UI 开发方式。本文将介绍 WPF 的基础知识、XAML 语…