在看下面内容之前,建议先看一下这篇文章,理解一下inode Linux:Ext系列文件系统-CSDN博客
https://blog.csdn.net/2401_88433210/article/details/156613350?spm=1011.2415.3001.5331
一、硬链接
我们看到,真正找到磁盘上文件的并不是文件名,而是inode。其实在linux中可以让多个文件名对应于同一个inode。
1. 定义与原理
硬链接是给现有文件的 inode 新增一个文件名映射,相当于为同一个文件数据取了多个名字。
- 硬链接和原文件共用同一个 inode,因此 inode 编号相同。
- 硬链接本质上不是 "新文件",只是原文件的一个别名。
2. 创建命令
bash
ln 原文件路径 硬链接路径
示例:为 test.txt 创建硬链接 test_hard.txt

可以看到inode一样,都是指向同一个文件
同时硬链接数由1变成了2,表面有两个文件指向这个inode

我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
在当前目录下创建path目录,进入path,会发现.和..对应的硬链接都会加1,. 对应的是当前目录的硬链接,.. 对应的是上级目录的硬链接


- 所以知道了一个目录的硬链接数,就可以通过 -2,知道这个文件里面有多少个目录了
- 可以进行文件的备份
3. 核心特性
| 特性 | 说明 |
|---|---|
| inode 共享 | 硬链接与原文件 inode 号相同,元数据完全一致。 |
| 跨分区限制 | 无法跨文件系统(分区)创建,因为不同分区的 inode 是独立编号的。 |
| 目录限制 | 不能为目录创建硬链接(Linux 系统限制,避免目录树循环)。 |
| 删除机制 | 文件的链接数 (inode 中的 nlink 字段)记录了指向该 inode 的文件名数量。删除原文件或硬链接时,仅减少链接数;只有当链接数减为 0 时,才会真正删除文件数据。 |
| 权限继承 | 对硬链接的读写操作等同于对原文件的操作,权限由 inode 控制。 |
二、软链接
1. 定义与原理
软链接是一个独立的文件 ,它的内容是原文件的路径,相当于 Windows 中的 "快捷方式"。
- 软链接有自己的 inode,与原文件的 inode 号不同。
- 访问软链接时,系统会根据其存储的路径跳转到原文件。
2. 创建命令
bash
ln -s 原文件路径 软链接路径
示例:为 test.txt 创建软链接 test_soft.txt

test_soft.txt文件有内容,存储的是源文件的路径,但是不能打开,因为会直接链接到源文件。
软链接可以用来给深度太深的运行程序创建快捷方式,让用户方便调用。
3. 核心特性
| 特性 | 说明 |
|---|---|
| 独立 inode | 软链接有自己的 inode,元数据(如创建时间)与原文件无关。 |
| 跨分区支持 | 可以跨文件系统(分区)创建,因为软链接存储的是原文件的绝对 / 相对路径。 |
| 目录支持 | 可以为目录创建软链接(常用场景:如为版本目录创建快捷方式 ln -s /usr/local/python3.10 /usr/local/python)。 |
| 删除机制 | 软链接是独立文件,删除软链接不影响原文件 ;但如果删除原文件,软链接会变成悬空链接 (指向不存在的文件),访问时会报错 No such file or directory。 |
| 权限特点 | 软链接的权限显示为 lrwxrwxrwx(所有用户可读写执行),但实际权限由原文件决定。 |
三、硬链接 vs 软链接 核心区别总结
| 对比维度 | 硬链接 | 软链接 |
|---|---|---|
| inode 关系 | 与原文件共用同一个 inode | 有独立的 inode |
| 本质 | 原文件的别名 | 指向原文件的快捷方式(独立文件) |
| 跨分区 | 不支持 | 支持 |
| 目录链接 | 不支持 | 支持 |
| 删除原文件 | 仍可通过硬链接访问文件数据 | 软链接变为悬空链接,无法访问 |
| 权限 | 与原文件权限一致 | 权限显示为 lrwxrwxrwx,实际由原文件决定 |
| 标识 | ls -l 无特殊标识,与普通文件一致 |
ls -l 以 l 开头,末尾显示 -> 原路径 |
四、典型使用场景
- 硬链接 :适合需要多位置访问同一文件数据,且不希望因删除某一个别名导致文件丢失的场景。例如:日志文件的多目录备份。
- 软链接 :适合目录快捷方式 、跨分区文件访问 、版本管理 等场景。例如:为
/usr/local/php-8.2创建软链接/usr/local/php,方便切换版本。