Linux 软链接和硬链接详解:ln 命令背后的 inode 原理

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 文件、链接、删除、磁盘占用之间的关系会清楚很多。

相关推荐
vsropy19 小时前
Ubuntu网络图标消失问题/有网络问号
linux·运维·ubuntu
coderwu20 小时前
Ubuntu 24.04 终端输入 openclaw config 提示未找到命令解决办法
linux·运维·ubuntu
凡人叶枫1 天前
Effective C++ 条款28:避免使用 handles 指向对象内部
linux·服务器·开发语言·c++·嵌入式开发
AI帮小忙1 天前
Debian系linux操作系统里安装OpenClaw
linux·运维·debian
极创信息1 天前
Linux挖矿病毒深度清理实战教程,从进程隐藏、Rootkit驻留到彻底根除
java·大数据·linux·运维·安全·tomcat·健康医疗
weixin_307779131 天前
Python写入Shell文件使用Linux系统的换行符
linux·开发语言·python·自动化
liulilittle1 天前
Linux Swap 文件配置与持久化(虚拟内存)
linux·运维·服务器
青梅橘子皮1 天前
Linux---进程控制(2)(进程程序替换)
linux·c++·算法
零陵上将军_xdr1 天前
从沙子到CPU——计算机硬件基础入门
linux·运维·硬件架构
vortex51 天前
Linux 命令工具箱:util-linux 与 GNU Coreutils
linux·运维·gnu