磁盘的存储管理
由于一个磁盘中包含了大量的扇区,为了方便管理,我们对磁盘进行了分区,其中每个分区又进一步划分为多个块组(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,就能够访问文件了