目录
一、如何建立文件之间的软硬链接
软硬链接是文件两种不同的链接方式,分为软链接和硬链接。
需要注意的是,创建软链接或硬链接的前提是目标文件已经存在。
下面我们将详细介绍如何在命令行中创建这两种链接。
我们先从创建文件的软链接开始
二、软链接
ln 是 Linux 中 创建链接文件 的命令,全称是 link(链接)。默认不加参数时, ln 创建的是硬链接;加上 -s 参数( ln -s ),创建的是软链接,。
- 硬链接: ln 原文件 硬链接名
- 软链接: ln -s 原文件 软链接名
创建软链接
bash
ln -s 原文件 进行软链接的文件
使用上面的指令即可建立文件之间的软链接,其中 -s 选项是代表着 soft 即柔软的意思,用来表示该指令进行软链接

软链接创建完成后,我们可以通过执行 ls -l -i 命令来查看文件的inode编号。此时会发现,软链接文件soft_file和原文件file.txt各自拥有不同的inode编号。这表明软链接文件具有独立的inode结构,即它拥有专属的文件属性。
由此可见,软链接本质上是一个独立的文件,因为它拥有自己唯一的inode编号。
什么是软链接?
软链接(Symbolic Link)是Linux里一个独立的"路径文件",即文件自身不存实际数据,只记录原文件/目录的路径,相当于Windows的"快捷方式"。
- 软链接是一个独立的文件,它具有独立的inode,同样也有独立的数据块,数据块里面保存的是指向原文件/目录的路径
- 软链接相当于windows中的桌面上的快捷方式 ,如下windows桌面上中的应用实际上并不是真正的应用程序的存放位置,windows桌面上的应用都是快捷方式,实际上存储的是程序的路径,加上图形化界面的一层外包装而已,两者都是"空壳子"------快捷方式不存文件内容,软链接也只存原文件路径,自身都不是真实数据;

- 此时对应的"C:\Program Files (x86)\Tencent\QQMusic\QQMusic.exe"即为实际应用程序存放的位置,桌面的快捷方式存储了这个路径,并且通过这个文件路径就可以找到实际的应用程序打开,这样用户就不再需要亲自去执行的文件路径下打开应用程序了,将这个工作交给快捷方式,即软链接,便捷了用户
软链接文件中存储着指向文件的路径 ,那么也就是说,我们可以使用软链接文件(借助里面的路径)去查看指向文件的内容,此时soft-file对file.txt文件进行了软链接,下面我们向指向文件file.txt中追加重定向输入内容,那么这时候我们就可以通过soft-file查看file.txt的内容

如果要删除软链接文件,那么使用 unlink 软链接文件,即可进行删除

软链接的应用场景
为什么要用软链接?也就是软链接的应用场景,例如:当需要频繁访问路径较深的可执行文件时,可以在当前目录创建软链接直接指向该文件。这样就能在当前路径下快捷执行,避免每次都要输入冗长的文件路径。
演示一下,我们在当前路径下新建一个mytest.c文件,将它编译形成可执行程序mybin.exe

mytest.c的代码如下
运行结果:
在规范的项目管理中,通常需要采用多文件管理机制。项目一般会包含一个核心配置文件,同时可执行文件往往存放在较深的目录层级中。为了模拟这种结构,我们创建了一个名为"conf"的虚拟配置文件,并通过递归方式建立深层目录结构,最终将应用程序部署在该目录深处。

若没有软链接,执行当前目录下的应用程序需要输入冗长的完整路径,操作起来相当不便。

