Linux / Windows 链接 | 符号链接与硬链接

注:合辑示例中图有点旧。


符号链接与硬链接技术

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 硬链接特性

  1. 具有相同 inode-number 的多个文件互为硬链接文件。
  2. 删除硬链接文件或源文件中的任意一个,文件实体不会被删除,仅硬链接计数减一。
  3. 只有当所有硬链接文件及源文件均被删除(硬链接计数归零)后,文件系统才会回收该文件的 Data Block 空间。
  4. 硬链接文件是普通文件,可使用 rm 命令删除。
  5. 可通过创建硬链接文件实现重要文件的防误删保护。

3.3 硬链接限制

  1. 不能跨文件系统:硬链接只能在同一文件系统内创建,因为不同分区的 inode-number 不保证唯一。
  2. 不能链接目录:为防止目录遍历产生循环引用,文件系统禁止对目录创建硬链接。

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 符号链接特性

  1. 符号链接文件类型为 l(link),可通过 ls -l 命令识别(文件名后显示 -> 目标路径)。
  2. 可跨文件系统创建,可指向目录。
  3. 可指向任意路径的文件或目录,包括远程 NFS 挂载的文件。
  4. 删除源文件后,符号链接依然存在但指向失效(dangling link),ls -l 显示时目标路径标红。
  5. 符号链接文件与源文件具有不同的 inode-number,是两个独立的文件。

4.3 符号链接限制

  1. 源文件被删除或移动后,符号链接失效,访问时返回 "No such file or directory" 错误。
  2. 符号链接文件本身占用少量磁盘空间(存储路径字符串)。
  3. 不同操作系统对符号链接的支持程度存在差异,跨平台时需考虑兼容性。

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 平台链接操作

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. 目录不可创建硬链接,但可创建符号链接。
  2. 目录硬链接不可跨越文件系统。
  3. 每个目录包含 .(自引用)和 ..(父目录引用)两个硬链接条目。
  4. 在父目录中创建子目录时,父目录的硬链接计数增加 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