深入解析Linux软硬链接:原理、区别与应用实践

Linux系列


`


前言

上篇文章我们详细的介绍了文件系统的概念及底层实现原理,本篇我们就在此基础上探讨Linux系统中文件的软链接(Symbolic Link)和硬链接(Hard Link)。


学习本篇前,强烈建议你先去看一下上篇文件系统

一、软硬链接的概念引入

在Linux系统中,链接是一种将一个文件或目录与另一个文件见或目录关联起来的方法,分为硬链接和软链接(符号链接)两种。

1.1 硬链接

我们先来简单了解一下:

在这里插入图片描述
第一个是test.c文件对应的inode编号,第二个则表示该文件对应的硬链接数。

建立硬链接:

ln 目标文件  源文件  ----使用源文件与目标文件建立硬链接

在这里插入图片描述
可以看到我们两个文件的inode编号相同,链接数由1-->2,而上篇我们说过每个独立的文件,必须拥有自己的inode编号,所以硬链接并不会创建新的文件,那我们该如何理解呢?其实所谓的建立硬链接本质上就是在特定目录的数据块中新增一个,文件名和指向文件的inode编号的映射关系!!!

下面来进行一个测试:
在这里插入图片描述
下面我们将test.c删除:
在这里插入图片描述
可以看到将test.c删除后并不会对hardLink文件的存在产生影响,但是链接数由2-->1,这是因为在inode内部会存在一个引用计数,用来标记有多少个文件名与该inode建立了映射,当与该inode建立映射的文件名增加时,引用计数增加,反之减小,当计数为0时则将该inode标记为可释放。

验证文件的硬链接关系,还可以通过对比ls +选项显示出的文件信息进项验证,源文件与链接的目标文件信息是相同的,你可以试着改变文件权限来验证,这里就不演示了

扫描二维码关注公众号,回复: 17595912 查看本文章

1.2 软链接

建立软连接:

ln -s 目标文件 源文件------使用目标文件与源文件建立软连接

在这里插入图片描述
可以看到,使用的源文件softLinkinode编号与目标文件的inode编号不同,这表明源文件是独立的文件,建立软链接会创建新文件。软链接文件拥有独立的的ioode和数据块,其数据块存储的是目标文件的路径。

在这里插入图片描述
当你对目标文件进行删除后,软链接文件就失去了存在的价值。

二、软硬链接的使用场景

2.1 软链接

软链接文件存储的是目标文件的路径,这就好像Windows下软件的快捷方式一样:

在这里插入图片描述
Windows下创建的快捷方式本质就是通过路径查找对应的可执行文件,当我们直接去找软件的可执行文件去启动它,是非常不方便的。
在这里插入图片描述
在Linux系统下软链接文件就像目标文件的快捷方式一样,当目标文件存在于当前目录,而我们想在其他目录执行它,就可以在其他目录与他建立软连接:

  1 #include<stdio.h>
  2 
  3 int main()
  4 {
    
                                                                                                                                     
  5   printf("softLink--->\n");
  6   printf("softLink--->\n");
  7   printf("softLink--->\n");
  8   printf("softLink--->\n");
  9   printf("softLink--->\n");
 10   return 0;                
 11 }        

在这里插入图片描述
我们想在/home/ltn目录下执行/home/ltn/dir/dir2下的test文件,就可以在/home/ltntest建立软链接。
在这里插入图片描述
这样利用这种方法我们就可以在任意目录下执行任意目标文件了。
你可以尝试将软链接文件,创建在/user/bin路径下,这样就可以像执行指令一样执行源文件了

2.2 硬链接

我们先来看下面这个场景:
在这里插入图片描述

对于新建的目录文件,它的硬链接数为2,而普通文件的硬链接数为1,这时为什么呢?在新建目录下存在两个默认的目录
在这里插入图片描述
大家对这两个目录应该是非常熟悉的,.为当前目录,也就是与mydir目录建立的硬链接,而..为上级目录也就是与mydir的上级目录建立的硬链接,所以在加上,上级目录下的两个默认目录,于是就呈现出当前目录的硬链接数为2,上级目录的硬链接数为3。而我们平时就会使用这两种硬链接进行路径定位或切换,总的来说硬链接可以帮助我们在Linux中进行路径索引。

需要注意的是,Linux下不允许随便对目录文件进项硬链接,原因如下:

在这里插入图片描述

我们知道,在Linux下文件目录呈现出一颗多叉树的形状,当用户使用find在家目录下查找一个文件时,就可能发生从目录0--->1----->2------>3----->0,发生循环引用的问题。

三、总结

  1. inode关联:硬链接与原文件共享同一个inode,而软链接有自己的inode。
  2. 跨文件系统:硬链接只能在同一个文件系统内创建,因为inode是文件系统级别的;而软链接可以跨文件系统,因为它只是存储路径字符串。
  3. 目录链接:硬链接不能链接到目录,这是为了防止在文件系统中形成循环,而软链接可以链接到目录。
  4. 删除原文件的影响:删除原文件后,硬链接仍然有效,因为inode的引用计数减1,但只有当计数为0时才会删除数据;而软链接则会失效。
  5. 文件大小:硬链接不会占用额外空间,因为它们共享数据块;而软链接会占用少量空间来存储目标路径。
  6. 创建方式:使用ln命令创建硬链接,ln -s创建软链接。