【Linux】文件系统

文章目录

上一篇博客讲到了inode,这一期我们继续接着讲。

上一篇博客:【Linux】磁盘结构和文件系统

Group中的组成部分

下面是每个group的组成部分,但是super block不是每个组都有的,这个点后面详谈。

inode table

inode table 是 Linux 文件系统(如 Ext2、Ext3、Ext4)中用于存储 inode 的一张表格。每个 inode 都是文件或目录的元数据存储单元,不直接存储文件内容,而是包含文件属性和指向数据块的指针。

假设上面这张表是inode table,一个数据块是4KB,一个inode是128字节,所以一个数据块可以存储32个inode,那当我们分配inode是如何分配的呢?可以看见在group中还有一个数据结构是inode bitmap。

inode bitmap

inode bitmap 是文件系统中用于管理 inode 分配状态的一种数据结构。在 Linux 文件系统(例如 Ext2、Ext3、Ext4)中,inode bitmap 是块组元数据的一部分,用来跟踪某个块组内 inode 的使用情况。

inode bitmap是专门用来索引inode table位置的位图,在分配inode位置的时候,我们会先在inode bitmap中查看,找一个比特位是0的位置,如果这个位置为0就表示这个位图中对应的inode table中的位置未被使用,所以分配的时候找到为0的位置将其置为1,然后找到inode bitmap对应位置的inode table,然后开辟128字节的inode,将其属性填入到inode当中即可。

data blocks

数据块(Data Blocks) 是文件系统中存储文件内容的基本单元。它们用于保存文件的实际数据部分,包括文本、图片、视频等。

data blocks专门用来存储文件中的数据。

data blocks是以数据块为单位来存储数据的,那么data blocks是如何分配的呢,在group中也有一个位图是掌管data blocks的使用情况的(block bitmap)

block bitmap

Block bitmap 是文件系统中用于管理磁盘空间的另一种位图数据结构。它记录了文件系统中数据块的使用状态,并帮助操作系统高效地分配和释放磁盘空间。

block bitmap的工作原理和inode bitmap类似,当需要分配空间的时候,根据inode中的属性,会现在block bitmap中查找合适的位置,然后将其置为1,然后将这个block bitmap的编号返回给data blocks,在对应的位置将数据写入到数据块中,最后将这个编号返回给inode table当中,将block bitmap中的编号这个属性写入到inode当中

group descriptor table

Group Descriptor Table 是文件系统(特别是如 Ext4 等文件系统)中的一种结构,它用于存储有关文件系统块组(block group)的重要元数据。每个块组都包含文件系统中的一部分数据块、inode、数据块位图、inode 位图等,group descriptor table 则记录这些块组的具体位置和其他必要的管理信息。

group descriptor table这个数据结构是用来记录inode table和data blocks当中的使用情况等功能的。

假如我们创建了一个文件,那么相应的应该有一个inode,这个inode需要给其分配inode table中的位置,所以经过一系列流程之后分配好了,那么在group descriptor table中计数的就需要++,对应的这个文件还有内容,那么对应的记录data blocks的也需要++,如果我们删除一个文件,那么对应的也需要--。

现在创建一个文件的步骤就不是之前的直接在inode bitmap中寻找为0的位置了,现在只需要先查看group descriptor table中inode bitmap的使用情况,如果inode bitmap有剩余,则为其创建inode,接着,在inode bitmap中找到为0的位置将其对应比特位改变为1,然后将inode保存到inode table当中,对应的data blocks也是如此。

super block

super block 是一个关键的数据结构,包含了有关文件系统的元数据。它存储了文件系统的基本信息和管理信息,确保文件系统的有效操作。

super block又称为超级块,主要用于记录描述文件系统的整体状态和基本信息,不是每个group都有super block的,super 也不止一份。

**为什么super block不止一份? **

在文件系统中,superblock 不止一份,主要是为了增加文件系统的 容错性 和 可靠性。通常,文件系统会在不同的位置保存 superblock 的副本,以防止因磁盘损坏或其他硬件故障导致文件系统无法访问。

假如我们将super block存放在区域的前面的单独的一个区域,那么如果这个分区崩掉了,整个文件系统就崩掉了,那如果我们将super block保存在任意位置的不同的组中,每个保存super block都是相同的,都是同一个副本,如果一个组崩掉了,我们只需要拷贝另外的super block进行恢复即可。

理解了每个组中的分块之后我们来讲讲细节

