Ext系列文件系统

磁盘硬件

机械磁盘是计算机中唯一的机械设备。

在这里插入图片描述

盘片(磁盘):存储数据的载体,表面有磁性涂层,一张硬盘可有多片盘片盘片正反两面都能存数据,每面对应一个独立磁头。

主轴马达:带动所有盘片同步高速旋转,读写时盘片持续转动。

磁头臂 + 读写磁头:所有磁头绑定同一根机械臂共进退只能同步移动到同一半径;磁头悬浮在盘片上方,不接触盘面,负责读写磁性数据。

磁盘存储结构。

在这里插入图片描述

扇区 Sector:磁盘硬件读写最小单位,标准 512 字节;一个圆环磁道被切分成若干扇形小块,编号从 1 开始。

磁道 Track:盘面上一圈同心圆,外圈是 0 号磁道,向内依次递增;同一盘面同一半径的圆环就是一条磁道。

在这里插入图片描述

柱面 Cylinder:所有盘片相同半径的全部磁道合起来称为一个柱面;因为磁头共进退,读写同一柱面不用移动机械臂,性能更高。

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

CHS 寻址(老式寻址,有容量上限):通过 柱面 C + 磁头 H + 扇区 S 三维定位扇区;硬件位数限制最大仅支持约 8GB 硬盘,现已淘汰。

LBA 线性寻址(现代磁盘默认):把磁盘所有扇区拉直成一维数组,每个扇区分配唯一连续数字下标(LBA 编号从 0 开始),操作系统只使用 LBA;磁盘固件内部自动完成 LBA ↔ CHS 转换,上层无需关心物理结构。

在这里插入图片描述

磁盘最终可看成一个三维数组。

在这里插入图片描述

文件系统概念

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

硬盘的每个分区是被划分为一个个的”块”。一个”块”的大小是由格式化的时候确定的,并且不可以更改,最常见的是4KB,即连续八个扇区组成一个 ”块””块”是文件存取的最小单位

磁盘就是一个三维数组,我们把它看待成为一个"一维数组",数组下标就是LBA,每个元素都是扇区。每个扇区都有LBA,那么8个扇区一个块,每一个块的地址我们也能算出来。

块号 = LBA / 8 ;LAB = 块号 × 8 + n (n是块内第几个扇区)。

在这里插入图片描述

磁盘可以被分成多个分区(partition),以Windows观点来看,你可能会有一块磁盘并且将它分区成C,D,E盘。那个C,D,E就是分区。分区从实质上说就是对硬盘的一种格式化。

柱面是分区的最小单位,我们可以利用参考柱面号码的方式来进行分区,其本质就是设置每个区的起始柱面和结束柱面号码。 此时我们可以将硬盘上的柱面(分区)进行平铺,将其想象成一个大的平面。

在这里插入图片描述

文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息(属性信息),比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。每一个文件都有对应的inode。

Linux下文件的存储是属性和内容分离存储的,保存文件属性的集合是inode,一个文件有一个inode,inode内有一个唯一的标识符,叫做inode号。ls -i 查看文件inode号。

在这里插入图片描述

文件名属性并未纳入到inode数据结构内部,inode大小一般是128字节或者256字节,后面统一128字节

ext2文件系统

我们想要在硬盘上储文件,必须先把硬盘格式化为某种格式的文件系统,才能存储文件。文件系统的目的就是组织和管理硬盘中的文件。在Linux 系统中,最常见的是 ext2 系列的文件系统。其早期版本为 ext2,后来又发展出 ext3 和 ext4。ext3 和 ext4 虽然对 ext2 进行了增强,但是其核心设计并没有发生变化。

ext2文件系统将整个分区划分成若干个同样大小的块组 (Block Group),如下图所示。只要能管理一个分区就能管理所有分区,也就能管理所有磁盘文件。图中**启动块(Boot Block/Sector)**的大小是确定的,为1KB,由PC标准规定,用来存储磁盘分区信息和启动信息,任何文件系统都不能修改启动块。启动块之后才是ext2文件系统的开始

在这里插入图片描述

Data Blocks保存文件内容。inode Table是大小为4KB的块,会保存32个文件的inode。Block Bitmap是位图,记录着Data Blocks中哪个数据块已经被占用,哪个数据块没有被占用。inode Bitmap同理,每个bit表示一个inode是否空闲可用。

GDT是块组描述符表,描述块组属性信息,整个分区分成多个块组就对应有多少个块组描述符。每个块组描述符存储一个块组的描述信息,如在这个块组中从哪里开始是inode Table,从哪里开始是DataBlocks,空闲的inode和数据块还有多少个等等。块组描述符在每个块组的开头都有一份拷贝。

