
与硬链接不同,软链接讨论的重点不再是 inode 共享,而是路径引用。软链接本身也是文件,只是其中保存的不是数据块入口,而是一段指向目标对象的路径字符串。
在这一前提下,软链接为什么可以跨文件系统、为什么可以链接目录、为什么目标删除后会出现断链,都可以从同一套逻辑中推导出来。
软链接(也叫符号链接)是一个特殊类型的文件,它存储的是另一个文件的路径(路径字符串),而不是 inode 本身。软链接就像 Windows 的快捷方式,或者程序语言里的引用。
# 创建软链接ln -s /data/mysql/backup.sql /backup/mysql_backup.sql# 验证:软链接的 inode 和原文件不同ls -li /data/mysql/backup.sql /backup/mysql_backup.sql# 输出:# 131085 -rw-r--r-- 2 mysql mysql 104857600 May 15 10:00 /data/mysql/backup.sql# 131086 lrwxrwxrwx 1 root root 18 May 15 10:01 /backup/mysql_backup.sql -> /data/mysql/backup.sql# ↑ soft link# 注意软链接的权限显示为 lrwxrwxrwx,但实际权限取决于目标文件# 文件大小 18 = 路径字符串 "/data/mysql/backup.sql" 的长度
特性一:可以跨文件系统
软链接存储的是路径字符串,不是 inode 编号,所以可以跨文件系统、跨分区、跨设备。
# 假设 /data 是独立挂载点ln -s /data/mysql/backup.sql /root/backup_copy.sql# 成功创建,不报错ls -la /root/backup_copy.sql# lrwxrwxrwx 1 root root 18 May 15 10:01 /root/backup_copy.sql -> /data/mysql/backup.sql
特性二:可以链接目录
软链接可以指向目录,这对日常排查非常有用。
# 给长路径创建一个短别名ln -s /var/log/nginx /data/nginx_logs# 访问 /data/nginx_logs 就等于访问 /var/log/nginxls /data/nginx_logs# 用于版本切换:切换指向哪个版本ln -sfn /data/app/v2.0.0 /data/app/current# -s: 软链接# -f: 如果已存在同名链接,先删除# -n: 把链接视为普通文件而不是目录(用于替换链接指向,而不是进入目录)
特性三:软链接有独立的 inode,是独立的文件
软链接本身是一个文件,有自己的 inode 和链接数(默认是 1)。删除软链接不影响目标文件。
# 软链接本身链接数为 1(它自己)ls -li /backup/mysql_backup.sql# 131086 lrwxrwxrwx 1 root root 18 May 15 10:01 /backup/mysql_backup.sql -> /data/mysql/backup.sql# 删除软链接,目标文件不受影响rm /backup/mysql_backup.sqlls -li /data/mysql/backup.sql# 131085 -rw-r--r-- 2 mysql mysql 104857600 May 15 10:00 /data/mysql/backup.sql# 链接数仍然是 2(没有变化)
特性四:软链接依赖目标路径
如果目标文件被删除、 rename 或者路径变了,软链接就会断裂(dangling link),访问时报"No such file or directory"。
# 正常情况ls -la /backup/mysql_backup.sql# lrwxrwxrwx 1 root root 18 May 15 10:01 /backup/mysql_backup.sql -> /data/mysql/backup.sql# 目标文件被删除rm /data/mysql/backup.sql# 软链接断裂ls -la /backup/mysql_backup.sql# lrwxrwxrwx 1 root root 18 May 15 10:01 /backup/mysql_backup.sql -> /data/mysql/backup.sql (broken)# ↑ 显示 broken,表示目标不存在# 访问断裂的软链接会报错cat /backup/mysql_backup.sql# cat: /backup/mysql_backup.sql: No such file or directory# 查找所有断裂软链接(定期巡检用)find /backup -xtype l# find: File system loop detected.# (可能因为目录软链接造成环路,需要加 -L 参数控制)find /backup -xtype l -ls
特性五:软链接的路径解析是运行时进行的
软链接存储的是路径字符串,每次访问软链接时,内核都会解析这个路径,找到实际的文件。如果目标路径在软链接创建之后发生了变化,软链接会自动指向新的目标。
# 创建软链接指向 v1.0ln -s /data/app/v1.0 /data/app/current# 升级到 v2.0:替换软链接指向ln -sfn /data/app/v2.0 /data/app/current# 访问 /data/app/current 自动指向 v2.0ls /data/app/current# v2.0 的内容
软链接与硬链接的根本区别在于,它不共享目标 inode,而是保存目标路径;访问时需要先解析路径,再定位真实对象。
因此,软链接具备更强的灵活性,同时也更依赖路径本身的稳定性。权限规则、相对路径与绝对路径写法,以及版本切换等用法,都建立在这一前提之上。
欢迎「长按」下方图片👇,关注我们在公众号上的专业知识分享。