文件系统

关于inode和blocks

inode是以分区为单位的,一个分区可以由一套inode,inode在分配的时候,只需要确定每个组的起始inode即可,对于block号,我们也只需要记录每个组的起始位置的号,这个信息一般记录在GDT当中,当我们查找一个文件的时候,只需要拿到给定的inode,然后拿着这个inode在GDT中查找这个inode是属于哪个分组的,查找到属于哪个分组之后,我们只需要在分组中查找inode即可(注意:我们拿到的inode是处理过的inode,拿到真实的inode需要用我们拿到的inode减去当前组的start_inode),根据inode的编号就可以查到inode,inode中也有block的编号,也可以查找到对应的data blocks。

问题:inode是如何被分配的?

假如inode bitmap是0000 0000(假设),然后我们分配的位置是0000 0100,那么分配的是第三个位置,对于inode bitmap来说这个位置是3,但是对于inode table来说记录的是4,因为start_inode为1,所以加上起始位置的inode就是4,如果在第二个分组,那么分配的是第三个位置那么在inode table中记录的就是10003。

inode编号和块号都是全局建立的

inode和block是如何映射的?

inode当中有15个指针映射到block当中,但是15个够吗?

答案:够的,有十二个直接映射和三个间接映射

12个直接映射

每个指针直接指向文件数据所在的块,缺点就是只适合小文件,索引速度很快。

一级间接索引

inode存储了一个指针指向这个索引块,这个索引块可以指向更多的数据块地址

一个数据块是4KB,一个地址是4字节,1KB是1024字节,所以有4096字节,所以一共可以索引1024个数据块,一恶搞数据块是4KB,所以1024个4KB就是4MB,所以最多可以索引4MB的内容。

二级间接索引

inode当中存储了一个指针,指向一个索引块,该索引块中的每个指针指向另一个索引块,而这些二级索引块才指向数据

按照一级间接索引的算法计算,可以算出可以索引多少数据:4GB

三级间接索引

inode当中存储一个指针,指向一级索引块,一级索引块指向二级索引块,二级索引块指向三级索引块,三级索引块最后指向数据

三级索引可以索引的数据量是:16TB(理论上)。

为什么访问文件的是inode,但是我们操作的是文件名

在Linux系统中一切皆文件,所以目录也是文件。

目录=inode+data block=属性+内容,所以目录也要有对应的数据块,那么目录的数据块中存储的是什么呢?

Linux的目录中存放的是文件名和inode的映射关系,因为同一级目录下不可能存在同名文件,所以索引都是1:1,唯一的。
为什么Linux会这么做呢?

总结

文件系统的结构设计旨在高效地管理数据存储与访问。各个关键组成部分,如 inode 表、inode 位图、数据块和块位图,协同工作以追踪文件数据并确保快速访问。组描述符表和超级块则提供了文件系统组织的元数据。

inode 在文件与物理数据块之间起着重要的映射作用,通过 12 个直接指针、一级、二级和三级间接指针,扩展了文件系统对大文件的管理能力。通过 inode 访问文件,而非文件名,这种设计将文件的元数据与实际内容分离,使系统能够高效地在文件名或文件位置发生变化时检索数据。这种分离的设计使文件系统更加灵活与高效,确保了文件访问与管理的稳定性和扩展性。

相关推荐
Karoku0664 分钟前
【自动化部署】Ansible 基础命令行模块
运维·服务器·数据库·docker·容器·自动化·ansible
清风 00115 分钟前
二、ubuntu单盘改软raid1
linux·运维·ubuntu
海绵波波10719 分钟前
ubuntu检测是否已安装nvidia驱动以及产品类型
linux·运维·ubuntu
hn2zzzz199623 分钟前
全志ubuntu固件烧写工具Livesuit安装
linux·ubuntu
m0_748247801 小时前
如何使用Node.js快速创建本地HTTP服务器并实现异地远程访问
服务器·http·node.js
ccnnlxc1 小时前
prometheus
linux·服务器·prometheus
芜湖_1 小时前
从〇开始深度学习(番外)——快速配置云服务器
服务器·人工智能·深度学习·pycharm·autodl
mzhan0172 小时前
Linux: shell: bash: Makefile:5: *** missing separator. Stop.
linux·运维·bash
手心里的白日梦2 小时前
多线程与线程互斥
linux·服务器·开发语言·网络
Octopus20772 小时前
【Linux】git操作
linux·笔记·git·学习