Super Block存放文件系统本身的结构信息,描述整个分区的文件系统信息。记录的信息主要有:bolck 和 inode 的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。

超级块在每个块组的开头都有一份拷贝(第一个块组必须有,后面的块组可以没有)。 为了保证文件系统在磁盘部分扇区出现物理问题的情况下还能正常工作,就必须保证文件系统的super block信息在这种情况下也能正常访问。所以一个文件系统的super block会在多个block group中进行备份,这些super block区域的数据保持一致

文件名不存放在 inode 内,保存在所属目录的数据块中。

目录本质也是文件:目录同样拥有自己的 inode 与数据块;目录数据块内存储 文件名 - inode 编号 映射表

文件访问逻辑(路径解析):

  • 用户操作只使用路径 + 文件名,不直接操作 inode;
  • 操作系统逐层解析路径,打开每一级目录,读取目录内文件名与 inode 的映射,逐级找到目标文件 inode;
  • 所有文件访问必须依赖路径,路径由进程提供

原则上,访问任何文件都要从根目录开始进行路径解析,但是这样太慢,所以Linux会缓存历史路径结构路径缓存)。Linux中,在内核中维护树状路径结构的内核结构体是 struct dentry

  • 每个文件其实都要有对应的dentry结构,包括普通文件。这样所有被打开的文件,就可以在内存中形成整个树形结构。
  • 整个树形节点也同时会隶属于LRU(Least Recently Used,最近最少使用)结构中,进行节点淘汰。
  • 整个树形节点也同时会隶属于Hash,方便快速查找。
  • 更重要的是,这个树形结构整体构成了Linux的路径缓存结构,打开访问任何文件,都先在这棵树下根据路径进行查找,找到就返回属性inode和内容,没找到就从磁盘加载路径,添加dentry结构,缓存新路径。

inode 仅在单个分区内有效、不能跨分区;Linux 存在多个磁盘分区,操作系统需要通过挂载机制,根据文件路径区分文件所属分区

分区写入文件系统,无法直接使用,需要和指定的目录关联,进行挂载才能使用。该指定目录为挂载点。

文件路径前缀,不同挂载点前缀对应不同分区,系统借此定位分区,再在分区内通过 inode 查找文件。

在这里插入图片描述

完整文件访问流程

  1. 用户进程发起文件操作(如cat /a/b/test.txt)。
  2. 内核读取当前进程fs_structpwd/root作为路径解析起点,逐层匹配各级 dentry。
  3. 通过 dentry 的d_inode找到目标文件 inode,通过vfsmount确定文件所在挂载分区。
  4. open系统调用:在进程files_structfd_array分配空闲 fd,新建struct file绑定该 inode 与挂载信息。
  5. 用户调用read(fd):通过 fd 找到struct file,调用f_op->read,最终调用 ext4 底层接口读取磁盘数据块。

软硬链接

ln -s 原文件路径 软链接名称 软链接依靠文件路径名指向原文件,软链接自身是独立文件,拥有专属 inode,它保存的内容就是原文件的路径。

在这里插入图片描述

把可执行程序code移到 ./a/b/c 下,如果要运行code,就要带很长的路径。

在这里插入图片描述

软链接后输入的路径变短,更加方便快捷,所以软链接类似Windows快捷方式。

在这里插入图片描述

ln 原文件路径 硬链接名称 硬链接不是独立文件,它没有独立inode,本质是一组新的文件名和目标文件inode的映射关系

在这里插入图片描述

code.c文件属性中的一列数字由1变成2,这一列数字是硬链接数。

硬链接的一个用处是备份文件。在a目录下备份code.c,删除原目录中的code.c,仍能在code-backup.c拿到code.c的内容。

在这里插入图片描述

目录a的硬链接数是3。

Linux 目录的硬链接计数 = 3 个固定组成部分:

  1. 目录自身的 .(当前目录):进入目录 a 后执行ls -al看到的.,是目录 a 自身的硬链接,占用 1 个计数;
  2. 上级目录里的目录名a:外层lesson20260717目录中存在名为a的目录项,这是目录 a 的主别名,占用第 2 个计数;
  3. 子目录内的 ..(上级目录):目录a下面存在子目录b,子目录b里自带..硬链接,指向父目录a,占用第 3 个计数。

在这里插入图片描述

unlink 软/硬链接 删除软硬链接。

只能给普通文件建立硬链接,目录不能建立硬链接。因为容易出现环路径问题,系统查找文件进行深度优先遍历时就会出问题。... 虽然也是目录的硬链接,但系统特殊处理即可。

在这里插入图片描述

可以对普通文件和目录建立软链接,因为建立的软链接是独立文件,且不再是普通文件,所以不会出现环路径问题。

在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