【Linux】文件系统磁盘存储结构

文章目录

🔍磁盘文件管理

系统中没有被打开文件存储在磁盘/SSD中。其中,没有被打开的文件也需要被OS管理,我们随时随地都需要打开磁盘中的文件,那么怎么才能将磁盘中的文件快速找到呢?所以,OS需要将磁盘中的文件进行管理。 如何让OS快速找到文件。

📖磁盘的机械构成

磁盘盘片(Platters)

作用:硬盘存储数据的核心部件。

特点:盘片的数量可以从一片到多片不等,通常盘片越多,硬盘的存储容量越大。每个盘片都有两个盘面,即正反两面都可以存储数据。

主轴马达(Spindle Motor)

位置:位于盘片的中心。

作用:负责驱动盘片以恒定的速度旋转,转速越高,硬盘的数据访问速度越快。

读写头(Read/Write Heads)

作用:每个盘片表面都有一个读写头,用于读取和写入数据。

特点:读写头悬浮在盘片表面上非常微小的距离内(通常是几十纳米),这样可以避免与盘片接触并造成损害。

机械臂杆(Actuator Arm)

作用:读写头被安装在臂架上,臂架的运动使读写头能够在盘片的半径方向上移动,从而访问盘片上不同轨道的数据。

📚物理存储

磁盘存储的详细结构

磁道(Tracks):每个盘面被划分为一个个磁道,这些磁道是同心圆环,从外围开始编号,从0开始。

扇区(Sectors):每个磁道又被划分为若干个扇区,扇区是磁盘的最小组成单元,通常是512字节或4KB(高级格式化)。扇区是硬盘的最小存储单元。

柱面(Cylinders):柱面是所有盘面中相同磁道的柱面,形成的是一个立体的柱体形状。磁盘的柱面数和磁道数是相等的,盘面数等于总的磁头数。

存储容量计算

存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区的字节数

其中,磁头沿着半径方向左右摇摆,定位在哪一个磁道,马达带动盘片旋转,定位在磁盘的哪一个扇区。

怎么定位一个扇区?

CHS定位法:

定位在哪一个磁道(cylinder)

定位使用哪一个磁头(head)

定位在哪一个扇区(Sector)

📝 磁盘存储原理

写入数据:

当计算机需要将数据写入磁盘时,首先将待存储的数据传输给磁盘控制器。

磁盘控制器再将数据传输给磁头。

磁头通过在磁盘表面上产生磁场来磁化磁盘表面上的磁性材料,从而存储数据。这些磁区可以通过改变磁盘表面上的磁极方向,表示不同的数据位。

磁头通过移动磁盘上的臂部将磁头定位到特定的扇区上,然后通过改变磁头的电流来磁化磁盘表面,写入数据。

读取数据:

当计算机需要读取磁盘上的数据时,磁盘控制器会指示磁头移动到包含所需数据的磁道上。

磁头会定位到具体的扇区上,并检测该扇区中的磁场变化。

通过将磁场变化转换为数字信号,磁头将读取的数据传输给磁盘控制器,进而传输给计算机进行处理。

但是OS认为,一次和磁盘IO一个扇区单位太小了,OS系统文件认为,IO的基本单位是4KB(8个连续的扇区),不同的OS有不同的区别,基本单位是可以更改的。如下图:

个磁盘往往会进行分区,比如电脑上的D,E,F盘,OS在管理每一个区的时候,还会进行分组,每一组由很多个4KB数据块组成。其中分区与分组中有特有的数据段。如下图:

Linux文件特性:文件 = 内容+属性,并且内容与属性分开存储的。

其中,内容是可变的,大小不确定,属性是确定的,只是属性的内容不一样。

注意:文件名不属于文件属性;

存放文件属性的struct inode结构体大小固定的,为128字节。

inode编号整个分区唯一的,其中ls -i 选项可以查看文件的inode编号;

系统中,标识一个文件不直接是文件名,而是inode编号。

认识一下分区分组中的数据段:

  • inode Table:里面有很多个连续的128字节的空间,每一个空间存放文件的属性 如 :文件大小,所有者,最近修改时间等

  • inode Bitmap :inode Table对应的位图,标识inode Table的使用情况,每个bit表示一个inode是否空闲可用。

  • Data blocks(数据区):该区域被划分为很多个以4KB为单位的数据块,存储文件的内容。

  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。

  • GDT,Group Descriptor Table:块组描述符,描述块组属性信息,例如块组的整体使用情况等。

  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。Super Block只在个别的Block group中有,本质是进行数据备份。

  • Block Group:文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。

删除文件直接将inode bitmap与block bitmap删除即可,不需要将属性与内容删除,使用时覆盖即可。

文件内容与属性怎么关联的?

文件属性结构体中,包含一个int block15,就是来存储该文件所使用的数据区里面的数据块的编号,其中,0,12为直接映射,12,13为间接索引(不保存文件内容,保存的文件使用的数据块的编号),13,14为三级索引。所以,有了文件的inode编号,就有了文件属性与内容;

每一个分区的inode编号有一个范围,先根据inode编号确定是在哪一个分区的,然后减去该分区的起始inode编号,去inode bitmap中看是否存在,如果存在就去inode Table中查找文件即可。

📌文件名

目录也是文件,也有自己的inode编号,目录的内容里面放什么呢?

任何一个普通文件都在一个目录中。

目录内容放的是文件名与inode的映射关系。

如果一个目录没有r,w权限的表现在这里就很好理解了。

对于一个文件的增删查改,都和该文件所处的目录有关系的。

增删查改,都必须先找到文件,找文件就是找到该文件的inode,就需要先找到文件的目录,通过目录的内容找到该文件名与inode的映射关系。

那怎么找到目录呢?

查找一个文件,在内核中,都要逆向的递归般得到 根目录/,其中,根目录的inode编号是确定的,然后从根目录进行路径解析,查找文件。

怎么知道该文件在哪一个分区呢?

通过该文件的路径前缀可以直接区分处在哪一个分区下的。

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

  1. 存储属性
    内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。
  2. 存储数据
    该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据
    复制到300,下一块复制到500,以此类推。
  3. 记录分配情况
    文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
  4. 添加文件名到目录
    新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

如果要删除文件该怎么做呢?

将文件名在目录内容中做字符串匹配,找到文件的inode编号,将inode bitmap与block bitmap删除,不需要将属性与内容删除,使用时覆盖即可,然后将目录中的映射关系删除。

相关推荐
江华森9 小时前
《Linux内核技术实战:从Page Cache到CPU调度的深度解构》博客大纲(26讲精编版)
linux
周小码10 小时前
10分钟搭建私有Git服务器:Soft Serve实战
运维·服务器·git
知无不研10 小时前
对套接字的深入理解
linux·服务器·网络·c++·socket·网络套接字
xyzzklk10 小时前
解决Salesforce无法向外发送邮件
android·java·开发语言·网络·crm·salesforce·客户关系管理
The Open Group10 小时前
从项目到产品:数字化转型为何进入“产品时代”?
运维
Urbano10 小时前
休闲束脚裤全生产工艺科普:从裁片到成衣,缝纫工序与自动化设备选型详解
运维·自动化
萤丰信息11 小时前
AI 重构园区运维|全场景无人化智慧运维:破解传统物业高成本痛点
运维·人工智能·重构
AI创界者12 小时前
运维进阶:如何使用 Medusa 进行企业内部服务器密码合规性审计?
运维·服务器
修炼者12 小时前
Gradle三阶段
android
wuminyu12 小时前
Java锁机制之Java对象重量级锁源码剖析
java·linux·c语言·jvm·c++