注:合辑示例中图有点旧。
符号链接与硬链接技术
1 概述
在操作系统文件系统中,链接(Link)是一种允许一个文件或多个文件名指向同一文件实体的机制。链接技术广泛应用于文件共享、软件部署、备份迁移等场景。本文档系统介绍符号链接(Symbolic Link)与硬链接(Hard Link)的概念、原理、操作方法及注意事项,覆盖 Linux 与 Windows 两大平台。

2 文件系统基础概念
2.1 Inode 与 Data Block
Linux 文件系统在格式化磁盘分区后,将分区划分为两个区域:Inode 区 和 Data Block 区。
- Inode 区:存储文件的元数据(属性信息),包括文件权限、所有者、大小、时间戳等。每个文件对应一个 inode,inode 编号(inode-number)在同一个文件系统内唯一。
- Data Block 区:存储文件的实际数据内容。
文件的存取过程为:通过文件名查找对应的 inode-number,再定位到 inode,最终找到 Data Block 中的实际数据。
2.2 目录结构
Linux 中目录是一种特殊文件,其内容为文件名与 inode-number 的映射表。每个表项包含文件名和对应的 inode-number。因此,一个目录中有多少文件,就有多少个表项。
3 硬链接(Hard Link)
3.1 概念与原理
硬链接是一种文件系统机制,允许多个文件名指向同一个 inode。创建硬链接时,系统在目录表中新增一个表项,将该文件名映射到已有的 inode-number,文件数据本身不复制。因此,硬链接文件与源文件共享同一份 Data Block 数据。
3.2 硬链接特性
- 具有相同 inode-number 的多个文件互为硬链接文件。
- 删除硬链接文件或源文件中的任意一个,文件实体不会被删除,仅硬链接计数减一。
- 只有当所有硬链接文件及源文件均被删除(硬链接计数归零)后,文件系统才会回收该文件的 Data Block 空间。
- 硬链接文件是普通文件,可使用
rm命令删除。 - 可通过创建硬链接文件实现重要文件的防误删保护。
3.3 硬链接限制
- 不能跨文件系统:硬链接只能在同一文件系统内创建,因为不同分区的 inode-number 不保证唯一。
- 不能链接目录:为防止目录遍历产生循环引用,文件系统禁止对目录创建硬链接。
3.4 创建方法
在 Linux 中使用 ln 命令(不带 -s 选项)创建硬链接:
bash
# 为 1.txt 创建硬链接 2.txt
$ ln 1.txt 2.txt
# 验证:两个文件具有相同的 inode-number,硬链接计数为 2
$ ls -il
总用量 0
18388234 -rw-rw-r-- 2 sdxx09 sdxx09 0 6月 7 10:08 1.txt
18388234 -rw-rw-r-- 2 sdxx09 sdxx09 0 6月 7 10:08 2.txt
# 再创建硬链接 3.txt,硬链接计数变为 3
$ ln 1.txt 3.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 3 sdxx09 sdxx09 0 6月 7 10:08 1.txt
18388234 -rw-rw-r-- 3 sdxx09 sdxx09 0 6月 7 10:08 2.txt
18388234 -rw-rw-r-- 3 sdxx09 sdxx09 0 6月 7 10:08 3.txt
# 删除一个硬链接,剩余文件仍可正常访问
$ rm 2.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 2 sdxx09 sdxx09 0 6月 7 10:08 1.txt
18388234 -rw-rw-r-- 2 sdxx09 sdxx09 0 6月 7 10:08 3.txt
# 删除所有硬链接后,文件实体被彻底删除
$ rm 3.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 1 sdxx09 sdxx09 0 6月 7 10:08 1.txt
4 符号链接(Symbolic Link)
4.1 概念与原理
符号链接(又称软链接)是一种特殊的文件类型,其内容为一个文本路径字符串,指向目标文件或目录的位置。与硬链接不同,符号链接不共享 inode,而是创建独立的 inode 和 Data Block(存储路径文本)。因此,符号链接类似于 Windows 系统中的快捷方式。

