硬链接与软链接本质不同:硬链接共享inode、不占新数据块,仅增目录项和链接计数;软链接拥有独立inode和存储路径字符串的数据块,支持跨文件系统但依赖目标路径存在。
硬链接和软链接在存储结构上根本不是一回事:硬链接不产生新文件,只是在目录里多加一条“名字→inode号”的映射;软链接则实实在在新建一个文件,这个文件的内容就是一串路径字符串。
硬链接没有自己的 inode,它复用原文件的 inode。创建时,系统只在目标目录的数据块中新增一条目录项(filename → inode number),同时将该 inode 的链接计数(link count)加 1。所有硬链接与原文件共用同一组数据块,权限、时间戳、大小等全部来自同一个 inode。查看时 ls -li 会显示相同 inode 号和相同的 link count 值(比如 2 表示有两个硬链接指向它)。
软链接是一个真实存在的特殊文件,拥有自己的 inode 和至少一个数据块。它的 inode 类型标记为 symbolic link(l),权限固定为 lrwxrwxrwx;其唯一内容就是目标路径的字符串(例如 ../bin/bash),存放在自己的数据块中。访问软链接时,VFS 层会读取该字符串,再按路径重新解析目标文件。
用 stat 对比最清楚:硬链接的 Device 和 Inode 字段与原文件完全一致;软链接的 Inode 不同,Size 显示的是路径长度,且 File 行末尾带箭头(→)指明目标。软链接的 inode 不记录任何实际数据块地址,只标记类型和存放路径的块位置;而硬链接的 inode 直接管理全部数据块指针。