Linux EXT系列文件系统

目录

理解硬盘

扇区是磁盘存储数据的基本单位,大小512字节,磁盘是块设备。

CHS地址(物理地址):

LBA地址(物理地址):

地址转化:

CHS转成LBA: • 磁头数每磁道扇区数=单个柱⾯的扇区总数 • LBA=柱⾯号C 单个柱⾯的扇区总数+磁头号H每磁道扇区数+扇区号S-1 • 即:LBA=柱⾯号C (磁头数每磁道扇区数)+磁头号H 每磁道扇区数+扇区号S-1 • 扇区号通常是从1开始的,⽽在LBA中,地址是从0开始的 • 柱⾯和磁道都是从0开始编号的 • 总柱⾯,磁道个数,扇区总数等信息,在磁盘内部会⾃动维护,上层开机的时候,会获取到这些参 数。

LBA转成CHS: • 柱⾯号C=LBA//(磁头数每磁道扇区数)【就是单个柱⾯的扇区总数】 • 磁头号H=(LBA%(磁头数 每磁道扇区数))//每磁道扇区数 • 扇区号S=(LBA%每磁道扇区数)+1 • "//":表⽰除取整 所以:从此往后,在磁盘使⽤者看来,根本就不关⼼CHS地址,⽽是直接使⽤LBA地址,磁盘内部⾃⼰ 转换。

所以: 从现在开始,磁盘就是⼀个元素为扇区的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使⽤磁盘,就可以⽤⼀个数字访问磁盘扇区了。
与虚拟地址空间殊途同归:将物理地址转化为抽象的连续地址

Ext2文件系统

基本概念

文件系统是操作系统管理存储设备(如硬盘、SSD)数据的核心机制,它通过定义数据的存储结构、访问规则和管理逻辑,让无序的二进制数据变成可识别、可管理的文件和目录,是用户与存储硬件之间的 "翻译官"。

想要在硬盘上储⽂件,必须先把硬盘格式化为某种格式的⽂件系统,才能存储⽂件。⽂件系统的⽬的就是组织和管理硬盘中的⽂件。

分区是文件系统的载体

磁盘可以划分为多个分区,而文件系统就是管理每个分区的,所以说分区是文件系统的载体

块的概念

其实硬盘是典型的"块"设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个"块"(block)。

硬盘的每个分区是被划分为⼀个个的"块"。⼀个"块"的⼤⼩是由格式化的时候确定的,并且不可以更改,最常⻅的是4KB,即连续⼋个扇区组成⼀个"块"。"块"是⽂件存取的最⼩单位。

Ext2文件系统的管理单位是块,块号可以与LBA地址转换计算

inode

inode(索引节点)是存储目录或文件的元信息(属性信息)的结构体

Ext2文件系统的结构

文件系统是基于分区之上的,将整个分区划分为大小相同的块组(block group),第一个块组之前是启动块(boot block),⽤来存储磁盘分区信息和启动信息,任何⽂件系统都不能修改启动块。

块组的内部构成

  1. 超级块(Super Block):存储整个文件系统的全局元数据(块大小、inode 总数、块组数量等),因此Super Block就确定了整个文件系统的格式,每个块组默认备份一份,首块组为主,防止破坏后文件系统崩溃。
  2. 组描述符表(Group Descriptor Table):记录当前块组的管理信息(如 inode 表 / 数据块区域的始末位置、空闲 inode / 块数量)。
  3. inode 位图(Inode Bitmap):用 1 位标记 1 个 inode 的状态(1 = 已用,0 = 空闲),快速定位空闲 inode。
  4. 块位图(Block Bitmap):用 1 位标记 1 个数据块的状态(1 = 已用,0 = 空闲),快速分配 / 回收数据块。
  5. inode 表(Inode Table):存储块组内所有文件的 inode(元数据:权限、大小、时间戳、数据块指针等)。
  6. 数据块区域(Data Blocks):由多个固定大小的块组成,实际存储文件内容,是文件数据的载体。

细节补充

  • 文件=属性+内容,linux中文件的属性和内容是分开存储的。
  • 前4个属于管理结构,分别管理整个文件系统、当前组块、以及当前组块的两个存储结构。
  • 两个Bitmap分别记录对应两个存储结构的位置使用状态。
  • 文件系统的存储单位是块,两个Bitmap对应的编号的单位是块,是由LBA地址中的多个(8个)扇区构成。
  • inode和数据块是跨组编号的,不能跨分区,所以在一个分区内部,inode和数据块编号是唯一的
  • 文件系统格式化就是把每个管理结构初始化,也会将数据清空

