
🎬 个人主页 :艾莉丝努力练剑
❄专栏传送门 :《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》
《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》
⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平
🎬 艾莉丝的简介:

文章目录
- 引言
- [1 ~> 磁盘硬件基础](#1 ~> 磁盘硬件基础)
-
- [1.1 磁盘的基本认知](#1.1 磁盘的基本认知)
- [1.2 磁盘物理结构](#1.2 磁盘物理结构)
- [1.3 磁盘存储结构](#1.3 磁盘存储结构)
- [1.4 CHS 寻址方式](#1.4 CHS 寻址方式)
- [1.5 磁盘逻辑结构与 LBA 寻址](#1.5 磁盘逻辑结构与 LBA 寻址)
- [1.6 CHS 与 LBA 地址转换](#1.6 CHS 与 LBA 地址转换)
- [2 ~> 文件系统基础概念引入](#2 ~> 文件系统基础概念引入)
-
- [2.1 "块" 的概念](#2.1 "块" 的概念)
- [2.2 "分区" 的概念](#2.2 "分区" 的概念)
- [2.3 "inode" 的概念](#2.3 "inode" 的概念)
- [3 ~> Ext2 文件系统核心原理](#3 ~> Ext2 文件系统核心原理)
-
- [3.1 Ext2 文件系统宏观结构](#3.1 Ext2 文件系统宏观结构)
- [3.2 块组内部构成](#3.2 块组内部构成)
- [3.3 inode 与数据块的映射关系](#3.3 inode 与数据块的映射关系)
- [3.4 目录与文件名的本质](#3.4 目录与文件名的本质)
- [3.5 路径解析过程](#3.5 路径解析过程)
- [3.6 路径缓存机制](#3.6 路径缓存机制)
- [3.7 分区挂载原理](#3.7 分区挂载原理)
- [4 ~> 软硬连接](#4 ~> 软硬连接)
-
- [4.1 硬链接](#4.1 硬链接)
- [4.2 软链接](#4.2 软链接)
- [4.3 软硬连接对比与用途](#4.3 软硬连接对比与用途)
- [5 ~> 全文总结](#5 ~> 全文总结)
- 结尾

引言

思维导图
bash
Ext系列文件系统
├─ 磁盘硬件基础
│ ├─ 磁盘基本认知
│ │ ├─ 唯一机械设备,外设
│ │ ├─ 特点:容量大、价格便宜、速度慢
│ │ └─ 块设备:以扇区为基本读写单位
│ ├─ 磁盘物理结构
│ │ ├─ 盘片(Platter):可双面存储
│ │ ├─ 磁头(Head):每个盘面对应一个,共进退
│ │ ├─ 磁臂/传动臂:带动磁头径向移动
│ │ └─ 主轴:带动盘片高速旋转
│ ├─ 磁盘存储结构
│ │ ├─ 磁道(Track):盘片上的同心圆,从外到内编号
│ │ ├─ 扇区(Sector):磁道分割的扇形区域,512字节
│ │ └─ 柱面(Cylinder):所有盘面相同半径磁道的集合
│ ├─ CHS寻址方式
│ │ ├─ 寻址逻辑:柱面→磁头→扇区
│ │ ├─ 容量计算公式:磁头数×柱面数×每道扇区数×512B
│ │ └─ 局限性:最大支持8.4GB容量
│ ├─ 磁盘逻辑结构与LBA寻址
│ │ ├─ 逻辑抽象:将三维磁盘结构映射为一维扇区数组
│ │ ├─ LBA定义:逻辑块地址,从0开始编号
│ │ └─ 转换职责:磁盘固件完成LBA与CHS的互转
│ └─ CHS与LBA地址转换
│ ├─ CHS转LBA:LBA=C×(H总×S每道)+H×S每道+S-1
│ └─ LBA转CHS:C=LBA//(H总×S每道);H=(LBA%(H总×S每道))//S每道;S=(LBA%S每道)+1
├─ 文件系统基础概念
│ ├─ "块"的概念
│ │ ├─ 定义:文件存取的最小单位,由多个连续扇区组成
│ │ ├─ 常见大小:4KB(8个扇区)
│ │ └─ 块号与LBA转换:块号=LBA/8;LBA=块号×8+n
│ ├─ "分区"的概念
│ │ ├─ 本质:设置分区的起始和结束柱面号
│ │ ├─ 最小单位:柱面
│ │ └─ 设备表示:Linux中以/dev/xxx形式存在
│ └─ "inode"的概念
│ ├─ 定义:存储文件元信息(属性)的区域
│ ├─ 核心特点:一个文件对应一个inode,inode号唯一
│ ├─ 大小:通常128字节或256字节
│ ├─ 包含信息:权限、所有者、大小、时间戳、数据块指针等
│ └─ 重要特性:文件名不存储在inode中
├─ Ext2文件系统核心原理
│ ├─ 宏观结构
│ │ ├─ 启动块:1KB,存储分区和启动信息,标准规定
│ │ └─ 块组(Block Group):分区划分为多个相同大小的块组
│ ├─ 块组内部构成
│ │ ├─ 超级块(Super Block)
│ │ │ ├─ 存储文件系统整体结构信息
│ │ │ ├─ 内容:块和inode总量、空闲数量、大小、挂载时间等
│ │ │ └─ 备份:多个块组开头有拷贝,保证可靠性
│ │ ├─ 块组描述符表(GDT)
│ │ │ ├─ 描述每个块组的属性
│ │ │ └─ 内容:块位图位置、inode位图位置、inode表位置、空闲数量等
│ │ ├─ 块位图(Block Bitmap):记录数据块的占用状态
│ │ ├─ inode位图(Inode Bitmap):记录inode的占用状态
│ │ ├─ inode表(Inode Table):存储该块组所有inode
│ │ └─ 数据块(Data Blocks):存储文件内容
│ ├─ inode与数据块映射
│ │ ├─ 12个直接块指针:直接指向数据块
│ │ ├─ 1个一级间接块指针:指向存储块指针的块
│ │ ├─ 1个二级间接块指针:指向一级间接块指针的块
│ │ └─ 1个三级间接块指针:指向二级间接块指针的块
│ ├─ 目录与文件名的本质
│ │ ├─ 目录是特殊文件
│ │ ├─ 目录内容:存储文件名与inode号的映射关系
│ │ └─ 文件创建流程:分配inode→分配数据块→记录映射→添加目录项
│ ├─ 路径解析过程
│ │ ├─ 核心逻辑:从根目录开始递归解析
│ │ ├─ 根目录特性:固定inode号,系统开机即知晓
│ │ └─ 进程依赖:进程通过当前工作目录(CWD)提供路径
│ ├─ 路径缓存机制
│ │ ├─ 内核结构体:struct dentry
│ │ ├─ 作用:缓存路径结构,加速文件查找
│ │ └─ 管理:LRU淘汰+哈希表快速查找
│ └─ 分区挂载原理
│ │ ├─ 挂载本质:将分区与空目录建立关联
│ │ ├─ 循环设备:将文件模拟为块设备进行挂载
│ │ └─ 分区识别:通过路径前缀判断文件所属分区
└─ 软硬连接
├─ 硬链接
│ ├─ 本质:多个文件名指向同一个inode
│ ├─ 特性:inode号相同,硬链接数计数
│ ├─ 删除逻辑:删除目录项+硬链接数-1,为0时释放磁盘
│ └─ 限制:不能跨分区,不能链接目录
├─ 软链接
│ ├─ 本质:独立文件,存储目标文件的路径
│ ├─ 特性:inode号不同,类似Windows快捷方式
│ └─ 限制:目标文件删除后软链接失效
├─ 软硬连接对比
│ ├─ 硬链接:共享inode,不占额外inode,不能跨分区
│ └─ 软链接:独立inode,占额外inode,可跨分区、链接目录
└─ 用途
├─ 硬链接:文件备份、.和..目录
└─ 软链接:快捷方式、库文件版本管理
导入语
Ext 系列文件系统是 Linux 操作系统中最经典、应用最广泛的文件系统家族,从早期的 ext2 到后来的 ext3、ext4,其核心设计思想一脉相承,深刻影响了 Linux 存储体系的发展。要真正理解文件系统如何管理磁盘数据,必须从最底层的磁盘硬件结构入手,逐步向上推导,建立 "硬件寻址→逻辑抽象→文件组织→系统调用" 的完整逻辑链条。本文将系统讲解磁盘的物理与逻辑结构、CHS 与 LBA 两种寻址方式的原理与转换,深入剖析 Ext2 文件系统的块组设计、inode 机制、目录本质、路径解析与挂载过程,最后详细对比软硬连接的区别与应用场景。无论是初次学习还是复习回顾,都能通过本文快速串联起所有核心知识点,形成清晰的知识体系。
1 ~> 磁盘硬件基础
1.1 磁盘的基本认知
机械磁盘是计算机中唯一的机械设备,作为外部存储设备,它具有容量大、价格便宜的显著优势,但同时也因为机械运动的特性导致读写速度远慢于内存。磁盘属于典型的块设备,即数据的读写是以固定大小的块为单位进行的,而非单个字节。
1.2 磁盘物理结构
磁盘的核心物理组件包括盘片、磁头、磁臂和主轴。盘片是存储数据的载体,通常一个磁盘包含多个盘片,每个盘片的上下两面都可以存储数据,因此每个盘面对应一个独立的磁头。所有磁头都固定在同一个磁臂上,这意味着它们会 "共进退",当磁臂移动时,所有磁头会同时定位到各自盘面的相同半径位置。主轴则负责带动所有盘片以固定的高速旋转,使得磁头能够读取盘片上不同位置的数据。
1.3 磁盘存储结构
从存储结构来看,盘片表面被划分为多个同心圆,每个同心圆称为一个磁道,磁道从外圈向内圈依次编号,最靠近主轴的磁道通常用于停靠磁头,不存储数据。每个磁道又被进一步分割成多个扇形区域,这就是扇区,扇区是磁盘存储数据的基本单位,标准大小为 512 字节。
由于所有磁头共进退,不同盘面上相同半径的磁道会形成一个圆柱状的结构,这就是柱面。柱面是一个逻辑概念,其数量与单个盘面的磁道数量完全相等,这一特性是磁盘分区和寻址的重要基础。
1.4 CHS 寻址方式


早期的磁盘采用 CHS(柱面 Cylinder、磁头 Head、扇区 Sector)寻址方式来定位数据。其核心逻辑是:首先通过磁臂将磁头移动到目标柱面,然后选择对应的磁头,最后等待目标扇区旋转到磁头下方,即可完成数据的读写。
磁盘的总容量可以通过 CHS 参数计算得出,公式为: 磁盘容量 = 磁头数 × 柱面数 × 每磁道扇区数 × 每扇区字节数
然而 CHS 寻址方式存在明显的局限性。系统使用 8 位存储磁头地址、10 位存储柱面地址、6 位存储扇区地址,因此最大支持的容量为 256×1024×63×512B=8064MB(约 8.4GB),无法满足大容量磁盘的需求。
1.5 磁盘逻辑结构与 LBA 寻址
为了解决 CHS 寻址的容量限制,现代磁盘采用了逻辑块地址(LBA,Logical Block Address)寻址方式。其核心思想是将磁盘的三维物理结构抽象为一个一维的扇区数组,每个扇区都有一个唯一的线性地址,即 LBA 地址,从 0 开始依次编号。
这种抽象屏蔽了磁盘复杂的物理结构,操作系统只需要使用 LBA 地址即可访问任意扇区,而 LBA 与 CHS 之间的转换工作完全由磁盘内部的固件(硬件电路和伺服系统)完成。对于操作系统而言,磁盘就是一个元素为扇区的一维数组,数组下标就是 LBA 地址。
1.6 CHS 与 LBA 地址转换
虽然操作系统不再直接使用 CHS 地址,但磁盘固件仍需要完成两者之间的转换。转换公式如下:
- CHS 转 LBA:LBA = 柱面号 C × (磁头总数 × 每磁道扇区数) + 磁头号 H × 每磁道扇区数 + 扇区号 S - 1 其中扇区号从 1 开始编号,而 LBA 从 0 开始,因此需要减 1。
- LBA 转 CHS: 柱面号 C = LBA // (磁头总数 × 每磁道扇区数) 磁头号 H = (LBA % (磁头总数 × 每磁道扇区数)) // 每磁道扇区数 扇区号 S = (LBA % 每磁道扇区数) + 1
磁盘内部会自动维护总柱面数、磁头数、每磁道扇区数等参数,操作系统在开机时会读取这些参数用于后续的磁盘管理。
2 ~> 文件系统基础概念引入


2.1 "块" 的概念
虽然扇区是磁盘的基本存储单位,但操作系统并不会直接以扇区为单位读写数据,因为这样效率太低。操作系统会将多个连续的扇区组合成一个 "块"(block),作为文件存取的最小单位。
块的大小在格式化分区时确定,一旦确定就无法更改,最常见的大小是 4KB,即由 8 个连续的 512 字节扇区组成。块号与 LBA 地址之间可以简单转换:块号 = LBA / 8;LBA = 块号 × 8 + n(n 为块内第几个扇区)。
2.2 "分区" 的概念
磁盘可以被划分为多个独立的分区,就像 Windows 中的 C、D、E 盘一样。分区的本质是设置每个分区的起始柱面号和结束柱面号,因此柱面是分区的最小单位。只要知道分区的起止柱面号和每个柱面的扇区数,就可以计算出分区的总容量和对应的 LBA 地址范围。
在 Linux 系统中,所有设备都以文件的形式存在,磁盘分区通常表示为 /dev/vda1、/dev/sda2 等形式。
2.3 "inode" 的概念
文件由两部分组成:内容和属性。文件内容存储在数据块中,而文件的属性信息(如创建者、创建日期、大小、权限等)则存储在一个专门的区域,这个区域就是 inode(索引节点)。
每个文件都对应一个唯一的 inode,inode 号是文件在分区内的唯一标识。inode 的大小通常为 128 字节或 256 字节,所有文件的 inode 大小都是相同的,与文件内容的大小无关。需要特别注意的是,文件名并不存储在 inode 中,这是理解 Linux 文件系统的一个关键要点。
ext2 文件系统中 inode 的数据结构如下:
c
struct ext2_inode {
__le16 i_mode; /* 文件模式 */
__le16 i_uid; /* 所有者UID低16位 */
__le32 i_size; /* 文件大小(字节) */
__le32 i_atime; /* 访问时间 */
__le32 i_ctime; /* 创建时间 */
__le32 i_mtime; /* 修改时间 */
__le32 i_dtime; /* 删除时间 */
__le16 i_gid; /* 组GID低16位 */
__le16 i_links_count; /* 硬链接数 */
__le32 i_blocks; /* 占用块数 */
__le32 i_flags; /* 文件标志 */
union {
struct { __le32 l_i_reserved1; } linux1;
struct { __le32 h_i_translator; } hurd1;
struct { __le32 m_i_reserved1; } masix1;
} osd1; /* 操作系统相关1 */
__le32 i_block[EXT2_N_BLOCKS]; /* 数据块指针 */
__le32 i_generation; /* 文件版本(用于NFS) */
__le32 i_file_acl; /* 文件ACL */
__le32 i_dir_acl; /* 目录ACL */
__le32 i_faddr; /* 碎片地址 */
union {
struct {
__u8 l_i_frag; /* 碎片号 */
__u8 l_i_fsize; /* 碎片大小 */
__u16 i_pad1;
__le16 l_i_uid_high; /* 所有者UID高16位 */
__le16 l_i_gid_high; /* 组GID高16位 */
__u32 l_i_reserved2;
} linux2;
struct {
__u8 h_i_frag; /* 碎片号 */
__u8 h_i_fsize; /* 碎片大小 */
__le16 h_i_mode_high;
__le16 h_i_uid_high;
__le16 h_i_gid_high;
__le32 h_i_author;
} hurd2;
struct {
__u8 m_i_frag; /* 碎片号 */
__u8 m_i_fsize; /* 碎片大小 */
__u16 m_pad1;
__u32 m_i_reserved2[2];
} masix2;
} osd2; /* 操作系统相关2 */
};
#define EXT2_NDIR_BLOCKS 12
#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
其中EXT2_N_BLOCKS的值为 15,即每个 inode 包含 15 个数据块指针。
3 ~> Ext2 文件系统核心原理
3.1 Ext2 文件系统宏观结构
要在磁盘上存储文件,必须先将磁盘分区格式化为特定的文件系统。Ext2 是 Linux 早期最常用的文件系统,ext3 和 ext4 都是在其基础上增强而来,核心设计保持不变。
Ext2 文件系统将整个分区划分为若干个大小相同的块组(Block Group),每个块组都具有相同的结构。分区最开始是 1KB 的启动块,由 PC 标准规定,用于存储磁盘分区信息和启动加载程序,任何文件系统都不能修改这部分内容。启动块之后才是 Ext2 文件系统的实际区域,由多个连续的块组组成。
3.2 块组内部构成
每个块组都由以下六个部分组成:
- 超级块(Super Block):存储整个文件系统的结构信息,包括块和 inode 的总量、未使用的块和 inode 数量、块和 inode 的大小、最近一次挂载时间、最近一次写入时间、最近一次磁盘检验时间等。超级块是文件系统的 "大脑",如果超级块损坏,整个文件系统将无法访问。为了保证可靠性,超级块会在多个块组的开头进行备份,所有备份的数据保持一致。
- 块组描述符表(GDT):每个块组对应一个块组描述符,描述该块组的属性信息,包括块位图的位置、inode 位图的位置、inode 表的起始块号、空闲块数量、空闲 inode 数量、已使用的目录数量等。块组描述符表同样会在多个块组中进行备份。
- 块位图(Block Bitmap):由一系列二进制位组成,每个位对应一个数据块,0 表示该块空闲,1 表示该块已被占用。通过块位图可以快速找到空闲的数据块。
- inode 位图(Inode Bitmap):与块位图类似,每个位对应一个 inode,0 表示该 inode 空闲,1 表示该 inode 已被占用。
- inode 表(Inode Table):存储该块组中所有 inode 的集合,每个 inode 对应一个文件。inode 编号以分区为单位进行整体划分,不能跨分区使用。
- 数据块(Data Blocks):真正存储文件内容的区域。对于普通文件,数据块存储文件的实际内容;对于目录文件,数据块存储该目录下所有文件名和对应的 inode 号的映射关系。块号同样以分区为单位划分,不能跨分区。
3.3 inode 与数据块的映射关系


inode 中的i_block数组包含 15 个指针,用于建立 inode 与数据块之间的映射关系,具体分为四级:
- 12 个直接块指针:直接指向存储文件内容的数据块。如果文件大小不超过 12×4KB=48KB,只需要使用直接块指针即可。
- 1 个一级间接块指针:不直接指向数据块,而是指向一个存储块指针的块。每个块指针占 4 字节,一个 4KB 的块可以存储 1024 个块指针,因此一级间接块可以支持 1024×4KB=4MB 的文件大小。
- 1 个二级间接块指针:指向一个存储一级间接块指针的块。二级间接块可以支持 1024×1024×4KB=4GB 的文件大小。
- 1 个三级间接块指针:指向一个存储二级间接块指针的块。三级间接块可以支持 1024×1024×1024×4KB=4TB 的文件大小。
通过这种多级间接映射机制,Ext2 文件系统可以支持非常大的文件。
3.4 目录与文件名的本质
在 Linux 中,目录也是一种特殊的文件。磁盘上并没有 "目录" 的概念,只有文件属性和文件内容。目录文件的属性存储在自己的 inode 中,而目录文件的内容则是该目录下所有文件名和对应 inode 号的映射表。
这就是为什么文件名不存储在 inode 中的原因:一个 inode 可以被多个文件名指向,而文件名只是目录文件中的一个条目。当我们使用ls -l命令查看文件信息时,系统会先读取目录文件的内容,获取文件名对应的 inode 号,然后再根据 inode 号读取文件的属性信息。
创建一个新文件的完整流程如下:
- 存储属性:内核找到一个空闲的 inode,将文件的属性信息(权限、所有者、时间等)写入该 inode。
- 存储数据:根据文件大小分配相应数量的空闲数据块,将文件内容写入这些数据块。
- 记录分配情况:在 inode 的
i_block数组中记录数据块的编号。 - 添加文件名到目录:将新的文件名和对应的 inode 号添加到所在目录的目录文件中,建立文件名与 inode 的映射关系。
3.5 路径解析过程
我们访问文件时使用的是文件名和路径,而不是 inode 号,这就需要系统进行路径解析。路径解析的核心逻辑是从根目录开始,依次打开路径中的每一个目录,根据目录名获取下一级目录的 inode 号,直到找到目标文件的 inode 号。
根目录是一个特殊的目录,它的 inode 号是固定的,系统开机后就会知道根目录的 inode 号,因此路径解析的递归过程有了明确的出口。例如,要访问/home/whb/code/test.c,系统会先打开根目录/,找到home对应的 inode 号;然后打开home目录,找到whb对应的 inode 号;接着打开whb目录,找到code对应的 inode 号;最后打开code目录,找到test.c对应的 inode 号,从而完成文件的访问。
进程在访问文件时,会通过自己的当前工作目录(CWD)提供路径上下文。如果使用相对路径访问文件,系统会从进程的当前工作目录开始解析路径;如果使用绝对路径,则从根目录开始解析。
3.6 路径缓存机制
如果每次访问文件都要从根目录开始递归解析路径,效率会非常低。因此 Linux 内核引入了路径缓存机制,通过struct dentry结构体来缓存已经解析过的路径结构。
每个被打开的文件和目录都会对应一个dentry结构体,这些结构体在内存中形成一个树形结构,与磁盘上的目录树相对应。dentry结构体中包含了文件名、指向父目录的指针、指向子目录的链表、指向对应 inode 的指针等信息。
内核通过 LRU(最近最少使用)算法管理dentry缓存,当缓存满时,会淘汰最近最少使用的dentry节点。同时,内核还使用哈希表来加速dentry的查找,使得路径解析的效率大大提高。
3.7 分区挂载原理
inode 号是以分区为单位的,不能跨分区使用。因此,Linux 系统需要通过挂载机制将多个分区整合到同一个目录树中。挂载的本质是将一个分区的文件系统与一个空目录建立关联,使得访问该目录就相当于访问该分区的根目录。
我们可以通过一个简单的实验来理解挂载过程:
- 创建一个 5MB 的磁盘镜像文件:
dd if=/dev/zero of=./disk.img bs=1M count=5 - 将镜像文件格式化为 ext4 文件系统:
mkfs.ext4 disk.img - 创建一个空目录作为挂载点:
mkdir /mnt/mydisk - 将镜像文件挂载到该目录:
sudo mount -t ext4 ./disk.img /mnt/mydisk/ - 查看挂载结果:
df -h,可以看到/dev/loop0设备挂载到了/mnt/mydisk - 卸载分区:
sudo umount /mnt/mydisk
这里使用了循环设备(loop device),它是一种伪设备,可以将普通文件模拟为块设备,从而可以像挂载物理磁盘分区一样挂载磁盘镜像文件。挂载完成后,系统会根据文件的路径前缀来判断该文件属于哪个分区,从而找到对应的文件系统进行访问。
4 ~> 软硬连接

4.1 硬链接
硬链接的本质是多个文件名指向同一个 inode。我们可以使用ln命令创建硬链接,例如:
bash
touch abc
ln abc def
ls -li abc def
执行结果会显示abc和def具有相同的 inode 号,并且 inode 中的硬链接数会变为 2。
硬链接的特性:
- 所有硬链接共享同一个 inode,因此它们的文件属性和内容完全相同。
- 删除一个硬链接只会删除目录中的对应条目,并将 inode 的硬链接数减 1。只有当硬链接数变为 0 时,系统才会释放该 inode 和对应的数据块。
- 硬链接不能跨分区,因为 inode 号只在分区内唯一。
- 硬链接不能链接目录,否则会导致目录树出现循环。
Linux 系统中的.和..就是硬链接,.指向当前目录,..指向当前目录的父目录。
4.2 软链接
软链接(也称为符号链接)的本质是一个独立的文件,它的内容是目标文件的路径。我们可以使用ln -s命令创建软链接,例如:
bash
ln -s abc abc.s
ls -li abc abc.s
执行结果会显示abc.s的 inode 号与abc不同,并且文件类型为l(链接文件),文件大小为目标路径的长度。
软链接的特性:
- 软链接是独立的文件,有自己的 inode 和数据块。
- 软链接通过文件名引用目标文件,因此可以跨分区使用,也可以链接目录。
- 如果目标文件被删除,软链接会变成 "死链接",指向一个不存在的文件。
- 修改软链接的内容实际上是修改目标文件的内容。
4.3 软硬连接对比与用途
硬链接和软链接的核心区别在于:硬链接是 inode 级别的共享,而软链接是文件名级别的引用。具体对比如下:
- inode 号:硬链接与目标文件相同,软链接不同。
- 跨分区:硬链接不可以,软链接可以。
- 链接目录:硬链接不可以,软链接可以。
- 文件独立性:硬链接不独立,软链接独立。
- 目标文件删除影响:硬链接不受影响,软链接失效。
硬链接的主要用途是文件备份,可以在不占用额外磁盘空间的情况下创建文件的多个副本;软链接的主要用途是创建快捷方式,方便文件的访问,以及库文件的版本管理。
5 ~> 全文总结
本文系统讲解了 Ext 系列文件系统的核心原理,从最底层的磁盘硬件结构开始,逐步深入到文件系统的组织管理和文件操作机制。
首先,磁盘的物理结构包括盘片、磁头、磁臂和主轴,存储结构分为磁道、扇区和柱面。早期的 CHS 寻址方式存在 8.4GB 的容量限制,现代磁盘采用 LBA 寻址方式,将三维物理结构抽象为一维扇区数组,由磁盘固件完成两者之间的转换。
其次,文件系统引入了块、分区和 inode 三个核心概念。块是文件存取的最小单位,通常为 4KB;分区是磁盘的逻辑划分,以柱面为最小单位;inode 是存储文件属性的区域,一个文件对应一个 inode,文件名不存储在 inode 中。
然后,Ext2 文件系统将分区划分为多个块组,每个块组包含超级块、块组描述符表、块位图、inode 位图、inode 表和数据块六个部分。inode 通过 12 个直接块指针和 3 个间接块指针与数据块建立映射关系,支持大文件存储。目录是特殊文件,其内容存储文件名与 inode 号的映射关系。路径解析从根目录开始递归进行,内核通过 dentry 缓存加速路径查找。挂载机制将多个分区整合到同一个目录树中,通过路径前缀识别文件所属分区。
最后,硬链接是多个文件名指向同一个 inode,共享文件内容和属性;软链接是独立文件,存储目标文件的路径。两者各有特点,适用于不同的应用场景。
掌握这些核心的知识点,就能建立起从磁盘硬件到文件系统的完整逻辑链条,深入理解 Linux 系统如何管理和存储数据。
结尾
uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!
结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ### 艾莉丝努力练剑 C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主 *** ** * ** *** 👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。 ❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。 ⭐ 【收藏】 把核心知识点存好,在需要时随时查、随时用。 💬 【评论】 分享你的经验或疑问,评论区一起交流避坑! 不要忘记给博主"一键四连"哦! "今日练剑达成!"
"技术之路难免有困惑,但同行的人会让前进更有方向。" |
往期回顾:
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა
