【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 block[15],就是来存储该文件所使用的数据区里面的数据块的编号,其中,[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删除,不需要将属性与内容删除,使用时覆盖即可,然后将目录中的映射关系删除。

相关推荐
wzhao1011 小时前
Relink 0.15.1:一个 no_std 的 ELF 加载器/链接器
linux·rust·gnu
ggaofeng2 小时前
自己如何实现ssh协议
运维·ssh
何中应2 小时前
服务器之间如何免密连接
linux·服务器·ssh
BU摆烂会噶2 小时前
【LangGraph】节点内调用与状态隔离
android·人工智能·python·ui·langchain·人机交互
zzzsde2 小时前
【Linux】线程同步和互斥(1):线程互斥与加锁实现
linux·运维·服务器·开发语言·算法
Bert.Cai2 小时前
Linux iconv命令详解
linux·运维·服务器
独隅2 小时前
详解SMTP与IMAP协议:核心区别、工作原理与全链路环境标准化实战场景应用
运维
WangLanguager2 小时前
Linux命令chfn(change finger information) 详细介绍
linux·运维·服务器
Vodka~2 小时前
一根网线——Windows共享网络给Linux访问互联网
linux·网络·windows