Ext系列文件系统

一 硬件层面

1-1 磁盘

  • 机械磁盘是计算机中唯一的一个机械设备
  • 磁盘--- 外设
  • 容量大,价格便宜

1-2 磁盘物理结构

1-3 磁盘的存储结构

1-4 如何定位一个扇区

  • 可以先定位磁头(确定正反面)
  • 确定磁头要访问哪一个柱面(磁道)
  • 定位一个扇区
  • CHS地址定位

1-5 理解各个存储结构

  • 扇区是从磁盘读出和写入信息的最小单位,通常大小为 512 字节。
  • 磁头(head)数:每个盘片一般有上下两面,分别对应 1 个磁头,共 2 个磁头
  • 磁道(track)数:磁道是从盘片外圈往内圈编号 0 磁道,1 磁道...,靠近主轴的同心圆用于停靠磁头,不存储数据
  • 柱面(cylinder)数:磁道构成柱面,数量上等同于磁道个数
  • 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同
  • 圆盘(platter)数:就是盘片的数量
  • 磁盘容量 = 磁头数 × 磁道 (柱面) 数 × 每道扇区数 × 每扇区字节数
  • 细节:传动臂上的磁头是共进退的 (这点比较重要)

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

1-6 磁盘的逻辑结构

⼀个细节:传动臂上的磁头是共进退的

柱面是⼀个逻辑上的概念,其实就是每⼀面上,相同半径的磁道逻辑上构成柱面。

所以,磁盘物理上分了很多面,但是在我们看来,逻辑上,磁盘整体是由"柱面"卷起来的。

所以,磁盘的真实情况是:
磁道:

某⼀盘面的某⼀个磁道展开:

即:⼀维数组
柱面:

整个磁盘所有盘面的同⼀个磁道,即柱面展开:

  • 柱面上的每个磁道,扇区个数是一样的
  • 这就是二维数组

整盘:

整个磁盘不就是多张⼆维的扇区数组表(三维数组)

所有,寻址⼀个扇区:先找到哪⼀个柱面(Cylinder) ,在确定柱面内哪⼀个磁道(其实就是磁头位置,Head),在确定扇区(Sector),所以就有了 CHS 。

我们之前学过C/C++的数组,在我们看来,其实全部都是⼀维数组:

所以,每⼀个扇区都有⼀个下标,我们叫做 LBA(Logical Block Address) 地址,其实就是线性

地址。

OS只需要使用LBA就可以了!!LBA地址转成CHS地址,CHS如何转换成为LBA地址。谁做啊? 磁盘自己来做!固件(硬件电路,伺服系统)。

所以:从此往后,在磁盘使用者看来,根本就不关心CHS地址,而是直接使用LBA地址,磁盘内部自己转换。所以:从现在开始,磁盘就是⼀个 元素为扇区 的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使用磁盘,就可以用⼀个数字访问磁盘扇区了。

二 软件层面 (引入文件系统)

2-1 引入"块"概念

其实硬盘是典型的"块"设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样

效率太低,而是⼀次性连续读取多个扇区,即⼀次性读取⼀个"块"(block)。

硬盘的每个分区是被划分为⼀个个的"块"。⼀个"块"的大小是由格式化的时候确定的,并且不可

以更改,最常见的是4KB,即连续八个扇区组成⼀个 "块"。"块"是文件存取的最小单位。

注意:

  • 磁盘就是一个三维数组,我们把它看待成为一个 "一维数组",数组下标就是 LBA,每个元素都是扇区
  • 每个扇区都有 LBA,那么 8 个扇区一个块,每一个块的地址我们也能算出来。
  • 知道 LBA:块号 = LBA/8
  • 知道块号:LBA = 块号 * 8 + n. (n 是块内第几个扇区)

2-2 引入"分区"概念

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

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

柱面大小⼀致,扇区个位⼀致,那么其实只要知道每个分区的起始和结束柱面号,知道每

⼀个柱面多少个扇区,那么该分区多大,其实和解释LBA是多少也就清楚了.

2-3 引入"inode"概念

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

每⼀个文件都有对应的inode,里面包含了与该文件有关的⼀些信息:

  • 模式

  • 硬链接数

  • 文件所有者

  • 大小

  • 最后修改时间

  • 文件名

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

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

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

  • inode的大小一般是128字节或者256

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

三 ext2 文件系统(管理)

