【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,就能够访问文件了

相关推荐
HLC++10 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室11 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy14 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕15 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫16 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生16 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1117 小时前
linux基础IO
linux·运维·服务器
BelongPanda19 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯20 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983420 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器