简单来说,在 Linux 或 Unix 系统中,链接(Link)相当于文件系统里的“快捷方式”或“别名”。通过链接,你可以快速指向某个目标,省去手动输入一长串路径的麻烦,也无需一次次用 cd 进入深层目录。如果你用过 Windows 桌面上的程序图标,应该不会感到陌生——那本质上就是一种快捷方式。不过,Unix 下的链接与 Windows 的快捷方式存在本质区别,并且主要分为两种:硬链接(Hard Link)和软链接(Symbolic Link,也称符号链接)。下面我们来逐一拆解。
硬链接
硬链接本质上是一个目录条目,它与原始文件共享同一个 i-node(即硬盘上的物理存储位置)。换句话说,硬盘上只保存一份真实数据,但两个或多个目录条目都指向这份数据。创建一个硬链接非常简单:
ln /usr/local/etc/rc.d/nginx nginx
这条命令会在当前目录下生成一个名为 nginx 的文件,它直接指向 /usr/local/etc/rc.d/nginx 这个原始文件。之后,当你需要编辑或执行那个远程配置文件时,只需操作短名称 nginx 即可,不再需要输入长长的绝对路径。例如,直接执行 vi nginx 就等同于执行 vi /usr/local/etc/rc.d/nginx。

使用 ls -l 查看硬链接文件,你会发现它的权限、大小、修改时间与原始文件完全一致——因为它们实际上是同一个文件的另一个入口。如果你修改硬链接的权限,原始文件也会随之改变。

当你用 rm 删除其中一个硬链接时,链接计数会减 1。但只要还存在另一个硬链接,文件数据就不会被真正删除。只有当所有硬链接都被删除、链接数归零时,系统才会释放对应的硬盘空间。
值得注意的是:硬链接有两个天生的局限性——不能用于目录,也不能跨越不同的文件系统(例如,不能将 ext4 分区上的文件硬链接到 XFS 分区)。
软链接
软链接也叫符号链接(Symlinks),与 Windows 的快捷方式更为相似。与硬链接不同,软链接是一个独立的文件,拥有自己的 i-node。它里面只存放了一个指针,指向另一个文件的路径。创建软链接的命令是 ln -s:
ln -s /etc/rc.conf a
然后用 ls -l -b 查看:

现在要编辑 /etc/rc.conf,直接运行 vi a 即可。不过,如果系统提示“No such file or directory”,但 ls 又能够看到这个链接文件,说明该软链接已经“悬空”——它指向的目标文件或目录已经被移动或删除。使用 ls -l 就能清楚看到它指向的路径。
关键点:无论目标文件是被移走还是被删除,软链接都会立刻失效,因为它仅仅是一个路径名指针,并不绑定实际数据。
硬链接与软链接的主要区别
1. 权限与归属:软链接的访问权限并不代表真实文件的权限,你也无法通过 chmod 修改软链接的属性——这些操作只能在真实文件上执行。硬链接则与原文件共享同一套权限。
2. 链接计数:软链接的链接数永远是 1,因为它本身就是一个独立文件;硬链接的链接数会随着你创建更多硬链接而增加。
3. 文件大小:用 ls -l 查看软链接,列出的大小是它自身包含的路径字符串长度,而不是目标文件的大小。硬链接的大小则与原文件完全一致。
4. 修改时间:软链接的 mtime 记录的是链接自身被修改的时间,而非目标文件的修改时间。硬链接则反映原始数据的变化。
5. 文件名显示:ls -l 输出中,软链接会在文件名后显示 -> 和指向的目标路径,例如 a -> /etc/rc.conf。
6. 删除行为:删除软链接指向的原始文件后,该文件的数据块会被释放(假设没有其他硬链接),软链接变成空链接。而如果你直接删除软链接本身,原始文件毫发无伤。硬链接则不同:删除任何一个硬链接,只要还有别的硬链接存在,数据就依然保留。
7. i-node 占用:硬链接不占用额外的 i-node,因为它共享原始文件的 i-node;软链接则会消耗一个新的 i-node。这一点在存储大量小文件时尤其值得注意——如果 i-node 被耗尽,即使硬盘还有剩余空间,也无法创建新文件。
总结一下选择策略:如果原始文件和目标文件位于同一个文件系统内,推荐使用硬链接——它能保留原始文件的完整信息,并且即使删除或移动原文件,链接依然有效。但若需要链接目录或跨越不同文件系统,则只能使用软链接。
