
很多人知道 Linux 有软链接(Symbolic Link)和硬链接(Hard Link),也知道ln -s是软链接,ln是硬链接。但在实际使用中,还是会经常遇到这些问题:
为什么删除了源文件,软链接还能用 / 不能用了?
为什么硬链接不能跨分区?
为什么硬链接不能链接目录?
配置文件明明改了对,但是服务读到的还是旧内容——是不是链接有问题?
给刚接触 Linux 文件系统的人讲不清楚 inode 号是什么,链接数怎么算
这些问题的根因都指向一个核心概念:Linux 文件系统中,文件不是文件名,文件是数据,链接是引用计数。理解了这一点,软链接和硬链接的各种特性就能顺理成章地推导出来,而不是靠死记硬背。
Linux 文件系统的核心不是文件名,而是inode(Index Node)。每个文件在磁盘上都有一个 inode,里面存储了文件的元数据:文件大小、创建时间、权限、属主、数据块位置等。
可以用stat命令查看一个文件的 inode 信息:
stat /etc/passwd# 输出示例:# File: /etc/passwd# Size: 2345 Blocks: 8 IO Block: 4096 regular file# Device: 08:02 Inode: 131082 Links: 2# Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)# Access: 2026-05-15 10:00:00.000000000 +0800# Modify: 2026-02-01 08:30:00.000000000 +0800# Change: 2026-05-10 12:00:00.000000000 +0800
重点关注:
Inode: 131082:这是这个文件的唯一标识符
Links: 2:这个文件的硬链接数是 2,意味着有 2 个目录项指向这个 inode
2 目录项(directory entry)是什么
文件系统里,目录也是一种文件。目录文件的内容是一系列目录项(directory entry),每个目录项包含:文件名 + 指向的 inode 编号。
# 查看目录内容(目录项)ls -lai /etc | head -20# 输出:# total 48# drwxr-xr-x 2 root root 4096 May 15 10:00 .# drwxr-xr-x 3 root root 4096 May 15 09:00 ..# drwxr-xr-x 2 root root 4096 Jan 1 00:00 adjtime# -rw-r--r-- 1 root root 100 Jan 1 00:00 aliases# ...
注意第一列的inode 号。每个目录项对应一个 inode。同一个文件的多个硬链接,会有不同的目录项(不同的文件名),但指向同一个 inode。
文件系统的链接数(Link Count)表示有多少个目录项指向这个 inode:
普通文件的链接数:至少是 1(自身文件名对应一个目录项)。如果创建了硬链接,链接数会变成 2、3……
目录的链接数:至少是 2(.自身 + 父目录里的目录名)。子目录会为父目录贡献 1 个链接数
# 普通文件初始链接数为 1touch testfilestat testfile | grep Links# Links: 1# 创建硬链接后,链接数变为 2ln testfile testfile_hardlinkstat testfile | grep Links# Links: 2stat testfile_hardlink | grep Links# Links: 2ls -li testfile testfile_hardlink# 131084 -rw-r--r-- 2 root root 0 May 15 10:00 testfile# 131084 -rw-r--r-- 2 root root 0 May 15 10:00 testfile_hardlink# 注意两个文件的 inode 号完全相同(131084),链接数都是 2
关键理解:硬链接不是文件的副本,而是同一个 inode 的多个目录项入口。删除任何一个"链接",只是删除了一个目录项,数据块只有在链接数变成 0(没有任何目录项指向这个 inode)时才会被释放。
理解 Linux 软链接与硬链接,首先要回到文件系统结构本身:文件名对应目录项,inode 才是文件元数据和数据块的实际入口。
把 inode、目录项和链接数之间的关系梳理清楚之后,硬链接的 inode 共享与软链接的路径依赖就有了统一的理解基础。
欢迎「长按」下方图片👇,关注我们在公众号上的专业知识分享。