Linux 软链接和硬链接详解:ln 命令背后的 inode 原理
1. 前言
Linux 中经常会看到链接文件,例如:
bash
/bin -> /usr/bin
python -> python3
current -> /opt/app/releases/v2
Linux 链接主要有两种:
text
软链接:symbolic link
硬链接:hard link
创建链接使用 ln 命令。
本文重点讲清楚:
- inode 是什么;
- 软链接是什么;
- 硬链接是什么;
- 二者有什么区别;
- 删除源文件后分别会怎样;
- 实际项目中怎么用。
2. inode 是什么
Linux 文件可以简单理解为两部分:
text
文件名 + inode
文件名保存在目录中。
inode 保存文件的元数据和数据块位置。
inode 中常见信息包括:
- 文件类型;
- 权限;
- 所属用户;
- 所属用户组;
- 文件大小;
- 时间戳;
- 数据块位置;
- 硬链接数量。
查看 inode:
bash
ls -i file.txt
查看详细信息:
bash
stat file.txt
3. 硬链接是什么
硬链接可以理解为:
text
多个文件名指向同一个 inode
创建硬链接:
bash
ln source.txt hard.txt
查看:
bash
ls -li source.txt hard.txt
可能输出:
bash
123456 -rw-r--r-- 2 user user 100 source.txt
123456 -rw-r--r-- 2 user user 100 hard.txt
两个文件 inode 一样,说明它们本质上指向同一份文件数据。
修改任意一个:
bash
echo "hello" >> hard.txt
cat source.txt
会发现内容也变了。
4. 删除源文件后硬链接还在吗
创建文件和硬链接:
bash
echo "linux" > source.txt
ln source.txt hard.txt
删除源文件名:
bash
rm source.txt
查看硬链接:
bash
cat hard.txt
仍然可以读取内容。
原因是:
text
rm 删除的是一个文件名,不是立即删除 inode 数据。
只要还有硬链接指向 inode,数据就还在。
只有硬链接数量变成 0,文件数据才会真正释放。
5. 软链接是什么
软链接也叫符号链接。
它更像快捷方式,保存的是目标路径。
创建软链接:
bash
ln -s source.txt soft.txt
查看:
bash
ls -l soft.txt
输出:
bash
soft.txt -> source.txt
查看 inode:
bash
ls -li source.txt soft.txt
可能看到两个 inode 不同。
这说明软链接是一个独立文件,只是里面保存了目标路径。
6. 删除源文件后软链接会怎样
创建软链接:
bash
echo "hello" > source.txt
ln -s source.txt soft.txt
删除源文件:
bash
rm source.txt
再访问:
bash
cat soft.txt
会报错:
text
No such file or directory
此时软链接还在,但目标路径不存在,所以它变成了断链。
7. 软链接和硬链接对比
| 对比项 | 软链接 | 硬链接 |
|---|---|---|
| 是否有独立 inode | 有 | 没有,和源文件共用 inode |
| 指向对象 | 路径 | inode |
| 能否跨文件系统 | 可以 | 通常不可以 |
| 能否链接目录 | 可以 | 普通用户通常不可以 |
| 删除源文件后 | 失效 | 仍可访问 |
| 类似概念 | 快捷方式 | 同一文件的多个名字 |
| 创建命令 | ln -s |
ln |
一句话总结:
text
软链接指向路径,硬链接指向 inode。
8. ln 命令常用写法
创建硬链接:
bash
ln source.txt hard.txt
创建软链接:
bash
ln -s source.txt soft.txt
强制更新软链接:
bash
ln -sfn /opt/app/releases/v2 /opt/app/current
常用参数:
| 参数 | 作用 |
|---|---|
-s |
创建软链接 |
-f |
强制覆盖 |
-n |
把已有软链接当作普通文件处理 |
-v |
显示过程 |
查看链接指向:
bash
readlink soft.txt
readlink -f soft.txt
9. 为什么硬链接不能跨文件系统
硬链接指向 inode。
inode 编号只在当前文件系统内部有意义。
不同磁盘分区或不同文件系统中,inode 编号可能重复。
所以硬链接通常不能跨文件系统。
如果尝试跨文件系统创建硬链接,可能报错:
text
Invalid cross-device link
软链接不受这个限制,因为它保存的是路径。
10. 为什么硬链接通常不能链接目录
如果允许普通用户随意给目录创建硬链接,可能形成目录循环。
这会让遍历、备份、删除都变得复杂。
所以普通用户通常不能给目录创建硬链接。
如果要链接目录,使用软链接:
bash
ln -s /var/log logs
进入:
bash
cd logs
实际上进入的是 /var/log。
11. 实际使用场景
11.1 版本切换
bash
/opt/app/releases/v1
/opt/app/releases/v2
/opt/app/current -> /opt/app/releases/v2
切换版本:
bash
ln -sfn /opt/app/releases/v1 /opt/app/current
这种方式常用于部署和回滚。
11.2 配置启用
Nginx 常见结构:
bash
/etc/nginx/sites-available/demo.conf
/etc/nginx/sites-enabled/demo.conf -> ../sites-available/demo.conf
启用配置:
bash
ln -s ../sites-available/demo.conf /etc/nginx/sites-enabled/demo.conf
11.3 避免重复存储
同一大文件需要多个名字时,可以用硬链接:
bash
ln bigfile.dat backup_bigfile.dat
注意:修改任意一个都会影响同一份数据。
12. 常见问题
12.1 如何判断是不是软链接
bash
ls -l file
如果开头是 l:
bash
lrwxrwxrwx
就是软链接。
12.2 删除软链接会删除源文件吗
不会。
bash
rm soft.txt
只删除软链接本身。
但要注意目录软链接后面不要随便加 / 后再 rm -rf,否则可能进入目标目录删除内容。
12.3 如何找同 inode 的硬链接
查看 inode:
bash
ls -i file.txt
查找:
bash
find /path -inum 123456
13. 小结
软链接和硬链接核心区别:
text
软链接:指向路径
硬链接:指向 inode
常用命令:
bash
ln source hardlink
ln -s source softlink
ls -li
stat file
readlink link
readlink -f link
选择建议:
text
链接目录:用软链接
跨文件系统:用软链接
版本切换:用软链接
同一文件多个名字:可用硬链接
避免重复存储大文件:可用硬链接
理解 inode 后,Linux 文件、链接、删除、磁盘占用之间的关系会清楚很多。