目录
理解硬盘
扇区是磁盘存储数据的基本单位,大小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),⽤来存储磁盘分区信息和启动信息,任何⽂件系统都不能修改启动块。
块组的内部构成
- 超级块(Super Block):存储整个文件系统的全局元数据(块大小、inode 总数、块组数量等),因此Super Block就确定了整个文件系统的格式,每个块组默认备份一份,首块组为主,防止破坏后文件系统崩溃。
- 组描述符表(Group Descriptor Table):记录当前块组的管理信息(如 inode 表 / 数据块区域的始末位置、空闲 inode / 块数量)。
- inode 位图(Inode Bitmap):用 1 位标记 1 个 inode 的状态(1 = 已用,0 = 空闲),快速定位空闲 inode。
- 块位图(Block Bitmap):用 1 位标记 1 个数据块的状态(1 = 已用,0 = 空闲),快速分配 / 回收数据块。
- inode 表(Inode Table):存储块组内所有文件的 inode(元数据:权限、大小、时间戳、数据块指针等)。
- 数据块区域(Data Blocks):由多个固定大小的块组成,实际存储文件内容,是文件数据的载体。
细节补充
- 文件=属性+内容,linux中文件的属性和内容是分开存储的。
- 前4个属于管理结构,分别管理整个文件系统、当前组块、以及当前组块的两个存储结构。
- 两个Bitmap分别记录对应两个存储结构的位置使用状态。
- 文件系统的存储单位是块,两个Bitmap对应的编号的单位是块,是由LBA地址中的多个(8个)扇区构成。
- inode和数据块是跨组编号的,不能跨分区,所以在一个分区内部,inode和数据块编号是唯一的
- 文件系统格式化就是把每个管理结构初始化,也会将数据清空
如何理解删除一个文件?
- 将该文件对应的inode在inode位图当中置为无效。
- 将该文件申请过的数据块在块位图当中置为无效。
删除文件时只需通过更改管理结构(两个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的引用计数