4.2 符号链接特性
- 符号链接文件类型为
l(link),可通过ls -l命令识别(文件名后显示->目标路径)。 - 可跨文件系统创建,可指向目录。
- 可指向任意路径的文件或目录,包括远程 NFS 挂载的文件。
- 删除源文件后,符号链接依然存在但指向失效(dangling link),
ls -l显示时目标路径标红。 - 符号链接文件与源文件具有不同的 inode-number,是两个独立的文件。
4.3 符号链接限制
- 源文件被删除或移动后,符号链接失效,访问时返回 "No such file or directory" 错误。
- 符号链接文件本身占用少量磁盘空间(存储路径字符串)。
- 不同操作系统对符号链接的支持程度存在差异,跨平台时需考虑兼容性。
4.4 创建方法
在 Linux 中使用 ln 命令加 -s 选项创建符号链接:
bash
# 创建符号链接:ln -s 源文件 链接名
$ mkdir test
$ touch test/hello.sh
$ echo "echo hello" > test/hello.sh
$ ln -s test/hello.sh hello
# 验证符号链接:文件类型标识为 l,显示指向的目标路径
$ ls -l
总用量 4
lrwxrwxrwx 1 sdxx09 sdxx09 13 6月 7 09:31 hello -> test/hello.sh
drwxrwxr-x 2 sdxx09 sdxx09 4096 6月 7 09:30 test
# 通过符号链接直接执行文件
$ ./hello
hello
# 删除源文件后,符号链接失效(目标路径标红)
$ rm test/hello.sh
$ ls -l
总用量 4
lrwxrwxrwx 1 sdxx09 sdxx09 13 6月 7 09:31 hello -> test/hello.sh # 标红,链接断裂
drwxrwxr-x 2 sdxx09 sdxx09 4096 6月 7 09:42 test
# 访问断裂的符号链接会报错
$ ./hello
-bash: ./hello: 没有那个文件或目录
5 硬链接与符号链接对比
| 对比项 | 硬链接(Hard Link) | 符号链接(Symbolic Link) |
|---|---|---|
| 命令选项 | ln 源文件 链接名 |
ln -s 源文件 链接名 |
| 文件类型 | 普通文件 | 符号链接文件(类型标识 l) |
| inode 关系 | 与源文件共享同一 inode | 独立 inode,存储路径文本 |
| 跨文件系统 | 不支持 | 支持 |
| 链接目录 | 不支持 | 支持 |
| 源文件删除后 | 文件数据仍可通过硬链接访问 | 链接断裂,访问失败 |
| 硬链接计数 | 共享 inode 的链接数 | 不适用 |
| 占用空间 | 不复制数据,仅新增目录表项 | 占用少量空间存储路径字符串 |
6 Linux 平台链接操作
6.1 ln 命令语法
bash
# 创建硬链接
ln [源文件] [链接名]
# 创建符号链接
ln -s [源文件] [链接名]
# 查看文件详细信息(含 inode 和链接类型)
ls -li [文件或目录]
# 查看符号链接指向的目标
readlink [符号链接文件]
6.2 删除符号链接
删除符号链接只需删除链接文件本身,不会影响源文件:
bash
# 删除符号链接
$ rm hello
# 注意:rm 默认不会跟随符号链接删除目标文件
# 如需删除符号链接指向的目标文件,使用 rm -f 或 rm --interactive
$ rm -f hello
6.3 目录链接注意事项
- 对目录创建硬链接会导致目录遍历死循环,文件系统禁止此操作。
- 每个目录默认包含两个硬链接条目:
.(指向自身)和..(指向父目录)。 - 在父目录中创建子目录时,父目录的硬链接计数增加 1。
7 Windows 平台链接操作
7.1 MKLINK 命令
Windows Vista 及更高版本内置 mklink 命令,需在管理员权限的命令提示符中运行。
cmd
:: MKLINK 命令语法
MKLINK [[/D] | [/H] | [/J]] Link Target
:: 选项说明
:: /D 创建目录符号链接(默认行为为文件符号链接)
:: /H 创建硬链接而非符号链接
:: /J 创建目录联接(Directory Junction)
:: Link 指定新符号链接的名称
:: Target 指定新链接引用的路径(相对或绝对)
三种链接类型对比:
| 链接类型 | 选项 | 文件扩展名 | 是否占用空间 | 性质 |
|---|---|---|---|---|
| 符号链接 | /D |
.symlinkd |
否 | 对源目录进行引用 |
| 目录联接 | /J |
.junction |
否 | 对源目录进行引用 |
| 硬链接 | /H |
源文件类型 | 是 | 对源文件创建额外入口 |
创建符号链接示例:
cmd
:: 以管理员身份打开命令提示符后执行
:: 创建目录符号链接(将 E:\Adestination 链接到 F:\atest)
MKLINK /D F:\atest\Adestination E:\Adestination
:: 创建文件硬链接
MKLINK /H F:\test\file.txt E:\source\file.txt
:: 创建目录联接
MKLINK /J F:\test\JunctionTarget E:\source\directory
7.2 链接 Shell 扩展
Link Shell Extension 是一款第三方工具,为 Windows 资源管理器提供图形化符号链接创建功能。安装后需在资源管理器中右键文件/文件夹,选择"创建链接为..."选项,可选择 Hardlink Clone、Symbolic Link、Smart Copy 等链接类型。






