【Linux】文件系统知识梳理:从磁盘硬件到文件管理

亲爱的读者朋友们😃,此文开启知识盛宴与思想碰撞🎉。

快来参与讨论💬,点赞👍、收藏⭐、分享 📤,共创活力社区。


目录

一、硬件基础

(一)磁盘物理结构

(二)磁盘寻址方式

二、文件系统核心概念

(一)块与分区

1.1引入"块"概念

1.2引入"分区"概念

(二)inode

[三、ext2 文件系统剖析](#三、ext2 文件系统剖析)

(一)整体架构

(二)块组内部构成

[2.1超级块(Super Block)](#2.1超级块(Super Block))

[2.2 GDT(Group Descriptor Table)](#2.2 GDT(Group Descriptor Table))

[2.3 块位图(Block Bitmap)](#2.3 块位图(Block Bitmap))

[2.4 inode 位图(Inode Bitmap)](#2.4 inode 位图(Inode Bitmap))

[2.5 i 节点表 (Inode Table)](#2.5 i 节点表 (Inode Table))

[2.6 Data Block](#2.6 Data Block)

[(三)inode 与数据块映射及文件操作](#(三)inode 与数据块映射及文件操作)

(四)目录与文件名

(五)路径缓存与挂载分区

四、软硬连接:文件引用的不同方式

(一)硬链接

(二)软链接

(三)软硬连接对比与用途


一、硬件基础

(一)磁盘物理结构

机械磁盘是计算机里独特的机械设备,作为外部存储设备,它容量超大、价格亲民,可惜读写速度有点不给力。

磁盘存储数据的基本单元是扇区,每个扇区 512 字节,属于块设备。磁盘由盘片、磁头、磁道、柱面这些部分构成🧐。

盘片有上下两面,各对应 1 个磁头;磁道从盘片外圈往内圈编号,靠近主轴的同心圆是磁头的 "停车位",不存数据;多个盘片上相同半径的磁道组成柱面;每个磁道又被划分成好多扇区。磁盘容量的计算公式是:磁盘容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数。

如何定位一个扇区呢?

  • 可以先定位磁头(header)
  • 确定磁头要访问哪⼀个柱面(磁道)(cylinder)
  • 定位⼀个扇区(sector)

柱面,磁道,扇区

(二)磁盘寻址方式

柱⾯(cylinder),磁头(head),扇区(sector),显然可以定位数据了,这就是数据定位(寻址)⽅式之⼀,CHS寻址⽅式。

  1. CHS 寻址 :早期磁盘靠 CHS( 柱面(cylinder)、磁头(head)和扇区(sector))来定位数据。但因为系统存磁头、柱面和扇区地址的位数有限制,CHS 模式支持的硬盘最大容量只有 8064MB(按 1MB = 1048576B 算)或 8.4GB(按 1MB = 1000000B 算)😕。
  2. LBA 寻址 :为了突破 CHS 的限制,逻辑块地址(LBA)闪亮登场✨。

    磁带上面可以存储数据,我们可以把磁带"拉直",形成线性结构
    那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在⼀起的磁带,那么磁盘的逻辑存储结构我们也可以类似于:

    这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA

二、文件系统核心概念

(一)块与分区

1.1引入"块"概念

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

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

1.2引入"分区"概念

其实磁盘是可以被分成多个分区(partition)的。以Windows的观点来看,你可能会有一块磁盘,并且将它分区成C、D、E盘,C、D、E就是分区。从实质上说,分区就是对硬盘的一种格式化。但在Linux中,设备都是以文件形式存在的,那么它是怎么分区的呢?

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

📌 注意:

  • 柱面大小一致,扇区个数一致,那么其实只要知道每个分区的起始和结束柱面号,知道每一个柱面多少个扇区,那么该分区多大,其实和解释 LBA 是多少也就清楚了。

(二)inode

之前我们说过,文件 = 数据 + 属性。我们使用 ls -l 的时候,除了看到文件名,还能看到文件元数据(属性)。

图中ls -l 显示的文件属性信息,从左到右分别代表:

  1. 文件类型与权限 :第一个字符表示文件类型 ,- 表示普通文件,d 表示目录等。后面 9 个字符,每 3 个一组,分别对应文件所有者、所属组、其他用户的权限。权限字符中,r 代表读权限,w 代表写权限,x 代表执行权限,- 表示无对应权限 。例如 -rw-rw-r-- ,说明这是普通文件,所有者有读写权限,所属组有读写权限,其他用户只有读权限。
  2. 硬链接数 :显示为一个数字 ,表示指向该文件的硬链接数量 。例如1 表示当前有 1 个硬链接指向该文件。
  3. 文件所有者 :显示文件的所有者用户名 ,如Charmer ,表示此文件归用户Charmer 所有。
  4. 文件所属组 :显示文件所属的组名 ,图中Charmer 即表示文件所属组为Charmer 组。
  5. 文件大小 :以字节为单位显示文件大小 ,如91 字节、45304 字节等 。
  6. 文件最后修改时间:显示文件最后一次被修改的日期和

ls -l 读取存储在磁盘上的文件信息,然后显示出来。

其实这个信息除了通过这种方式来读取,还有一个 stat 命令能够看到更多信息。

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

每一个文件都有对应的 inode,里面包含了与该文件有关的一些信息。为了能解释清楚 inode,我们需要深入了解一下文件系统

📌 注意:

  • Linux 下文件的存储是属性和内容分离存储的。

  • Linux 下,保存文件属性的集合叫做 inode,一个文件,一个 inode,inode 内有一个唯一的标识符,叫做 inode 号。
    📌 再次注意:

  • 文件名属性并未纳入到 inode 数据结构内部。

  • inode 的大小一般是 128 字节或者 256 字节,我们后面统一 128 字节。

  • 任何文件的内容大小可以不同,但是属性大小一定是相同的。

块" 在硬盘分区上不是随意排布的,文件系统通过特定的组织方式来管理 "块" 的布局和查找。inode 通常也是按照文件系统的规则有规律地放置在磁盘上,文件系统负责对其进行组织和管理,以实现对文件属性的有效存储和访问。


三、ext2 文件系统剖析

(一)整体架构

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

ext2 文件系统将整个分区划分成若干个同样大小的块组 (Block Group),如下图所示。只要能管理一个分区就能管理所有分区,也就能管理所有磁盘文件。

ext2 文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。例如:政府管理各区。

(二)块组内部构成

2.1超级块(Super Block)

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

2.2 GDT(Group Descriptor Table)

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

2.3 块位图(Block Bitmap)
  • Block Bitmap 中记录着 Data Block 中哪个数据块已经被占用,哪个数据块没有被占用。
2.4 inode 位图(Inode Bitmap)
  • 每个 bit 表示一个 inode 是否空闲可用。
2.5 i 节点表 (Inode Table)
  • 存放文件属性,如文件大小,所有者,最近修改时间等。
  • 当前分组所有 Inode 属性的集合。
  • inode 编号以分区为单位,整体划分,不可跨分区。
2.6 Data Block

数据区:存放文件内容,也就是一个一个的 Block。根据不同的文件类型有以下几种情况:

  • 对于普通文件,文件的数据存储在数据块中。
  • 对于目录,该目录下的所有文件名和目录名存储在所在目录的数据块中,除了文件名外,ls -l 命令看到的其它信息保存在该文件的 inode 中。
  • Block 号按照分区划分,不可跨分区。

(三)inode 与数据块映射及文件操作

inode 内部的i_block数组负责 inode 和数据块的映射。创建新文件时,内核要做这些事🧐:

  1. 先找到空闲的 inode 记录文件信息;
  2. 接着给文件分配空闲的数据块并把数据存进去;
  3. 然后在 inode 上记录数据块列表;
  4. 最后把文件名和 inode 号的对应关系添加到目录文件中。

(四)目录与文件名

目录其实也是文件,它的内容是文件名和 inode 号的映射关系。

访问文件的时候:

得先打开当前目录,根据文件名找到对应的 inode 号,才能访问文件。

这个过程就是路径解析,要从根目录开始,按照路径依次打开每个目录,根据目录名找指定文件,直到找到目标文件😜。

(五)路径缓存与挂载分区

  1. 路径缓存 :Linux 系统里没有真正意义上的目录,只有文件。只保存文件属性+文件内容。为了让文件访问更快,Linux 通过内核的struct dentry结构体维护树状路径结构来做路径缓存。访问文件时,先在缓存里找,要是没找到,就从磁盘加载路径并添加到缓存里 ,就像给文件访问加了个 "高速通道"🚀。
  2. 挂载分区 :分区写入文件系统后,得和指定目录关联挂载才能用。我们可以根据访问目标文件的 "路径前缀" 判断它在哪个分区,用mount命令挂载分区,用完了就用umount命令卸载。

下面将通过几张图进行总结,其中一张为自绘,其余来源于网络。这些图旨在从不同角度加以说明。


四、软硬连接:文件引用的不同方式

(一)硬链接

在 Linux 里,多个文件名可以对应同一个 inode,这就是硬链接啦😎。用ln命令创建硬链接后,这些文件的链接状态是一样的,内核会记录硬连接数。删除文件时,会在目录里删除对应记录,同时把硬连接数减 1,当硬连接数变成 0,就释放磁盘空间啦。

(二)软链接

软链接是通过名字引用另一个文件,新文件和被引用文件的 inode 不一样,就像快捷方式一样,用ln -s命令就能创建。软链接是个独立文件,和硬链接本质上可不同哦😏。

(三)软硬连接对比与用途

硬链接是文件名和目标文件 inode 的映射关系,适合用来做文件备份;软链接作为独立文件,类似快捷方式,能让用户快速访问文件,超方便的🤗。


如果本文对你有帮助,欢迎关注我👉【A charmer】

相关推荐
lilye6628 分钟前
程序化广告行业(55/89):DMP与DSP对接及数据统计原理剖析
java·服务器·前端
SKYDROID云卓小助手1 小时前
三轴云台之相机技术篇
运维·服务器·网络·数码相机·音视频
东方佑1 小时前
自动调整PPT文本框内容:防止溢出并智能截断文本
linux·运维·powerpoint
zhougl9962 小时前
html处理Base文件流
linux·前端·html
泥土编程3 小时前
kubekey -实现懒人一键部署K8S集群
linux·运维
wirepuller_king6 小时前
创建Linux虚拟环境并远程连接,finalshell自定义壁纸
linux·运维·服务器
Yan-英杰7 小时前
【百日精通JAVA | SQL篇 | 第二篇】数据库操作
服务器·数据库·sql
在野靡生.7 小时前
Ansible(1)—— Ansible 概述
linux·运维·ansible
风123456789~7 小时前
【Linux运维】查询指定日期的上月
linux·运维·服务器
zyk_5207 小时前
Docker desktop如何汉化
运维·docker·容器