Linux 文件系统

1. 文件元数据

我们使用 ls -l 的时候看到的除了看到文件名,还看到了文件元数据。

每行包含7列内容,分别为 模式,硬链接数,文件所有者,组,大小,最后修改时间,文件名。

ls -l 读取存储在磁盘上的文件信息,然后显示出来。

其实这个信息除了通过这种方式来读取,还有一个  stat + filename  命令能够看到更多信息

2. 文件系统

我们已经知道,文件=内容+属性。在Linux中,文件的内容和属性是分开管理的,因为文件的内容大小是不确定的,而每个文件的具有属性都是相同的,只是属性值不同。Linux把文件的属性放在结构体struct inode中管理。

struct inode 是Linux文件系统中的一个核心数据结构,用于表示文件或目录的元数据。每个文件或目录在文件系统中都有一个唯一的inode号码,该号码由文件系统分配。struct inode 包含了文件的类型、大小、权限、时间戳、链接数(有多少文件名指向这个节点)等信息。

可以通过 ls 的 -i 选项查看文件的inode编号:

接下来我们以Linux ext2文件系统为例简单了解一下文件系统,下图为磁盘文件系统图(内核内存映像肯定有所不同),虽然目前有了最新的ext4文件系统,但其内部管理方式差别不大,均采用inode来唯一标识文件,并通过块(block)来存储文件数据。

一个硬盘可以有多个分区,如电脑中的C盘,D盘,操作系统通过 文件系统来管理一个分区,每个分区都会有一套独立的文件系统。 硬盘分区又被划分为一个个的block。一个block 的大小是由格式化的时候确定的,并且不可以更改。例如 mke2fs -b 选项可以设定block 大小为 1024 2048 4096 字节。而上图中启动块( Boot Block )的大小是确定的。

1. Boot Block,Block Group(分组), Group Descriptor Table 和 Super Block(超级块)

Boot Block用于计算机开机时告知磁盘的分区情况,帮助计算机加载操作系统等。

文件系统整体是由Block Group,Group Descriptor Table 和 Super Block管理的。

Block Group 是文件系统中的一个逻辑结构,用于将文件系统的数据和元数据组织成更小、更易于管理的单元。文件系统被划分成多个 Block Group,每个 Block Group 包含了一定数量的数据块(Data Blocks)、inode 表(Inode Table)、以及用于跟踪这些数据块和 inode 使用情况的位图(Block Bitmap 和 Inode Bitmap)。这种组织方式提高了文件系统的性能,因为它减少了寻道时间和提高了数据的局部性. 
Super Block 是文件系统的全局元数据结构,包含了文件系统的关键信息,如文件系统的大小、块大小、空闲和已使用的块的数量、inode 表的大小和分配情况、文件系统的挂载计数、上次挂载时间、上次检查时间以及文件系统的状态等。Super Block 是文件系统的“控制信息部分”,它位于硬盘分区的开头部分,通常是在第一个 block 中。Super Block 的信息对于文件系统的正常运行至关重要,因此通常会在磁盘的不同位置进行备份,以便在主 Super Block 损坏时可以从备份中恢复。
Group Descriptor Table 包含了文件系统中每个 Block Group 的描述符。这些描述符提供了每个 Block Group 的元数据位置和状态信息,例如每个 Block Group 中的数据块数量、inode 数量、以及指向 Block Bitmap、Inode Bitmap 和 Inode Table 的指针。Group Descriptor Table 通常位于文件系统的 Super Block 之后,并且每个 Block Group 的描述符都包含了指向该 Block Group 自身的指针。

2. inode Table 和 inode Bitmap(inode位图)

Inode Table 包含了文件系统中所有 inode 的实际数据结构,当新创建文件的时候,就需要给这个文件分配一个inode。每个 inode 存储了文件或目录的元数据,如文件权限、所有者、文件大小、时间戳以及指向文件数据块的指针。Inode Table 中的每个 inode 都有一个唯一的编号,这个编号可以通过文件路径或文件名通过文件系统的目录结构来解析,以找到具体的文件或目录信息。

Inode Bitmap 是文件系统中用于跟踪 inode 使用情况的一种数据结构。它是一个位图,其中的每一位对应文件系统中的一个 inode。如果某个 inode 被使用,则相应的位被设置为 1;如果某个 inode 未被使用,则相应的位被设置为 0。Inode Bitmap 允许文件系统快速识别出哪些 inode 是空闲的,从而可以分配给新文件或目录。

3. Data blocks(数据块)和 Block Bitmap(块位图)

我们知道文件=内容+属性,我们已经了解文件的属性被inode管理,而inode被分组中的inodeTable管理。文件中内容则是由 Block Bitmap 与 Data blocks 来管理。

Data blocks是文件系统中用于实际存储文件数据的基本单位。在文件系统中,文件的内容被分割成多个数据块,这些数据块按照文件的逻辑顺序存储在磁盘上。数据块的大小在文件系统格式化时确定,并且对于整个文件系统是固定的。数据块的大小可以影响文件系统的性能,因为它决定了文件存储的最小单位和磁盘I/O操作的效率.。

Block Bitmap是文件系统中用于跟踪数据块使用情况的一种数据结构。它是一个位图,其中的每一位对应文件系统中的一个数据块。如果某个数据块被文件占用,则相应的位被设置为 1;如果某个数据块未被占用,则相应的位被设置为 0。块位图允许文件系统快速识别出哪些数据块是空闲的,从而可以分配给新文件或目录。块位图是文件系统管理存储空间的重要工具,它提高了文件分配和回收的效率.。

现在总结一下刚才讲解的结构:

Boot Block:描述整个硬盘的分区情况,帮助计算机加载操作系统

Super Block:描述一个分区,文件系统的核心

 Group Descriptor Table:宏观描述一个分组

inode Table:存储当前分组所有文件的inode
inode Bitmap:标识当前分组的inode的使用情况
Data Blocks:管理当前分组的数据块
Block Bitmap:标识当前分组的数据块的使用情况

3. 创建新文件过程

创建一个新文件主要有一下4个操作:

1. 存储属性

内核先找到一个空闲的 inode(示例为263466),把文件信息记录到其中。

2. 存储数据

该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。

3. 记录分配情况

文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。

4. 添加文件名到目录

新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

实际上文件名不属于文件的属性,也不存在于inode中。

文件名存在于目录中,而不存在于文件本身。我们通过目录来访问文件名,本质是去目录文件中,通过文件名找到对应的inode编号,然后再访问到文件。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要满血复活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值