软链接可跨文件系统且支持目录,硬链接不可跨文件系统且不支持目录;软链接是路径字符串指向,源文件变动即断链,硬链接共享inode,修改内容同步,删除需清空所有链接才释放数据。

软链接能跨文件系统、支持目录,硬链接不能跨文件系统、不支持目录——选错类型会导致命令失败或行为异常。
软链接用 ln -s,路径写错就失效
软链接本质是快捷方式,指向的是路径字符串。如果源文件移动、重命名或删除,软链接立即变“断链”,ls -l 会显示红底白字(部分终端)或提示 No such file or directory。
- 创建时,目标路径(即链接名)建议写绝对路径或相对于链接所在位置的相对路径;避免用当前工作目录下的相对路径,否则链接移到别处就失效
- 源路径可以是相对路径,但推荐用绝对路径,比如:
ln -s /home/user/docs/report.pdf ./report - 如果目标链接名已存在,
ln -s默认报错,加-f可强制覆盖:ln -sf /new/target linkname - 注意:软链接可指向不存在的路径( dangling symlink),
ls能列出来,但cat或cd会报错
硬链接用 ln(不带 -s),只适用于普通文件
硬链接和原文件共享同一个 inode,本质是同一份数据的多个入口。因此它不能跨分区(因为不同文件系统 inode 编号不互通),也不能对目录创建(防止循环引用破坏文件系统结构)。
- 执行
ln source.txt hardlink.txt后,修改任一文件内容,另一方实时同步;但修改时间戳(如touch)只影响被操作的那个名字 - 只有当所有硬链接(包括原始文件名)都被
rm删除,且无进程打开该 inode 时,数据块才真正释放 - 用
ls -i可查看 inode 号,两个硬链接的数字一致;而软链接的 inode 是独立的 - 尝试对目录建硬链接会直接报错:
ln: hard link not allowed for directory
怎么判断一个链接是软是硬?看 ls -l 输出第一列和箭头
ls -l 是最快速的识别方式:
- 软链接行首是
l(小写 L),末尾带->箭头,例如:lrwxrwxrwx 1 user user 12 Jun 5 10:22 mylink -> /tmp/target - 硬链接看起来和普通文件完全一样,行首是
-,权限后有链接数(第二字段),比如:-rw-r--r-- 2 user user 1024 Jun 5 10:20 file.txt—— 这里的2表示该 inode 有两个硬链接 - 误把软链接当硬链接用
rm删除,只是删了链接本身;但误删硬链接中的“最后一个”,实际等于删了数据
常见误操作和排障线索
很多权限或访问问题其实源于链接类型混淆或路径解析错误。
-
cd: Permission denied出现在软链接目录上?检查软链接指向的目录是否有执行(x)权限 —— 目录必须有x才能cd进入,哪怕软链接本身权限全开 -
Operation not supported创建硬链接时报这个?大概率是源文件在 NFS、/proc、/sys 或 btrfs 子卷等不支持硬链接的文件系统上 - 脚本里用
realpath或readlink -f获取真实路径前,先确认输入是否为软链接;硬链接调用这些命令会返回自身路径,不是“原始创建点” - 备份工具(如
rsync)默认不跟随软链接,加-L才复制目标内容;硬链接则默认保留链接关系(需--hard-links显式启用)
硬链接的限制比大多数人想的更严格:它依赖文件系统底层实现,不是所有“文件”都能硬链接(比如设备文件、socket、符号链接本身)。软链接看似灵活,但路径管理稍一松懈,整条链路就断掉——这两者从来不是“换着用”的关系,而是由场景刚性决定的。