3-1 宏观认识

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

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

上图中启动块(Boot Block/Sector)的大小是确定的,为1KB,由PC标准规定,用来存储磁盘分区信息和启动信息,任何文件系统都不能修改启动块。启动块之后才是ext2文件系统的开始。

3-2 Block Group(块组)

ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。区包含组,组包含块,块包含扇区。一个组中有文件数据和管理文件数据的信息。

3-3 块组内部构成

3-3-1 Super Block

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

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

3-3-2 GDT

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

3-3-3 块位图(Block Bitmap)

Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用

3-3-4 inode位图(Inode Bitmap)

每个bit表示⼀个inode是否空闲可用

3-3-5 i节点表(Inode Table)

  • 存放文件属性 如 文件大小,所有者,最近修改时间等
  • 当前分组所有 Inode 属性的集合
  • inode 编号以分区为单位,整体划分,不可跨分区

3-4 inode和datablock映射

inode内部存在 __le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */ ,

EXT2_N_BLOCKS =15,就是用来进行inode和block映射的

3-4-1 对文件的操作之下,块组内各部分之间的联系

知道inode号的情况下,在指定分区,请解释:对文件进行增、删、查、改是在

做什么?

先明确四个结构
  1. inode Bitmap:位图,标记哪个 inode 空闲 / 已占用
  2. inode Table:inode 结构体数组,按 inode 号索引存文件元信息、数据块指针
  3. Block Bitmap:位图,标记哪个 Data Block 空闲 / 已占用
  4. Data Blocks:真正存文件内容、目录内容的数据块区域
一、查(读取文件内容)
  1. 通过inode 号 ,直接索引 inode Table 拿到该 inode
  2. 从 inode 中取出指向 Data Blocks 的块指针
  3. 按指针读取对应 Data Blocks 里的内容
  4. 不改动 inode Bitmap、Block Bitmap、inodeTable、DataBlocks,纯读取
二、改(修改已有文件内容,不扩容)
  1. inode 号定位 inode Table,取出数据块指针
  2. 找到对应 Data Blocks,原地覆盖修改内容
  3. 更新 inode Table 中该 inode 的时间戳等元信息
  4. inode Bitmap、Block Bitmap 都不变,不申请、不释放任何块
三、增(追加 / 写入新内容、文件扩容)
  1. 需新数据块:查 Block Bitmap,找标记为空闲的块
  2. 把该块在 Block Bitmap 中改为已占用
  3. 将新分配的 Data Blocks 地址,写入 inode Table 对应 inode 的块指针
  4. 把新增内容写入新分配的 Data Blocks
  5. 更新 inode Table 里该 inode 的文件大小、时间戳
  6. inode Bitmap 无变化(已存在 inode,不新建)
四、删(删除文件 unlink)
  1. inode 号定位 inode Table,硬链接数减 1
  2. 链接数仍 > 0:只改 inode Table 链接计数,其余三个结构都不动
  3. 链接数归 0:
    • 遍历该 inode 所有指向的 Data Blocks ,逐个在 Block Bitmap 中标记为空闲
    • inode Bitmap 中将该 inode 位标记为空闲
    • 清空 inode Table 中该 inode 的块指针、元信息
    • 对应的 Data Blocks 逻辑回收,等待后续分配覆盖
极简一句话归纳
  • :只访 inode 表 → 读数据块,两张位图都不动
  • :改数据块内容 + 更新 inode 表,两张位图都不动
  • :查改 Block 位图 → 分配新数据块 → 挂到 inode 表
  • :链接数归零后,清空 inode 表、释放 inode 位图、释放 Block 位图、回收数据块
结论
  • 分区之后的格式化操作,就是对分区进行分组,在每个分组中写入 SB、GDT、Block Bitmap、Inode Bitmap 等管理信息,这些管理信息统称:文件系统
  • 只要知道文件的 inode 号,就能在指定分区中确定是哪一个分组,进而在哪一个分组确定是哪一个 inode
  • 拿到 inode 文件属性和内容就全部都有了

3-4-2 touch一个新文件

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

  • 存储属性内核先找到一个空闲的 i 节点(这里是 263466)。内核把文件信息记录到其中。

  • 存储数据该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到 300,下一块复制到 500,以此类推。

  • 记录分配情况文件内容按顺序 300,500,800 存放。内核在 inode 上的磁盘分布区记录了上述块列表。

  • 添加文件名到目录新的文件名 abc。linux 如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。文件名和 inode 之间的对应关系将文件名和文件的内容及属性连接起来。