如何理解删除一个文件?

  1. 将该文件对应的inode在inode位图当中置为无效。
  2. 将该文件申请过的数据块在块位图当中置为无效。
    删除文件时只需通过更改管理结构(两个bitmap)将该文件对应的位置为0,将该文件标记为无效
    所以删除文件比下载文件快得多
    inode和datablock映射
    文件的属性inode能通过文件名对应inode编号找到,文件的内容DataBlock是通过inode中的数据块指针找到的。
    并通过多级指针增加能指向的数据块的个数。

inode和datablock映射

文件的属性inode能通过文件名对应inode编号找到,文件的内容DataBlock是通过inode中的数据块指针找到的。

并通过多级指针增加能指向的数据块的个数。

文件系统中的目录与文件名

inode结构体大小固定128字节,文件名大小可变,不作为属性存在inode中,所以文件名存在哪?

文件系统中没有目录的概念,只有文件属性+文件内容

目录文件的文件内容

目录在文件系统中和普通文件完全相同,只是目录文件的内容(DataBlock中)是其子文件的文件名和对应inode的映射关系。

所以文件名不存储在文件的inode中,而是上级目录的DataBlock中

路径解析

想要通过文件名找到一个文件的inode就要找到其上级目录文件(内容中存储下级文件的文件名->inode映射关系),并以此递推到根目录。

路径缓存

这其中每次都需要打开路径上的每一个目录并I/O读取下降文件名和inode映射信息,如果每次打开一个文件都从根目录开始进行系统I/O直到找到该文件,成本太高。

所以系统会在内存中缓存维护一颗文件目录树,查找文件时先从缓存树中查找,避免重复I/O操作。

dentry(目录项)

dentry(目录项)就是系统维护的目录树的节点,是一个内核数据结构,存储了文件名和inode编号的映射关系,以及指向树中其它关联节点的指针。

挂载

挂载(Mount)是将存储设备(如硬盘分区、U 盘、光盘)的文件系统,与操作系统的目录树(如 Linux 的 "/"、Windows 的 "D:")建立关联的过程。只有完成挂载,操作系统才能识别并读写设备中的文件。

"挂载" 存在的根本原因 ------存储设备的文件系统与操作系统是相互独立的 "组件",没有天然绑定关系,必须通过 "挂载" 这个动作建立临时关联,操作系统才能识别和使用设备中的文件。

文件系统总结

流程:

打开文件时创建内核数据结构file,内部含文件的内核数据结构dentry,dentry中存储文件名和内核数据结构inode的映射关系,内核数据结构inode是磁盘中inode在内存中的扩展,由此实现操作系统和磁盘文件的联系

初次加载文件时 需要通过磁盘I/O从磁盘中的目录文件中逐层找到该文件,并将该路径的所有节点生成对应的dentry补充到OS的目录缓存树中

内核数据结构关系图:

软硬链接

软链接是一个独立的文件,文件内容是链接文件的路径。创建一个新inode

硬链接创建一个新的文件名,与链接文件的inode映射。不创建新的inode,增加该inode的引用计数

相关推荐
tokepson35 分钟前
Mysql下载部署方法备份(Windows/Linux)
linux·服务器·windows·mysql
zz_nj3 小时前
工作的环境
linux·运维·服务器
极客先躯3 小时前
如何自动提取Git指定时间段的修改文件?Win/Linux双平台解决方案
linux·git·elasticsearch
suijishengchengde4 小时前
****LINUX时间同步配置*****
linux·运维
qiuqyue4 小时前
基于虹软Linux Pro SDK的多路RTSP流并发接入、解码与帧级处理实践
linux·运维·网络
切糕师学AI4 小时前
Linux 操作系统简介
linux
南烟斋..5 小时前
GDB调试核心指南
linux·服务器
爱跑马的程序员5 小时前
Linux 如何查看文件夹的大小(du、df、ls、find)
linux·运维·ubuntu
oMcLin7 小时前
如何在 Ubuntu 22.04 LTS 上部署并优化 Magento 电商平台,提升高并发请求的响应速度与稳定性?
linux·运维·ubuntu
Qinti_mm8 小时前
Linux io_uring:高性能异步I/O革命
linux·i/o·io_uring