两种链接的区别
硬链接指向同一个 inode,等价于给文件多起了一个名字:删掉其中一个名字数据还在,且不能跨文件系统、不能指向目录。软链接(符号链接)是一个独立的小文件,里面存的是目标路径,可以跨分区、可以指向目录,目标被删掉就悬空。发布部署中最常用的是软链的『版本目录 + 活动链接』模式,切换与回滚都是秒级操作。
基本信息
| 软链接 | ln -s 目标 链接名(目标写相对或绝对路径均可) |
|---|---|
| 硬链接 | ln 目标 链接名(同一文件系统内,不能指向目录) |
| 更新软链 | ln -sfn 新目标 现有链接名 |
| 查看指向 | ls -l、readlink -f、namei -l |
| 删除链接 | rm 链接名(不会删除目标本体,注意结尾斜杠会改变语义) |
| 权限要求 | 普通用户;在系统目录创建需 root |
典型使用场景
- 发布目录做版本切换:/opt/app 指向具体版本目录,回滚只需再切一次
- 把数据盘上的目录软链到系统预期路径,避免大目录占用根分区
- 给长命令或工具起短别名,减少运维输入量
- 同一份文件需要在多个目录可见又不想占用额外空间时用硬链接
- 迁移后保留旧路径的可达性,让老脚本继续可用
典型用法
典型用法
ln -s /opt/app-1.2.0 /opt/app # 建软链,/opt/app 指向版本目录
ln -sfn /opt/app-1.3.0 /opt/app # 原子切换版本;-n 防止在目录内部再建一层链接
ls -l /opt/app # 看链接指向,箭头右侧才是真实目标
readlink -f /opt/app # 解析出最终真实路径,排查悬空链接最有用
namei -l /opt/app/config/app.conf # 逐层列出路径各段的权限与属主
ln /data/report.csv /data/report.bak.csv # 硬链接:同一文件两个名字,数据只有一份排障与清理
排障与清理
find /opt -xtype l # 找出悬空(失效)的软链接
ls -ld /opt/app/ # 结尾加斜杠会跟随链接,跟不加斜杠的语义不同
rm /opt/app-old # 删链接不删目标;确认无误再执行
readlink /opt/app # 只输出链接内容,不做解析
stat -c '%i %n' /data/report.csv /data/report.bak.csv # 硬链接两者 inode 相同对比与判读
| 维度 | 软链接 | 硬链接 |
|---|---|---|
| 跨文件系统 | 支持 | 不支持 |
| 指向目录 | 支持 | 不支持 |
| 目标被删 | 链接悬空失效 | 数据仍可通过另一名字访问 |
| 占用空间 | 一个 inode 大小的链接文件 | 不额外占用数据空间 |
| 删除链接本身 | 只删链接 | 相当于删掉一个名字,计数减一 |
| ls -l 表现 | 显示箭头指向 目标 | 显示为普通文件,需用 stat 看 inode |
相对路径的软链按链接所在目录解析,而不是执行命令时的当前目录:写 ln -s ../data/file link 之前先想清链接会被放在哪。
给目录做软链时更新必须带 -n,否则 ln -sf 会把新链接建到目标目录内部,出现 /opt/app/app-1.3.0 这种层级错乱的路径。