3-5 目录与文件名

3-5-1 目录和文件名的关系

问题:

  • 我们访问文件,都是用的文件名,没用过 inode 号啊?
  • 目录是文件吗?如何理解?

答案:

  • 目录也是文件,但是磁盘上没有目录的概念,只有文件属性 + 文件内容的概念。
  • 目录的属性不用多说,内容保存的是:文件名和 Inode 号的映射关系(目录rw权限问题)

结论:

  • 所以,访问文件,必须打开当前目录,根据文件名,获得对应的 inode 号,然后进行文件访问
  • 所以,访问文件必须要知道当前工作目录,本质是必须能打开当前工作目录文件,查看目录文件的内容!
  • 所以,同一个目录下,文件名不能重复

3-5-2 重谈inode编号和块号

a. inode编号块号 的作用域
  • 结论 :inode 号和块号,不是仅在组内有效,而是在整个分区内唯一有效
  • 关键点:
    • 它们是分区级的唯一标识,不能跨分区使用。
    • 比如:分区 A 的 inode 1234,在分区 B 中可以存在,但它们完全是两个不同的文件。
  • 本质:分区是文件系统的边界,inode 和块号只在当前分区的文件系统内生效。
b. 分区内 inode 和数据块的数量是固定的
  • 结论:在一个分区(文件系统)内部,inode 总数、数据块总数,都是格式化时就提前设计好、固定下来的。
  • 例子里的数字:
    • 5,242,880:通常是该分区的总数据块数
    • 52,428:通常是该分区的总 inode 数
  • 补充:
    • 格式化时,文件系统会按比例预分配 inode 和数据块(比如 EXT 系列文件系统,默认按每几个数据块配一个 inode)。
    • 这也是为什么 inode 会被 "用完" 的原因:就算还有数据块空闲,如果 inode 号被耗尽,也无法创建新文件。

3-6 路径解析

打开当前工作目录文件,查看当前工作目录文件的内容?当前工作目录不也是文件吗?我们访问当前工作目录不也是只知道当前工作目录的文件名吗?要访问它,不也得知道当前工作目录的inode吗?

所以类似"递归",需要把路径中所有的目录全部解析,出口是"/"根目录。

而实际上,任何文件,都有路径,访问目标文件,比如: /home/whb/code/test/test/test.c

都要从根目录开始,依次打开每一个目录,根据目录名,依次访问每个目录下指定的目录,直到访问到test.c。这个过程叫做Linux路径解析。

注意:

• 所以,我们知道了:访问文件必须要有目录+文件名=路径的原因

• 根目录固定文件名,inode号,无需查找,系统开机之后就必须知道

可是路径谁提供?

  • 你访问文件,都是指令 / 工具访问,本质是进程访问,进程有 CWD!进程提供路径。
  • 你 open 文件,提供了路径

可是最开始的路径从哪里来?

  • 所以 Linux 为什么要有根目录,根目录下为什么要有那么多缺省目录?
  • 你为什么要有家目录,你自己可以新建目录?
  • 上面所有行为:本质就是在磁盘文件系统中,新建目录文件。而你新建的任何文件,都在你或者系统指定的目录下新建,这不就是天然就有路径了嘛!
  • 系统 + 用户共同构建 Linux 路径结构.

3-7 路径缓存

问题 1:Linux 磁盘中,存在真正的目录吗?

答案:不存在,只有文件。只保存文件属性 + 文件内容

问题 2:访问任何文件,都要从 / 目录开始进行路径解析?

答案:原则上是,但是这样太慢,所以 Linux 会缓存历史路径结构

问题 2:Linux 目录的概念,怎么产生的?

答案:打开的文件是目录的话,由 OS 自己在内存中进行路径维护

Linux中,在内核中维护树状路径结构的内核结构体叫做: struct dentry

注意:

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

一句话总结:dentry是内核为了优化路径解析速度,在内存中构建的文件路径缓存,它同时用树、LRU 和 Hash 三种结构,实现了高效的查找、淘汰和层级维护。

3-8 存储大文件问题

