软链接:相当于 Windows 的快捷方式,是一个独立文件,存储目标文件 / 目录路径;可以跨文件系统,可以指向不存在的文件;删除软链接不影响原文件。
ln -s 源 链接名创建。
1. 版本切换(最经典场景)
一套软件多版本共存,通过软链接指向当前启用版本,不用修改环境变量、配置文件。
示例:jdk、python、node、gcc 多版本
ln -s /usr/local/jdk17 /usr/local/jdk
# 切换版本只需要重新建立软链接,所有脚本读 /usr/local/jdk 不用改代码
比如系统
/usr/bin/python经常就是软链接,切换 python3.8 /python3.11。
2. 程序固定读取路径,实际文件放在别的位置
应用配置写死路径,但数据 / 配置实际存储在其他盘、挂载盘。
例如:数据库数据、日志、容器数据盘,磁盘空间不够,迁移数据到大磁盘,不修改程序配置。
# 把 /var/lib/mysql 数据迁移到 /data/mysql
mv /var/lib/mysql /data/mysql
ln -s /data/mysql /var/lib/mysql
# mysql程序依旧读取 /var/lib/mysql,感知不到实际位置变了

3. 简化长路径,创建访问别名
路径太深太长,给一个简短访问入口。
# 每次不想敲 /opt/workspace/project-a/config
ln -s /opt/workspace/project-a/config ~/prj-conf
cd ~/prj-conf
4. 多目录共用同一份资源
多个项目需要引用同一套静态资源、公共库、模板文件,不复制副本,修改一处全部生效。
静态网页资源、nginx 站点静态文件、公共脚本。
# project1、project2 共用同一套 static 静态文件
ln -s /data/common/static /opt/project1/static
ln -s /data/common/static /opt/project2/static
5. 兼容旧路径,目录迁移后平滑过渡
目录重构迁移,旧路径不能直接删除,老脚本、老代码还在访问旧路径,用软链接做兼容,避免业务报错。
运维重构目录结构,旧路径
/home/old_service→ 迁移到/data/new_service
ln -s /data/new_service /home/old_service
# 老脚本继续访问旧路径,不需要全部改代码,后续逐步改造下线
6. 容器、Docker 内部路径适配
容器内程序路径固定,宿主机目录结构不一样,软链接做路径映射; 部分程序不支持直接挂载目录,使用软链接绕开限制。
7. Nginx/Web 站点场景
多个虚拟主机复用网站源码;
静态资源目录迁移,不修改 nginx 配置;
发布版本:发布新版本目录,软链接指向最新版本,回滚只需要切换软链接(灰度发布 / 版本回滚经典用法)
/web/v1.0.0
/web/v1.0.1
ln -s /web/v1.0.1 /web/current
# nginx root指向 /web/current,升级、回滚只改软链接
8. 备份与日志处理
日志迁移到数据盘,程序写日志路径不变; 注意:logrotate 日志轮转对软链接有坑,轮转时可能会操作真实文件。

软链接 vs 硬链接简单区分
⚠️软链接坑点
相对路径坑:创建软链接时,源路径写相对路径,是相对于当前工作目录,不是相对于链接存放目录,容易链接失效,生产尽量用绝对路径。
tar 打包默认跟随软链接,会把真实文件打包进去;加
-h参数跟随解包。rm 删除软链接:不要加
/后缀rm linkdir/,会删除原目录里面内容;直接rm linkdir。部分程序(部分 java 程序)会解析软链接拿到真实物理路径,预期行为失效。
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