Linux软链接和硬链接区别是什么?

文章导读
硬链接和软链接的差别不在“快捷方式”这一层,而在 inode 与目录项:硬链接是同一个 inode 多出的一个目录项,软链接是一个独立文件,文件内容就是目标路径字符串。要马上分辨,用 ls -li 看 inode 号,或用 stat 看链接数和文件类型;如果 inode 相同、链接数大于 1,就是硬链接;如果类型是 symbolic link、文件大小等于路径字符串长度,就是软链接。
📋 目录
  1. 壹 Linux软链接和硬链接:各自站在什么位置
  2. 贰 Linux软链接和硬链接:性能、成本、运维、上手四个口径分开比
  3. 叁 Linux软链接和硬链接:什么情况选哪一边
  4. 肆 Linux软链接和硬链接:一次能复现的对比做法
A A

硬链接和软链接的差别不在“快捷方式”这一层,而在 inode 与目录项:硬链接是同一个 inode 多出的一个目录项,软链接是一个独立文件,文件内容就是目标路径字符串。要马上分辨,用 ls -li 看 inode 号,或用 stat 看链接数和文件类型;如果 inode 相同、链接数大于 1,就是硬链接;如果类型是 symbolic link、文件大小等于路径字符串长度,就是软链接。

判断方向:先看是否跨文件系统、是否要指向目录、是否要显式表达“引用可能失效”。同一分区内给普通文件起多个名字、备份去重、原子切换目录,用硬链接;跨分区、指向目录、配置启用项切换,用软链接。验证方式统一用 stat -c '%n %i %h %F' 核对 inode、链接数和类型。边界是:软链接会悬空失效,硬链接删除任一名字不影响数据但链接数会变化。

Linux软链接和硬链接:各自站在什么位置

硬链接不新建 inode,只在目录里增加一条“名字指向同一 inode”的映射。它擅长同一文件系统内给同一份数据挂多个名字、用 cp -al 或 rsync -H 做省空间的备份快照、部署时保留旧版本目录再切名字。硬链接的限制也很明确:不能跨文件系统,普通用户不能对目录建硬链接。核对口径是 man 2 link,里面写明了 EXDEV(跨设备)和 EPERM 两类错误码,可以直接对应到上面两条限制。

软链接有自己独立的 inode,内容是目标路径。解析时按链接所在目录(相对路径)或从根开始(绝对路径)重新查找,所以它可以跨分区、可以指向目录,也可以指向一个当前不存在的目标。核对口径是 man 7 symlink,这份手册页说明了相对软链接的解析基准是链接所在目录,不是执行命令时的工作目录。

Linux软链接和硬链接:性能、成本、运维、上手四个口径分开比

性能口径:访问软链接通常多一次路径解析,在小文件、高频打开的场景里可能有可感差异,多数业务场景可以忽略。怎么量:用 strace -c -e trace=openat,newfstatat ls soft.txt 和指向真实文件的同一条命令对比系统调用次数,或用循环脚本配 time 观察,结论需要结合内核版本和 page cache 状态确认,单次 time 结果不足以判断。

成本口径:硬链接只多一条目录项,不额外占数据块;软链接多一个 inode,并占用等于路径字节数的空间。怎么量:df -i 看 inode 用量,stat -c '%n %s' soft.txt 里的大小就是路径长度,du -sh --apparent-size 和 du -sh 对比可看出这类小文件的差异。

Linux软链接和硬链接区别是什么?

运维口径:打包与同步工具的默认行为不同。tar 默认保存软链接本身,要跟随得加 -h;rsync 的 -a 已含 -l,保存软链接,要跟随得加 -L,要保留硬链接关系得加 -H。怎么量:tar -tvf 备份.tar 看条目类型是 l 还是 -,rsync -n -i 干跑看输出里有没有对应条目。

上手口径:硬链接命令是 ln 目标 链接名,目标必须已存在且同分区;软链接是 ln -s 目标 链接名,目标可以不存在,会得到一个悬空链接。两个命令的第二个参数如果是一个已存在的目录,链接会被创建在该目录内部,这是新手最容易看错的地方,执行前先用 ls -ld 链接名 确认落点。

Linux软链接和硬链接:什么情况选哪一边

按这个顺序判断,前一条命中就停:目标是否跨文件系统 → 是则软链接;是否要指向目录 → 是则软链接(普通用户无法给目录建硬链接);是否需要让人一眼看出这是个可能失效的引用 → 是则软链接;是否在同一分区给已有普通文件加名字、做备份去重、做目录原子切换 → 是则硬链接;工具链是否会跟随链接(tar、rsync、容器挂载)不确定 → 先干跑再执行。

Linux软链接和硬链接区别是什么?

发布目录切换(current 指向 releases/v2):选软链接,前置条件是应用在启动时读取路径、不长期持有上一版本的文件句柄;切换用 ln -sfn releases/v2 current,注意用 -n 避免在已有软链接指向的目录里再建一个同名链接。

同一分区内多份内容相同的配置或数据副本:选硬链接,前置条件是源和目标在同一文件系统,且之后不会用“写临时文件再重命名”的方式原地改写,因为这类保存方式会换掉 inode,硬链接关系随之断开。

快照式备份:选硬链接,cp -al 或 rsync -aH,前置条件是源与目标端文件系统都支持硬链接,且两端在同一挂载内做去重才有效。

Linux软链接和硬链接:一次能复现的对比做法

下面这段十分钟内能跑完,用来直观看出 inode、链接数、失效行为的差异。在任意有写权限的临时目录执行:

Linux软链接和硬链接区别是什么?
mkdir -p /tmp/lntest && cd /tmp/lntest
printf 'hello\n' > origin.txt
ln origin.txt hard.txt
ln -s origin.txt soft.txt
stat -c '%n inode=%i links=%h type=%F size=%s' origin.txt hard.txt soft.txt

预期输出差异:origin.txt 和 hard.txt 的 inode 号相同、links 都为 2、类型都是 regular file;soft.txt 的 inode 号不同、links 为 1、类型是 symbolic link,size 等于 origin.txt 这串路径的字节数。接着验证删除行为:

rm origin.txt
cat hard.txt
cat soft.txt
ls -l
cd /tmp && rm -rf /tmp/lntest

预期:cat hard.txt 仍输出 hello,因为数据块没被回收;cat soft.txt 报 No such file or directory,ls -l 里能看到它仍指向 origin.txt,属于悬空状态。rm -rf 只删链接本身,不会顺着指针删目标,这一点在清理脚本里常被误解。

容易踩的坑是相对路径的软链接:ln -s origin.txt soft.txt 中的目标按链接所在目录解析,链接一旦被移到其他目录、或打包解压到别处,指向就会失效,而 ls -l 仍显示得好好的。跨目录使用时建议写绝对路径;已经建好的链接用 readlink -f soft.txt 或 namei -l soft.txt 逐级核对解析结果,再决定是否重建。