1. 前提基础

  1. 文件的实际内容,存放在数据块 DataBlock 中。
  2. inode 里有若干指针,用来指向数据块,通过指针找到文件内容。
  3. inode 自身大小是固定且很小的,不能随意扩容。
  4. 磁盘块大小固定(如 4KB),系统以块为单位管理磁盘。

2. 只用直接指针的局限性

inode 里只有固定数量的直接指针(如 12 个):

  • 每个直接指针只能指向一个数据块;
  • 少量直接指针能寻址的数据块有限,只能支撑很小的文件
  • 一旦文件体积超过直接指针能覆盖的范围,就没有多余指针去寻址更多数据块,无法存储大文件。

3. 不能无限增加直接指针的原因

  1. inode 大小固定,如果塞入大量直接指针,会增大 inode 体积,破坏文件系统规范。
  2. 日常绝大多数都是小文件,若给每个 inode 都预留大量直接指针,会严重浪费磁盘存储空间

4. 间接块索引指针的作用

  1. 间接指针不直接指向数据块 ,而是指向磁盘上一个间接索引块
  2. 间接索引块和普通数据块大小一致,整块内部全部存放指针,可以容纳成百上千个块指针。
  3. 间接索引块里的每一个指针,再分别指向真正存放文件内容的数据块。

5. 引入间接块索引指针的核心意义

  1. 解决指针数量不足问题:用 inode 里少量间接指针,通过间接索引块扩展出海量指针,可寻址无数数据块。
  2. 兼容大小文件 :小文件只用直接指针,无需占用间接块;大文件按需使用一级、二级、三级间接块,按需分配、不浪费空间
  3. 维持 inode 固定大小 :不用放大 inode 结构,仅增加少数间接指针位置,就能支持超大文件存储。
  4. 分层寻址:通过一级、二级、三级间接块套娃式索引,极大扩展文件系统支持的单文件最大容量。

3-9 挂载分区

3-9-1格式化的本质

给磁盘分区 "定规矩、划区域、建账本、清旧记录",让系统能按 inode + 块 的方式正常管理存文件。

  • 不是单纯删数据,是重建文件系统结构
  • 划分 inode 区、数据块区、位图、超级块
  • 初始化空闲标记、空白 inode、基础目录
  • 旧文件的索引全部失效,数据逻辑上不可找回

3-9-2 挂载

将磁盘格式化后的文件系统,我们能直接使用吗?

不能!

我们需要挂载,就是把独立磁盘分区接入系统目录树,给它一个访问入口,不挂载就无法使用分区

1. 核心原因

Linux 没有 Windows 那样的 C 盘、D 盘盘符概念 ,整个系统只有一棵以根目录 / 为起点的唯一目录树

硬盘分区、U 盘只是独立的存储空间,本身没有系统目录路径,无法直接被系统识别和访问

2. 挂载的本质

独立的磁盘分区 ,关联绑定到系统目录树中的一个空目录(挂载点) ,让这个分区融入系统唯一的目录树,从而拥有访问入口。

3. 不挂载为什么不能用
  1. 系统能识别到硬件分区,但没有对应的访问路径,无法读写;
  2. 分区内部有 inode、数据块、文件系统结构,但没接入系统目录树,Shell 和程序找不到它;
  3. Linux 所有文件操作都依赖目录路径,必须挂载才能通过目录访问分区内容。
4. 挂载后的效果

进入挂载点目录,就等价于进入该磁盘分区;往挂载点里新建、复制、删除文件,实际操作的就是这个分区的磁盘空间。

5. 一句话总结

Linux 只有一棵根目录树,挂载就是把独立磁盘分区接入系统目录树,给它一个访问入口,不挂载就无法使用分区

  • 分区写入文件系统,无法直接使用,需要和指定的目录关联,进行挂载才能使用。
  • 所以,可以根据访问目标文件的 "路径前缀" 准确判断我在哪一个分区。(理解到这个层面)

3-10 文件系统总结

四 软硬链接

4-1 硬链接

我们看到,真正找到磁盘上文件的并不是文件名,而是inode。其实在linux中可以让多个文件名对应于同⼀个inode。

bash 复制代码
[root@localhost linux]# touch abc
[root@localhost linux]# ln abc def
[root@localhost linux]# ls -li abc def
263466 abc
263466 def
  • abc 和 def 的链接状态完全相同,他们被称为指向文件的硬链接。内核记录了这个连接数,inode 263466 的硬连接数为 2。
  • 我们在删除文件时干了两件事情:1. 在目录中将对应的记录删除,2. 将硬连接数 - 1,如果为 0,则将对应的磁盘释放。

