《C++11:function和bind》

核心内容摘要

BGE-Reranker-v2-m3模型加载慢?缓存机制优化教程
某大厂提示工程架构师分享:提示系统集成测试的秘诀

3步搞定:Ollama部署Granite-4.0-H-350M文本生成模型

目录前言

文件系统的三大核心基础概念

1 块Block文件存储的 “最小单元”

1.

1 块的核心特性

1.

2 实战查看文件的块信息

2 分区Partition磁盘的 “逻辑割据”

1.

1 分区的核心特性

1.

2 分区与块的关系

1.

3 实战查看磁盘分区信息

3 inode索引节点文件的 “身份证 户型图”

1.

1 inode 的核心特性

1.

2 inode 的结构Ext2 为例

1.

3 实战查看文件的 inode 信息

Ext2 文件系统基于块组的高效架构设计

1 Ext2 文件系统的宏观结构

2 块组Block GroupExt2 的 “最小管理单元”

3 Ext2 文件系统的核心优势

2.

1 高效的资源管理

2.

2 高可靠性

2.

3 良好的扩展性

总结前言在 Linux 世界中Ext 系列文件系统是当之无愧的 “存储基石”而 Ext2 作为该系列的经典代表其设计思想直接影响了后续的 Ext

Ext4 版本。

我们每天用touch创建文件、用cp复制数据、用ls查看目录这些操作的底层都依赖于 Ext2 文件系统的架构设计。

但你是否好奇文件的属性和内容是如何分离存储的“块” 和 “inode” 到底是什么角色Ext2 如何通过 “块组” 实现高效的磁盘管理今天这篇文章我们就从基础概念出发一步步揭开 Ext2 文件系统的神秘面纱带你完成从 “知其然” 到 “知其所以然” 的跨越。

下面就让我们正式开始吧

文件系统的三大核心基础概念在深入 Ext2 文件系统之前我们必须先搞懂三个核心基础概念 ——块Block、分区Partition、inode索引节点。

这三个概念就像盖房子的 “砖块”“地基” 和 “户型图”是理解 Ext2 架构的前提。

1 块Block文件存储的 “最小单元”我们知道磁盘的最小物理存储单位是扇区Sector每个扇区固定为 512 字节。

但如果操作系统每次都以扇区为单位读写数据效率会非常低下 —— 想象一下拷贝一个 1GB 的文件需要读写 200 多万个扇区这对磁盘的机械结构磁头移动、盘片旋转是巨大的负担。

为了解决这个问题文件系统引入了块Block的概念将多个连续的扇区 “打包” 成一个更大的存储单元这个单元就是块。

块是文件系统中文件存取的最小单位其大小在格式化时确定一旦确定后不可修改常见的块大小为 4KB即 8 个连续扇区。

1.

1 块的核心特性大小固定格式化时指定如 1KB、2KB、4KB、8KB4KB 是最常用的选择兼顾了小文件存储效率和大文件读写性能连续扇区组成一个块由多个连续的扇区构成例如 4KB 块 8 × 512 字节扇区地址可计算每个块都有唯一的块号块号与扇区的 LBA 地址可以相互转换块号 LBA 地址 ÷ 每块扇区数LBA 地址 块号 × 每块扇区数 块内扇区偏移读写原子性文件系统对块的读写是原子操作要么完整读写一个块要么失败保证数据一致性。

1.

2 实战查看文件的块信息在 Linux 系统中我们可以通过stat命令查看文件的块相关信息。

例如查看一个名为main.c的文件stat main.c命令输出示例关键信息解读Size: 488文件实际大小为 488 字节Blocks: 8文件占用 8 个 “磁盘块”这里的 “Blocks” 是指文件系统的块每个块 4KB8 个块实际占用 32KB 空间IO Block: 4096文件系统的块大小为 4096 字节4KB。

为什么 488 字节的文件会占用 8 个块因为文件系统是以块为单位分配存储空间的即使文件大小不足一个块也会占用一整个块这就是 “内部碎片” 的来源。

2 分区Partition磁盘的 “逻辑割据”一块物理磁盘的容量可能很大如 1TB、2TB如果将所有数据都存储在一个 “大空间” 里会导致文件系统管理混乱、查找效率低下同时也存在数据丢失的风险一旦文件系统损坏所有数据都可能丢失。

为了解决这个问题我们引入了分区Partition的概念将物理磁盘划分为多个独立的 “逻辑区域”每个分区可以单独格式化、单独管理就像把一个大仓库分割成多个小房间每个房间独立使用。

1.

1 分区的核心特性最小单位是柱面分区的划分以 “柱面Cylinder” 为最小单位因为柱面是磁盘的逻辑结构同一柱面的扇区访问效率最高独立文件系统每个分区可以格式化不同的文件系统如 Ext

Ext

NTFS、FAT32互不影响隔离性一个分区的文件系统损坏不会影响其他分区的数据容量可计算分区的容量 结束柱面号 - 起始柱面号 1× 每个柱面的扇区数 × 每扇区字节数。