7.3 Windows 下符号链接操作示例
以管理员身份打开命令提示符后执行:

cmd
:: 创建目录符号链接(将音乐文件夹链接到桌面)
MKLINK /J "C:\Users\Matthew\Desktop\Music" "C:\Users\Matthew\Documents\Music"
:: 创建文件硬链接(链接可重命名)
MKLINK /H "C:\Users\Matthew\Desktop\ebook.pdf" "C:\Users\Matthew\Downloads\技术支持.pdf"


简介
Windows 2000 及更高版本支持交接点,其中目录充当计算机上另一个目录的别名。 例如,如果目录D:\WIN 指定 C:\WINNT\SYSTEM32 作为其目标,则访问 D:\WIN\DRIVERS 的应用程序实际上会访问 C:\WINNT\SYSTEM32\DRIVERS。 遗憾的是,Windows 2000 没有用于创建交接点的工具。 必须购买 Windows 2000 资源工具包,该工具包附带用于创建交接的
linkd实用工具。 因此,我决定编写自己的交接点创建工具:Junction。 它创建 NTFS 交接点,可用于查看文件或目录是否实际上是重解析点。 (重解析点是 NTFS 交接所基于的机制。远程存储服务使用重解析点和卷挂载点。)交接点 - Sysinternals | Microsoft Learn
https://learn.microsoft.com/zh-cn/sysinternals/downloads/junction
8 Ubuntu / Linux 平台符号链接操作
8.1 创建符号链接
Linux 发行版(包括 Ubuntu)均原生支持符号链接,通过终端使用 ln 命令创建:
bash
# 语法:ln -s 源文件/目录 链接路径
# 注意:参数顺序与 Windows mklink 相反,先源后链接名
# 在桌面创建图片文件夹的符号链接
$ ln -s /home/maguay/Pictures /home/maguay/Desktop/Pictures


8.2 删除符号链接
bash
# 直接删除符号链接文件即可
$ rm /home/maguay/Desktop/Pictures
# 验证删除成功
$ ls -l /home/maguay/Desktop/