一、硬链接的本质

硬链接本质上就是 ** 文件系统中,多个目录项(文件名)指向同一个 inode(文件元数据)** 的机制。(在当前目录下新建一个新的字符串和目标文件的映射关系)

  • 一个文件在磁盘上只有一个 inode,记录了文件的元数据(权限、大小、磁盘块指针等)
  • 多个不同路径的文件名(目录项)可以指向同一个 inode,这些文件名就是硬链接
  • 它们共享同一个 inode 和磁盘数据块,只是名字不同,文件内容是完全同步的

举个例子:创建 ln abc def 后,abcdef 都指向 inode 263466,inode 的链接计数会变成 2。

二、硬链接的意义与作用

1. 实现文件共享与备份

多个用户或路径可以同时访问同一份文件数据,而无需复制多份磁盘数据,节省存储空间。

  • 例如多人协作的配置文件,多个路径硬链接指向同一份数据,修改一处所有路径都会生效
2. 防止文件被误删

只要文件的硬链接数大于 0,磁盘上的 inode 和数据块就不会被释放。

  • 删除其中一个硬链接,只是减少了 inode 的链接计数,只要还有其他硬链接存在,文件数据依然存在
  • 相当于给文件加了一层 "保护",避免误删导致数据丢失
3. 实现跨目录的文件引用

可以在不同目录下创建指向同一文件的链接,方便在不同路径访问同一份数据,而无需复制文件。

三、为什么不能给目录建立硬链接?

Linux 系统禁止用户手动给目录创建硬链接 ,核心原因是为了防止文件系统出现目录循环,破坏目录树结构的唯一性。

1. 会造成目录循环,导致路径解析死循环

假设允许给目录创建硬链接,比如把 /a/b 链接到 /c/d,就可能出现这种情况:

bash 复制代码
/
├── a/
│   └── b/  → 硬链接指向 /c/d
└── c/
    └── d/
        └── e/
            └── ../.. → 会回到 /a/b,再进入 /c/d/e,形成循环

当系统遍历目录(如 findls -R)时,会无限递归,陷入死循环,导致系统卡死。

2. 会破坏目录树的层级关系

目录树必须是有向无环图(DAG),每个文件的路径必须唯一。如果允许目录硬链接,一个目录可以同时出现在多个父目录下,导致路径不唯一,无法正确解析相对路径(如 ../),破坏文件系统的层级管理。

3. 系统自身的目录硬链接是特殊情况

系统中每个目录默认有两个特殊链接:

  • .:指向自身的硬链接
  • ..:指向父目录的硬链接这两个是内核自动维护的,严格遵循层级关系,不会形成循环,用户手动创建则无法保证。

4-2 软链接

硬链接是通过inode引用另外⼀个文件,软链接是通过名字引用另外⼀个文件,但实际上,新的文件和被引用的文件的inode不同,应用常见上可以想象成一个快捷方式。在shell中的做法

bash 复制代码
[root@localhost linux]# ln -s abc.s abc 
[root@localhost linux]# ls -li
263563 -rw-r--r--. 2 root root 0 9⽉ 15 17:45 abc
261678 lrwxrwxrwx. 1 root root 3 9⽉ 15 17:53 abc.s -> abc
263563 -rw-r--r--. 2 root root 0 9⽉ 15 17:45 def

一、软链接是什么(本质)

软链接也叫符号链接 。本质:是一个单独的小文件 ,里面只保存另一个文件 / 目录的路径

可以理解成:Windows 的快捷方式

  • 原文件是真实文件
  • 软链接只是一个记录「原文件在哪」的引路文件

特点:

  1. 和原文件不是同一个 inode
  2. 软链接有自己独立的 inode、自己占一点点磁盘空间
  3. 记录的是路径字符串

二、为什么要有软链接(作用、意义)

1. 可以给目录做链接

硬链接不让给目录建,软链接可以随意给目录创建,日常用得最多。

2. 支持跨分区、跨磁盘、跨系统

硬链接只能同一个文件系统内 ;软链接靠路径指向,可以跨分区、跨硬盘。

3. 方便统一入口、简化路径

比如程序装在 /usr/local/nginx-1.24建软链接 nginx → nginx-1.24以后只用 nginx 访问,升级版本只改软链接,不用改配置。