1.

2 分区与块的关系分区是块的 “上层容器”一个分区被格式化后会被划分为多个连续的块块的编号在分区内从 0 开始递增不同分区的块编号相互独立即块号不能跨分区。

例如一块 100GB 的磁盘被划分为两个分区C 盘50GB和 D 盘50GB。

C 盘格式化后有 12,207,037 个 4KB 块编号

D 盘格式化后也有 12,207,037 个 4KB 块编号

两个分区的块编号互不干扰。

1.

3 实战查看磁盘分区信息在 Linux 系统中fdisk命令是查看磁盘分区信息的常用工具fdisk -l命令输出示例Disk /dev/vda:

4

9 GB, 42949672960 bytes, 83886080 sectors Units sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000b2d99 Device Boot Start End Blocks Id System /dev/vda1 * 2048 83875364 41936658 83 Linux关键信息解读Disk /dev/vda:

4

9 GB物理磁盘/dev/vda的总容量为

4

9GBSectors: 83886080磁盘总扇区数为 83,886,080 个Device /dev/vda1第一个分区逻辑设备名Start: 2048分区起始扇区LBA 地址 2048End: 83875364分区结束扇区LBA 地址 83,875,364Blocks: 41936658分区包含的块数这里的Blocks是指 512 字节的 “扇区块”实际容量 41,936,658 × 512 字节 ≈ 20GBSystem: Linux分区类型为 Linux通常对应 Ext 系列文件系统。

3 inode索引节点文件的 “身份证 户型图”我们知道文件 数据内容 属性元信息。

文件的数据存储在 “块” 中那么文件的属性如文件名、所有者、权限、创建时间、大小、占用的块号等存储在哪里呢答案是inode索引节点inode 是文件系统中存储文件属性的 “数据结构”每个文件对应一个唯一的 inodeinode 就像文件的 “身份证”唯一标识和 “户型图”记录数据存储位置。

1.

1 inode 的核心特性属性与内容分离文件的属性存储在 inode 中数据存储在块中两者通过 inode 中的 “块指针” 关联唯一 inode 号每个 inode 有一个唯一的编号inode 号inode 号是文件的唯一标识文件名只是 inode 的 “别名”固定大小inode 的大小在格式化时确定通常为 128 字节或 256 字节无论文件大小如何其 inode 大小都固定不存储文件名文件名不存储在 inode 中而是存储在目录文件的数据块中目录本质是 “文件名→inode 号” 的映射表。

1.

2 inode 的结构Ext2 为例Ext2 文件系统的 inode 结构定义在 Linux 内核源码中struct ext2_inode核心字段如下C 语言代码#include stdint.h // Ext2 inode结构简化版 struct ext2_inode { uint16_t i_mode; // 文件类型与权限如

0755 uint16_t i_uid; // 所有者ID低16位 uint32_t i_size; // 文件大小字节 uint32_t i_atime; // 最后访问时间时间戳 uint32_t i_ctime; // 创建时间时间戳 uint32_t i_mtime; // 最后修改时间时间戳 uint32_t i_dtime; // 删除时间时间戳未删除时为0 uint16_t i_gid; // 所属组ID低16位 uint16_t i_links_count; // 硬链接数 uint32_t i_blocks; // 占用的块数以512字节为单位 uint32_t i_flags; // 文件标志如是否为目录、是否加密等 union { struct { uint32_t l_i_reserved1; } linux1; // 其他操作系统相关字段略 } osd1; // 操作系统相关字段 uint32_t i_block[15]; // 块指针12个直接块 1个一级间接块 1个二级间接块 1个三级间接块 uint32_t i_generation; // 文件版本用于NFS uint32_t i_file_acl; // 文件ACL访问控制列表 uint32_t i_dir_acl; // 目录ACL uint32_t i_faddr; // 碎片地址 union { struct { uint8_t l_i_frag; // 碎片编号 uint8_t l_i_fsize;// 碎片大小 uint16_t i_pad1; uint16_t l_i_uid_high; // 所有者ID高16位 uint16_t l_i_gid_high; // 所属组ID高16位 uint32_t l_i_reserved2; } linux2; // 其他操作系统相关字段略 } osd2; // 操作系统相关字段 }; // 块指针常量定义 #define EXT2_NDIR_BLOCKS 12 // 直接块数量 #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS // 一级间接块索引 #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK

// 二级间接块索引 #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK

// 三级间接块索引 #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK

// 总块指针数量15核心字段解读i_mode文件类型普通文件、目录、链接等和权限rwx例如0644表示普通文件所有者可读可写其他用户可读i_size文件的实际大小字节i_atime/i_ctime/i_mtime文件的三个关键时间戳访问时间、创建时间、修改时间i_links_count文件的硬链接数删除文件时会先将该值减 1当值为 0 时才释放 inode 和数据块i_block[15]最核心的字段存储文件数据块的指针通过这些指针可以找到存储文件内容的所有块。

