磁盘满了想给目录换个位置、网站要引用别的目录的文件、升级版本想无缝切换——这些场景都靠软链接(符号链接)解决。ln -s 是 Linux 里最高频的命令之一,很多人只会"创建快捷方式"这一个概念,却不知道它和硬链接的区别、以及软链接在部署里的妙用。这篇文章讲透。
一、什么是软链接
软链接(符号链接)就像 Windows 的快捷方式:它本身是一个指向另一个路径的特殊文件,访问它等于访问目标文件。
ln -s /data/www/blog /var/www/blog # 创建软链接
ls -l /var/www/ # 输出里 lrwxrwxrwx ... blog -> /data/www/blog
- 创建:
ln -s 目标 链接名; - 查看:
ls -l里以l开头,->指向目标; - 删除:
rm 链接名(注意别加 /,否则会删到目标目录)。
二、软链接 vs 硬链接
| 对比项 | 软链接(ln -s) | 硬链接(ln) |
|---|---|---|
| 本质 | 独立文件,存目标路径 | 同一 inode 的另一个名字 |
| 跨文件系统 | 可以 | 不可以 |
| 链接目录 | 可以 | 不可以 |
| 目标删除后 | 链接失效(红链) | 数据仍通过其他硬链接存在 |
| ls -l 显示 | l 开头 + -> |
普通文件,链接数 +1 |
ln file1 file2 # 硬链接:file1 和 file2 指向同一份数据
实用结论:日常部署、目录迁移、版本切换用软链接;备份场景偶尔用硬链接(省空间、同文件系统)。软链接是绝对的主流。
三、实战场景
1. 磁盘满了,把大目录挪到新磁盘并保留原路径
mkdir -p /data/www && mv /www/wwwroot/site /data/www/site
ln -s /data/www/site /www/wwwroot/site # 程序仍访问原路径,数据已在 /data
网站代码、日志、备份这类大目录都能这么迁移,无需改任何配置。
2. 版本升级无缝切换
ln -s /usr/local/jdk17 /usr/local/jdk # 旧版目录
rm /usr/local/jdk && ln -s /usr/local/jdk21 /usr/local/jdk # 换新版,改一个链接即可
/usr/bin/java 或环境变量里指向 /usr/local/jdk 即可,升级只改链接。
3. 日志软链接到独立盘
mkdir -p /data/logs && ln -s /data/logs /var/log/myapp
4. 共享配置/公共文件
ln -s /srv/certs /etc/nginx/certs
ln -s /opt/uploads /var/www/site/uploads
四、软链接的坑(重点)
- 删除链接别加末尾斜杠:
rm -rf /var/www/blog/会删除目标目录内容,正确是rm /var/www/blog; ln -s参数顺序:ln -s 目标 链接,目标在前、链接在后,写反就变成创建反向链接;- 相对路径链接:
ln -s ../data /var/www/data链接里存相对路径,移动两个文件时仍有效(相对目标文件位置); - 目录权限:软链接本身权限无意义(rwxrwxrwx),实际看目标目录权限;
- find 递归陷阱:
find /var/www -type l可列出软链接;某些命令递归时可能死循环(cp -r、tar处理不当),tar 打包时用-h跟随或排除; - 系统工具跟随链接:nginx 的 root 指向软链接目录一般没问题,但有些服务对软链接有安全限制(如部分版本的 sshd 对 authorized_keys 软链接敏感),注意报错。
五、常用操作速查
ln -s /target /link # 创建软链接
ln -s /target /link1 /dir/ # 在目录里批量创建
readlink /link # 查看链接指向哪
ls -l /link # 查看(显示 -> 目标)
rm /link # 删除链接(安全)
test -L /link && echo "是软链接"
find /path -type l -ls # 列出目录下所有软链接
判断链接是否失效:ls -l 里目标显示红色,或 readlink -f /link 输出不存在路径。
六、总结
软链接一句话:一个指向其他路径的"快捷方式",用 ln -s 目标 链接 创建。三个高频场景——目录迁移保留原路径、版本无缝切换、日志独立盘。三个必记的坑——删除别加 /、参数顺序别写反、rm -rf 别误伤目标。掌握 ln -s,VPS 上的目录和部署管理会顺手很多。