现在我们可以创建软链接。在当前目录下为该应用程序建立软链接后,软链接文件会保存原始应用程序的路径。这样,我们就能直接通过软链接文件来执行目标可执行程序了。 
为什么软链接文件仅仅通过文件路径就可以访问指向文件的文件内容或者执行指向的可执行文件(应用程序)?
软链接的存储本质是在软链接文件自身的数据块里,只记录了目标文件的路径字符串。**当访问软链接时,系统先读取软链接里的目标路径;顺着该路径回溯到根目录,找到目标文件的文件名与 inode 的映射关系,获取目标文件的 inode 编号;通过 inode 编号调取目标文件的属性、数据块索引等信息,最终读取内容或执行程序。**若目标是可执行文件,系统解析到 inode 后,会按可执行文件的运行规则加载执行,等同于直接访问原文件。
同样的在系统库中同样也有诸多的软链接的使用,或是对文件路径有要求,或是对文件明明有要求,我们可以使用**ls -l /lib64/**指令进行查看

我们还可以通过创建软链接的方式,将可执行程序放置在系统路径中。这样执行程序时就不需要指定完整路径,系统会自动在路径中搜索软链接文件执行。
首先查看系统路径变量$PATH,这里我们选择将软链接文件放在/usr/bin/目录下。

首先使用pwd命令查看当前路径的绝对路径,再用tree命令查看bin目录结构。这样就可以确定可执行程序mybin.exe相对于当前目录的相对路径。将当前绝对路径与mybin.exe的相对路径拼接,即可得到完整的绝对路径。接着使用ln -s命令创建软链接,语法为: ln -s 源文件 目标文件。要在系统指令目录/usr/bin下创建名为my.exe的软链接文件。由于普通用户没有权限修改系统目录,需要使用sudo提权。这样设置后,就可以在命令行中直接通过my.exe来执行mybin.exe程序,无需指定完整路径。

如果要删除 /usr/bin 目录下的 my.exe 软链接,就采用下面的方式,删除成功后再次执行就会报错

软链接的本质
软链接的本质是Linux系统中文件的"快捷方式",是一种指向另一个文件/目录的特殊文件,并非原文件本身的复制。
核心特性:
- 仅存指向信息:软链接文件中只存储原文件的路径(绝对/相对),自身大小极小,不会占用与原文件相当的存储空间。
- 依赖原文件存在:若原文件被删除/移动/重命名,软链接会变成断链 (终端中通常标红),失去实际作用。
- 跨文件系统:软链接可以指向不同分区、不同文件系统中的文件/目录,这是硬链接不具备的特性。
- 权限无实际意义:软链接的权限显示为 lrwxrwxrwx ,但实际访问权限由原文件决定。
简单来说,软链接就是给原文件建立的一个"访问入口",通过这个入口能直接操作原文件,且修改软链接的指向不会影响原文件本身。
三、硬链接
创建硬链接
bash
ln 被硬链接的文件 进行硬链接的文件
使用上面的指令即可建立文件之间的硬链接,观察,这条指令中没有-s选项,说明如果不带-s选项,那么ln指令默认就是进行的文件之间的硬链接



这样硬链接就链接完成了

这时我们使用 ls -l -i 指令去查看文件的inode编号,发现硬链接文件log_hard与被链接文件log.txt共享同一个inode编号920951。这表明log_hard文件没有独立的inode编号,也就意味着它不具备独立的文件属性。因此,硬链接文件并非独立文件,因为它缺少专属的inode。
这一现象也间接证明文件名不属于inode中的文件属性。如果文件名是文件属性的一部分,那么硬链接文件log_hard与被链接文件log.txt的名称应该相同。但实际情况是两者名称不同,这充分说明文件名并非inode的文件属性。
什么是硬链接?
硬链接不是一个独立的文件,因为它没有独立的inode
下面我们认识一下inode中的文件属性中的一个引用计数,即硬链接数


通过上面的演示我们可以看出原文件log.txt中的硬链接数是1,当我们使用log_hard硬链接源文件log.txt之后,源文件log.txt的硬链接数变为2,同时硬链接文件log_hard的硬链接数也为2,此时我们将原文件log.txt删除一下,看看会发生什么

此时原文件log.txt被删除,只留下了硬链接文件log_head,并且硬链接文件的log_hard的文件属性中的硬链接数变成了1,并且inode编号仍然保持不变,代表着此时inode以及数据块,即原文件的文件属性和文件内容变成了硬链接文件hard-link的了,是不是有点类似于小说情节中的夺舍过程,其实这里更像的是C++中的引用,硬链接可以让多个文件名对应同一个inode
因此所谓建立硬链接,本质就是在特定目录的数据块中新增文件名和指向的文件的inode编号的映射关系
任何一个文件,无论是目录,还是普通文件都有inode,每一个inode结构体内部,都会有一个引用计数的计数器,叫做硬链接数,用来表征有多少个文件名指向其本身
目录里面保存的是 文件名:inode编号 的映射关系,如下,这种映射关系,文件名映射inode编号,inode编号对应的是inode,即文件名指向inode,那么文件名就类似于指针的作用一样

此时真正删除的是文件名和inode之间的映射关系,也只有当全部删完才算删除干净
硬链接的应用场景
为什么要有硬链接?那么也就是回答硬链接的应用场景有哪些,举例:通常用来进行路径定位,采用硬链接,可以进行目录间的路径切换
如何理解呢?首先我们来看在当前目录下创建的目录dir并且查看当前目录下的目录文件属性

让我们思考一下,**为什么目录dir的硬链接数会是2?**这个现象可能出乎意料,因为我们平时很少关注目录文件的硬链接数。
这是因为在dir目录中存在一个隐藏的当前路径符号".",它与dir目录共享相同的inode编号,这说明"."实际上就是dir目录的一个硬链接。

如下图,此时我们使用 cd .. 退回上级目录,查看一下上级路径的硬链接数为什么是3呢?


首先我们需要明确上级目录的概念:当前目录 dir 的上级目录是lesson29,而lesson29又位于116_117目录下。
对于lesson29目录来说,其硬链接数的计算方式如下:
- lesson29本身是第一个硬链接
- lesson29目录中的当前目录标记
.是第二个硬链接 - dir目录中的上级目录标记
..指向lesson29,这是第三个硬链接
同理,当我们切换到根目录时,可以通过硬链接数推断其下的目录数量:
- 根目录自身是一个硬链接
- 根目录中的当前目录标记
.也是一个硬链接 - 根目录下的每个子目录都会通过
..链接回根目录
因此,将根目录的硬链接总数减去2(自身和.),剩余数量就是根目录下的子目录总数。

正好借助这个硬链接数,此时我们扩展一下删除软链接的unlink是底层是什么,使用ln -s 被软链接的文件 软链接的文件 ,让软链接指向目录文件之后,再使用unlink 软链接文件,即使用unlink删除软链接文件


本质上,**unlink 操作是通过减少文件的引用计数(即硬链接数)来实现删除功能的。**以软链接文件soft_dir为例,当引用计数为1时执行unlink操作后,计数减至0就会触发文件删除。
同样地,unlink也能用于删除硬链接文件。具体操作流程如下:首先创建一个普通文件file.txt,然后执行 ln 原文件 硬链接文件 命令为其创建硬链接。此时file.txt和硬链接文件hard_file会共享相同的inode编号,这表明这两个文件名实际上指向同一个inode节点。

当使用unlink删除硬链接文件hard_file时,硬链接文件的引用计数从2减为1。由于引用计数不为0,系统不会删除文件本身(包括inode和数据块),但会在当前目录的数据块中移除hard-link文件名与inode编号的映射关系。此时我们观察到hard-link文件名消失,但inode仍存在,由普通文件file.txt单独指向该inode。
接着使用unlink删除file.txt时,其引用计数从1减为0。系统将执行以下删除操作:
- 根据inode编号定位inode表项
- 遍历inode的数据块指针数组,在数据块位图中将对应比特位置0(标记为可覆盖)
- 在inode位图中将该inode编号对应的比特位置0
- 从当前目录数据块中移除file.txt与inode的映射关系
最终我们观察到file.txt文件名消失,其对应的inode编号也不再存在。需要注意的是,这种"删除"实际上是通过位图标记实现的,仅表示相关存储空间可被重新利用。
硬链接能否链接目录,为什么?
既然通过上面的例子,硬链接可以链接普通文件file.txt,**那么硬链接可以链接目录文件吗?**下面我们尝试一下
在上面的示例中,我尝试对目录文件创建硬链接,但操作系统始终拒绝该操作。可能我们会认为这是权限问题,于是我用sudo提权后再次尝试,结果依然无法创建目录文件的硬链接。
这确实令人困惑,因为操作系统内部本身就存在目录链接的实例(比如当前目录"."和上级目录"..")。为什么系统可以自行创建目录链接,却禁止用户进行类似操作呢?
原因很简单:操作系统需要维护文件系统的稳定性。我们知道文件系统是多叉树结构,如果允许用户随意创建目录硬链接,在使用find等工具按文件名查找时,就可能出现环路问题,导致死循环。因此,操作系统严格限制目录硬链接的创建,以确保文件系统的完整性。

假设操作系统允许对目录随意创建硬链接,当我们在4号目录下执行 ln / root 命令为根目录创建硬链接时,由于根目录的inode编号通常固定为2,此时4号目录下会新增一个名为root的硬链接文件指向inode 2。假设该目录下还存在一个test.txt文件。
当我们使用find命令从根目录开始搜索test.txt时,系统会按以下路径遍历:
- 先搜索根目录下的1号目录(未找到)
- 继续搜索2号目录(找到)
- 进入2号目录下的4号目录
- 遇到root目录(硬链接)
- 由于root指向inode 2(即根目录),系统会重新回到根目录 这样就会形成无限循环的搜索路径,造成环路问题。因此操作系统禁止用户对目录创建硬链接。
关于find命令为什么不搜索"."和".."这两个隐藏目录:
- 如果搜索这些目录,同样会导致死循环问题
- 操作系统专门对此做了处理,在搜索时自动跳过这两个特殊目录
操作系统自行实现目录硬链接(即"."和"..")的原因:
- 提高易用性:无需每次都使用绝对路径 方便进行文件操作(增删查改)
- 安全考虑:限制用户创建目录硬链接可避免环路问题 确保系统安全稳定运行
这种设计既提供了便捷的目录导航功能,又通过合理限制保证了系统的安全性和效率。
四、总结:
摘要:本文详细介绍了Linux系统中的软硬链接机制。软链接(符号链接)是独立的路径文件,仅存储目标文件路径,相当于快捷方式,支持跨文件系统;硬链接则是共享同一inode的文件名映射,不能跨文件系统且不能链接目录。文章通过命令行实例演示了创建方法(ln -s创建软链接,ln创建硬链接),并分析了inode编号、引用计数等底层机制。重点阐述了软链接在简化深路径访问、硬链接在目录导航(.和..)中的应用场景,以及操作系统限制目录硬链接防止环路的设计考量。最后对比了两种链接的特性差异和使用注意事项。
感谢大家的观看!