1.

3 实战查看文件的 inode 信息在 Linux 系统中ls -li命令可以查看文件的 inode 号和详细属性ls -li main.c命令输出示例1052007 -rw-rw-r-- 1 whb whb 488 Oct 17 19:06 main.c关键信息解读1052007文件的 inode 号唯一标识-rw-rw-r--文件类型和权限对应i_mode字段1硬链接数对应i_links_count字段whb whb所有者和所属组对应i_uid和i_gid字段488文件大小对应i_size字段Oct 17 19:06最后修改时间对应i_mtime字段。

此外stat命令也能查看更详细的 inode 信息如前面的stat main.c输出。

Ext2 文件系统基于块组的高效架构设计搞懂了块、分区、inode 这三个基础概念后我们终于可以进入核心 ——Ext2 文件系统的架构设计。

Ext2 的核心设计思想是“分而治之”将一个分区划分为多个大小相等的“块组Block Group”每个块组包含独立的管理结构和数据存储区域这样可以减少磁头移动距离提高文件访问效率。

1 Ext2 文件系统的宏观结构从宏观上看一个 Ext2 文件系统的分区结构如下从磁盘扇区开始顺序排列引导块Boot Block大小固定为 1KB2 个扇区存储磁盘分区表和系统引导程序如 GRUB任何文件系统都不能修改该区域块组 0Block Group 0第一个块组包含完整的管理结构超级块、块组描述符表等是文件系统的 “核心控制区”块组 1~ 块组 NBlock Group 1 ~ Block Group N其他块组每个块组的结构与块组 0 一致超级块和块组描述符表可能为备份或空保留块Reserved Blocks预留的一部分块仅 root 用户可使用用于文件系统紧急修复或避免磁盘满导致的系统崩溃。

示意图如下每个块组的内部结构完全相同这是 Ext2 文件系统的一大特点 —— 通过“复制管理结构”提高可靠性同时通过“分区管理”提高效率。

2 块组Block GroupExt2 的 “最小管理单元”块组是 Ext2 文件系统的核心管理单元就像一个 “独立的小文件系统”每个块组包含以下 6 个关键组成部分按顺序排列超级块Super Block文件系统的 “总配置文件”块组描述符表GDT所有块组的 “索引目录”块位图Block Bitmap块的 “占用状态表”inode 位图Inode Bitmapinode 的 “占用状态表”inode 表Inode Table存储 inode 的 “数据库”数据块Data Blocks存储文件数据的 “仓库”。

示意图如下单个块组---------------------------------------------------------------------------- | Super Block | Group Descriptor | Block Bitmap | Inode Bitmap | | | Table (GDT) | | | ---------------------------------------------------------------------------- | Inode Table | Data Blocks | Data Blocks | ... | | | | | | ----------------------------------------------------------------------------每个块组的大小由 “每个块组的块数” 决定默认情况下Ext2 会将分区划分为多个块组每个块组包含 8192 个块以 4KB 块为例每个块组大小为 32MB。

由于篇幅限制这里就暂时不暂开介绍块组的结构了后续的博客会为大家详细介绍。

3 Ext2 文件系统的核心优势Ext2 文件系统的架构设计带来了以下几个核心优势

2.

1 高效的资源管理块组分区将大分区划分为多个小块组减少磁头移动距离访问同一块组的资源时磁头无需跨块组移动位图管理通过块位图和 inode 位图快速查询空闲资源分配和释放效率高局部性原理文件的 inode 和数据块通常位于同一个块组进一步提高访问效率。

2.

2 高可靠性超级块和 GDT 备份在多个块组中备份关键管理结构防止单点故障保留块预留部分块给 root 用户确保文件系统满时仍能进行修复操作原子操作块和 inode 的分配 / 释放是原子操作保证数据一致性。

2.

3 良好的扩展性动态块大小支持 1KB、2KB、4KB、8KB 等多种块大小可根据应用场景选择小文件多则选小 block大文件多则选大 block动态 inode 大小支持 128 字节和 256 字节的 inode 大小可存储更多的文件属性特性集扩展通过s_feature_compat、s_feature_incompat等字段支持新特性保持向后兼容。

总结Ext2 文件系统的设计思想是 “分而治之” 和 “高效索引”通过块组分区减少磁头移动通过位图管理提高资源操作效率通过备份机制保证可靠性。

这些设计思想不仅影响了后续的 Ext

Ext4 文件系统也为其他文件系统如 XFS、Btrfs提供了参考。

在后续的文章中我们将深入讲解 Ext2 文件系统的进阶内容inode 与数据块的映射关系直接块、间接块、目录结构与路径解析、文件的创建 / 读取 / 修改 / 删除流程、软硬链接的

实现原理等。

如果大家有任何疑问或想了解的内容欢迎在评论区留言讨论最后感谢大家的阅读如果这篇文章对你有帮助别忘了点赞、收藏、转发哦

在线观看WWW免费视频软件-在线观看WWW免费视频软件应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123