9 符号链接与硬链接的综合对比
9.1 文件操作影响
| 操作 | 对硬链接的影响 | 对符号链接的影响 |
|---|---|---|
| 删除符号链接 | 无影响 | 符号链接被删除 |
| 删除硬链接 | 硬链接计数减一,文件实体保留 | 无影响 |
| 删除源文件 | 硬链接仍可正常访问文件数据 | 符号链接断裂,访问失败 |
| 同时删除源文件和所有硬链接 | 文件实体被彻底删除 | 符号链接已断裂,无影响 |
9.2 文件标识差异
- 源文件与硬链接文件具有相同的 inode-number,可视为同一文件的多个入口。
- 源文件与符号链接文件的 inode-number 不同,是两个独立的文件。符号链接文件包含源文件的路径指向信息。
9.3 目录链接规则
- 目录不可创建硬链接,但可创建符号链接。
- 目录硬链接不可跨越文件系统。
- 每个目录包含
.(自引用)和..(父目录引用)两个硬链接条目。 - 在父目录中创建子目录时,父目录的硬链接计数增加 1。
10 应用场景
10.1 文件共享与统一访问
通过符号链接将多个分散的文件或目录统一引用到一个公共目录中,实现文件的集中管理和便捷访问。
10.2 软件部署与依赖管理
将软件的可执行文件或库文件通过符号链接映射到系统路径(如 /usr/local/bin),便于程序调用和版本管理。
10.3 文件备份与迁移
将大文件或目录移动到其他分区后,通过符号链接在原位置创建指向,避免因路径变更导致的应用程序配置失效。例如将 C 盘大目录迁移至其他分区后创建目录符号链接:
E 盘源目录:

F 盘目标目录(空):

执行链接命令:

链接创建成功,可在 F 盘 atest 目录下正常访问源目录内容:

10.4 多位置文件访问
保留从多个位置访问重要文件的能力,例如将 Dropbox 同步文件夹通过符号链接映射到标准文档目录。
11 注意事项与最佳实践
11.1 循环引用警告
禁止在符号链接内部创建符号链接,否则可能产生循环引用,导致文件系统遍历异常。例如:不要创建到包含在符号链接文件夹中的文件的符号链接。
11.2 路径空格处理
当文件路径中包含空格时,必须使用引号包裹路径参数:
bash
# Linux
ln -s "/path/with spaces/source" "/path/with spaces/link"
# Windows
MKLINK /D "C:\path with spaces\link" "C:\path with spaces\source"
11.3 权限要求
- Windows 系统下创建符号链接需要管理员权限。
- Linux 系统下创建链接需要目标目录的写权限。
11.4 跨平台兼容性
不同操作系统对符号链接的支持程度存在差异。在进行跨平台文件共享和迁移时,需确认目标平台对符号链接的可用性。
12 总结
符号链接与硬链接是操作系统文件系统中两种重要的链接机制。
- 硬链接通过共享 inode 实现多文件名指向同一文件实体,适用于同一文件系统内的文件保护场景;
- 符号链接通过存储路径文本实现跨文件系统的文件引用,灵活性更高但依赖源文件的存在。
在实际应用中,应根据具体需求选择合适的链接类型,并注意平台差异和边界条件。
Reference
- Windows 系统中的硬连接、符号链接和目录链接:原理与应用_windows 目录链接-CSDN 博客
https://blog.csdn.net/m0_68006058/article/details/155430024 - Windows 创建符号链接、目录链接、硬链接_windows 创建硬链接-CSDN 博客
https://blog.csdn.net/Tiano__/article/details/128861653 - 【Linux】创建文件链接(ln | 符号链接和硬链接)_为该文件创建符号链接,并命名为"姓名首字母+l"。-CSDN 博客
https://blog.csdn.net/qq_42951560/article/details/125157093 - 符号链接(Symbolic Link)详解:链接文件新世界!-CSDN 博客
https://blog.csdn.net/m0_72410588/article/details/131947048 - 硬链接与软链接解析-CSDN 博客
https://blog.csdn.net/qq_41816540/article/details/81556768 - 计算机符号链接是什么意思,Windows 或 Linux 上的符号链接(符号链接)完整指南-CSDN 博客
https://blog.csdn.net/weixin_39996908/article/details/119095411 - Linux 下面究竟什么是 symbolic link, 怎样创建一个 symbolic link_make a symbolic link-CSDN 博客
https://blog.csdn.net/Chinajash/article/details/1436490 - windows 软连接-CSDN 博客
https://blog.csdn.net/qq_36349997/article/details/135426946