【linux文件系统】磁盘结构&文件系统详谈

🎬 个人主页:HABuo

📖 个人专栏:《C++系列》 《Linux系列》《数据结构》《C语言系列》《Python系列》《YOLO系列》

⛰️ 如果再也不能见到你,祝你早安,午安,晚安


目录

📚一、磁盘

[📖1.1 磁盘的物理结构](#📖1.1 磁盘的物理结构)

[📖1.2 磁盘的存储结构](#📖1.2 磁盘的存储结构)

[📖1.3 磁盘的逻辑结构](#📖1.3 磁盘的逻辑结构)

📚二、文件系统

📚三、总结


前言

前面基础I/O部分我讲解的都是进程和被打开文件的关系,那么没有被打开的文件我们知道是在磁盘上放着呢,但是仅仅是放着,它们要不要被管理?显然是要的,这部分内容就属于文件系统的相关内容,今天就让我们一探究竟!

本章重点:

磁盘的物理结构、磁盘的存储结构、磁盘的逻辑结构如何对磁盘进行管理,磁盘的分组的具体结构是什么样的,各自的功能是什么Inode和datablock的关系又是什么,软硬链接是什么,它们的区别是什么,又有什么用处?


📚一、磁盘

要谈文件系统,必须要了解磁盘,但是我们只知道这个玩意是存储东西的,对它的具体结构从来没有仔细了解过,因此,我们必须要从它开始谈起:

📖1.1 磁盘的物理结构

也就是说,磁盘是由多个盘片组成的,每一个盘片有两个盘面,每个盘面都有一个磁头,数据就在这些盘面进行存储,而磁头就是用来读取数据的!通过盘片的高速旋转与磁头协同转动,来达到高效的数据读取。

需要注意:磁头是共进退的!

因此磁盘的制作最大难点就在于磁头读取数据时,盘片的转速如何能在确保一圈内读取的状态下,转速达到最高,这是直接影响磁盘效率的致命问题。

磁头是悬浮的,与盘面并没接触,好比一个C919大飞机与地面的距离,因此,磁盘完全是无尘的,只要一打开立马报废,任何一粒微尘都会发生严重的撞击!

📖1.2 磁盘的存储结构

上面的结构就是磁盘的物理抽象,重点是在下面这幅图:

对于磁盘的每一个面来说,并不是所有的区域都可以用来存储数据围绕着圆心有许多的同心圆,而这些同心圆区域就是磁道,这些空间就是存储数据的地方,可以把特定的磁道中特定的扇区看作是一个小数组,一般而言一个扇区的大小是512字节,也就是说每一个扇区就是512字节的大小,就是说,越靠近圆心位置,扇区里的电磁结构越稠密,越远离圆心,电磁结构越稀疏这是普遍的情况。不排除有些厂家也把这些扇区的电磁结构稠密弄成一样的了,那这样的话越远离圆心存储的空间也就越大,当然我们不考虑这种情况,我们就以每个扇区大小一样来讲述!

📖1.3 磁盘的逻辑结构

不清楚大家小时候玩过磁带没,如下图,它里面的磁带我们一次又一次经不住诱惑抽出来玩玩!

所以我们把磁盘也抽象成这样的线性结构:

是不是越看越熟悉,这不就是数组嘛,因此这就是我们先描述再组织的魅力所在,因此只要知道这个扇区的的下标就算定位了一个扇区!!操件系统内部,我们称这种地址LBA地址!

这里就牵扯到一个问题,就是如何定位到特定扇区?

先定位在哪一个磁道(Cylinder),先定位磁头(定位盘面)(Head),最后在定位哪一个扇区(Sector)

所以磁盘中定位任何一个扇区,采用的硬件基本的定位方式:CHS定位法!

举个例子:

cpp 复制代码
假如:盘面:4    磁道/面:10    扇区/磁道:100  扇区:512字节
---> 4 * 10 * 100 * 512 == 总容量(byte)
---> 4 * 10 * 100 = 下标范围
---> 10 * 100 = 1000扇区  每一面
---> 那我要寻找123号磁盘位置(假设就是从0-...),该怎么计算
---> 123 / 1000 = 0 -- 0号盘面
---> 123 / 100 = 1 -- 1号磁道
---> 123 % 100 = 23 -- 23号扇区

为什么要抽象成逻辑线性结构呢?

答案很显然了: 1.便于管理 2.不想让OS的代码和硬件强耦合!!(今天是磁盘明天又是其它东西,管理的成本太高)

📚二、文件系统

虽然对应的磁盘的访问的基本单位是512字节,但是依旧很小!!OS内的文件系统定制的进行多个扇区的读取->1KB,2KB, 4KB为基本单位!!你哪怕只向读取/修改1bit,也必须将4KBload内存,进行读取或者修改,如果必要,在写回磁盘!!
局部性原理!

  • 内存是被划分成为了4KB大小的空间-----页框
  • 磁盘中的文件尤其是可执行文件---按照4KB大小划分好的块-----页帧

访问的基本单元为了提高效率从512字节提高到了4KB,但是500GB的空间怎么管呢?

学校里有辅导员有学生会有班长,所以怎么管?权力下放!

所以你现在也清楚了,为什么你磁盘里有E盘、D盘等等,但事实上你的电脑只有一块盘!因此通过逐级拆分,我们对磁盘的管理实际上就成了对极小一块空间的管理,其它就copy这种方式就行了!

块组的基本结构:

  • inode Table保存了分组内部所有的可用(已经使用+没有使用)inode。而每一个inode块保存了对应文件的属性信息,但是文件名并不在inode中存储!也就是说一个文件一个inode块,一个inode块一个inode编号
  • Block Bitmap数据块对应的位图结构,位图中的比特位位置和当前datablock对应的数据块
    位置是一一对应关系!存放了哪些datablock使用了哪些没被使用
  • inode Bitmap也是个位图,位图中比特位的位置和当前文件对应的inode的位置是一一对应的!表示特定的inode是否被占用
  • Data Blocks保存的是分组内部所有文行的数据块!存储文件的内容
  • GDT是块组描述符,表征这个块组有多大,已被使用了多少,有多少个inode,还剩多少个等等。表示对应分组的宏观的属性信息
  • SuperBlock保存着文件系统的属性信息,也就是说在分组里有一定比例有这个superblock,是为了防止有些坏掉,可以从其它组里拿回来恢复

整体来说,就是文件属性存储在inode,文件内容存储在datablock,怎么知道哪些用了那些没用,通过各自的位图结构来查找,总体的数据要计算效率就低下,因此有了块组描述表(GDT)来查找整体的宏观信息

那么随之而来的一个问题就是,属性信息在inode,内容信息在datablock,聪明的你一定会想到,它们一定存在某种关系,不然我拿到inode怎么去找对应的内容呢?请看下图:

所以创建文件: 先通过inodebitmap找到对应没有使用的inode将其置1,然后将文件属性放到对应的inode结构体当中,然后将文件内容放置在datablock,将inode当中的blocks数组建立和datablock对应的关系,并将databolckbitmap对应的位置置1这样文件就建立好了
文件查找: 属性先通过inodebitmap看看文件是否存在,存在通过inode查找对应属性信息,查找内容通过inode映射关系找到对应的数据
**文件删除:**惰性删除,将对应的bitmap无论是data还是inode置o即可
从今往后,要在磁盘中找到一个文件只需:找到inode编号 --> 分区特定的块组 --> inode --> 属性 --> 内容

那么问题是文件的inode是什么我怎么知道?是的,OS都考虑好了,在文件的目录中,存放着文件名和此文件的inode对应的映射关系,可以通过文件名直接找到inode!!!

也就是说目录也是一个文件,它的datablock就是存放的就是在它目录下里的文件名和对应的inode的映射关系!


📚三、总结

本篇博客我们详细了解了磁盘结构与文件系统。

小结一下:

磁盘结构:

物理结构:盘片、盘面、磁头

存储结构:磁道、扇区

逻辑结构:我们将磁盘抽象成了线性结构,使OS的代码和硬件解耦。CHS定位法

对于磁盘相关的知识,大家作为了解,拓展视野面。

文件系统:

我们通过对磁盘进行抽象成线性结构实现了对磁盘的管理变成了对数组的管理,我们对磁盘进行了先划区,再分组,从而实现了对磁盘的管理转换为对块组的管理!

块组的基本结构:

  • inode Table保存了分组内部所有的可用(已经使用+没有使用)inode。而每一个inode块保存了对应文件的属性信息,但是文件名并不在inode中存储!也就是说一个文件一个inode块,一个inode块一个inode编号
  • Block Bitmap数据块对应的位图结构,位图中的比特位位置和当前datablock对应的数据块
    位置是一一对应关系!存放了哪些datablock使用了哪些没被使用
  • inode Bitmap也是个位图,位图中比特位的位置和当前文件对应的inode的位置是一一对应的!表示特定的inode是否被占用
  • Data Blocks保存的是分组内部所有文行的数据块!存储文件的内容
  • GDT是块组描述符,表征这个块组有多大,已被使用了多少,有多少个inode,还剩多少个等等。表示对应分组的宏观的属性信息
  • SuperBlock保存着文件系统的属性信息,也就是说在分组里有一定比例有这个superblock,是为了防止有些坏掉,可以从其它组里拿回来恢复

整理成一句话:文件属性存储在inode,文件内容存储在datablock,通过各自的位图结构找到对应没有使用的inode和datablock,而inode中存放着inode和datablock的映射关系

文件名和inode的映射关系使储存在该文件所在目录的datablock中!

相关推荐
Howrun7777 小时前
关于Linux服务器的协作问题
linux·运维·服务器
我在人间贩卖青春7 小时前
C++之多重继承
c++·多重继承
m0_736919108 小时前
C++代码风格检查工具
开发语言·c++·算法
小白同学_C8 小时前
Lab3-page tables && MIT6.1810操作系统工程【持续更新】
linux·c/c++·操作系统os
十年磨一剑~9 小时前
Linux程序接收到sigpipe信号崩溃处理
linux
geshifei9 小时前
Sched ext回调3——select_cpu(linux 6.15.7)
linux·ebpf
yunfuuwqi9 小时前
OpenClaw✅真·喂饭级教程:2026年OpenClaw(原Moltbot)一键部署+接入飞书最佳实践
运维·服务器·网络·人工智能·飞书·京东云
迎仔9 小时前
C-算力中心网络隔离实施方法:怎么搞?
运维·网络
代码游侠9 小时前
C语言核心概念复习——网络协议与TCP/IP
linux·运维·服务器·网络·算法