4. 原文件删了,软链接只是失效,不会乱破坏数据
  • 硬链接删完所有链接才释放数据
  • 软链接删掉原文件,只是快捷方式变红失效,不影响其他文件
5. 解决目录层级太深、路径太长的问题

把很深的路径链接到桌面或常用目录,一键进入。

三、软链接使用方式(命令 + 例子)

1. 创建软链接

语法:

bash 复制代码
ln -s  原文件/原目录  链接名
2. 给文件建软链接
bash 复制代码
ln -s  test.txt  link_test
3. 给目录建软链接(最常用)
bash 复制代码
ln -s  /home/abc/work  mywork
4. 查看软链接
bash 复制代码
ls -l
5. 删除软链接

和删普通文件一样:

bash 复制代码
rm 链接名

注意:只删软链接,不会删原文件。

四、一句话极简总结

  1. 软链接就是Linux 快捷方式,单独文件,存的是路径。
  2. 作用:可以链目录、跨分区、简化路径、方便版本管理
  3. 创建:ln -s 原路径 链接名

4-3 软硬链接对比

一、本质区别

硬链接

多个目录项(文件名) 指向同一个 inode。没有独立 inode,不是新文件,只是给同一个文件再起一个名字。

软链接(符号链接)

本身是一个独立的新文件 ,有自己独立 inode。文件里只存放原文件的路径,类似 Windows 快捷方式。


二、核心特性对比表

对比项 硬链接 软链接
是否独立文件 不是,无自己 inode 是,有自己独立 inode
指向什么 直接指向 inode 指向文件路径
跨分区 / 跨磁盘 不支持 支持
能否链接目录 普通用户不能创建 可以随意链接目录
删除原文件 硬链接还在,数据不丢 原文件删除后,软链接失效(红链接)
路径依赖 不依赖路径 依赖原路径,移动原文件就失效
文件大小 不占额外空间 占用空间,存路径字符串
相对路径生效 和路径无关,只认 inode 相对路径要以创建位置为参照
链接计数 inode 有链接数,计数减到 0 才删数据 不影响原文件链接计数

三、创建命令

硬链接
bash 复制代码
ln 原文件 链接名
软链接
bash 复制代码
ln -s 原文件/目录 链接名

四、删除后的表现

  1. 硬链接 删其中一个文件名,其他硬链接完全不受影响,数据依然存在;只有所有硬链接都删完,inode 和数据块才会释放。

  2. 软链接 删掉原文件,软链接还在 ,但变成无效链接,打不开;删软链接,完全不影响原文件


五、使用场景

硬链接适用
  • 重要文件做多份防误删
  • 同一文件多路径访问,节省磁盘不复制内容
软链接适用
  • 深层目录起别名,简化进入
  • 软件版本升级(只改软链接指向,不改配置)
  • 跨分区、跨磁盘做链接
  • 日常目录快捷入口

六、一句话极简总结

  • 硬链接:同 inode、同文件、不能跨分区、不能链目录、删原名不影响
  • 软链接:独立文件、存路径、能跨分区、能链目录、删原名直接失效
相关推荐
卧室小白1 小时前
MYSQL-主从复制
运维
Yupureki1 小时前
《MySQL数据库基础》6.表的增删查改
linux·服务器·数据库·mysql
一拳一个娘娘腔1 小时前
别让工具成为摆设:写给新手的 Kali Linux 命令“破壁”指南
linux
CDN3602 小时前
【硬核架构】2026年服务器运维:Rust重写核心组件与eBPF内核观测的实战
运维·服务器·架构
网络笨猪10 小时前
# Nginx企业级全套配置\+排错手册
运维·nginx
Yupureki10 小时前
《Linux网络编程》8.网络层IP原理
linux·运维·服务器·网络·ip
yyuuuzz10 小时前
aws亚马逊入门常见认知误区
运维·服务器·网络·云计算·github·aws
Je1lyfish11 小时前
CMU15-445 (2025 Fall/2026 Spring) Project#3 - QueryExecution
linux·c语言·开发语言·数据结构·数据库·c++·算法
DeepFlow 零侵扰全栈可观测11 小时前
运动战:AI 时代 IT 运维的决胜之道——DeepFlow 业务全链路可观测性的落地实践
运维·网络·人工智能·arcgis·云计算