linux文件——文件系统——学习、理解、应用软硬件链接

**前言:**本篇内容主要讲解文件系统的软硬件链接。 经过前两篇文件系统的文章------讲解硬件(磁盘)、讲解文件系统底层, inode, 我们本节内容可以很好的理解我们要讲解的内容。 并且本节内容较少, 友友们学习本节的时候将会比前几节相对轻松一些。

ps:友友们务必了解磁盘的结构以及文件系统的底层原理以及inode, 再学习本节内容。

目录

软硬件链接------认识

什么是软链接

什么是硬链接

软硬件链接------底层原理

硬链接------深层挖掘

软链接------深层挖掘

软硬件链接的应用场景

软链接------实例应用

硬链接------实例应用

目录硬连接的死循环问题


软硬件链接------认识

什么是软链接

首先, 我们先创建一个空文件, 如下图:

然后, 我们就可以创建这个文件的软链接。 ------注意, 这里的文件是普通文件。 但是目录文件也可以, 最好使用普通文件, 因为好进行下面内容的测试

上图中,ln就是链接的意思。 -s就是软链接, 然后file.txt就是连接到的文件------也就是目标文件, soft_link就是连接的文件------也就是软链接出的新文件。 也就是说, 由soft_link指向file.txt。

而且, 我们使用ls -li, 也就是查看文件的inode编号, 会发现, soft_link的编号和file.txt是不一样的。如下图:

所以, 我们就可以得出一个结论------软链接是一个独立的文件, 具有独立的inode。

什么是硬链接

接下来, 我们再创建一个test.txt

接下来, 我们去掉-s, 直接ln test.txt hard_link------这就是创建硬链接, -s是创建软链接, 而如果去掉-s的话, 就是不创建软链接了, 也就是创建硬链接。

而观察硬链接的inode编号, 我们可以发现, 硬链接的编号和原文件相同。 那么我们这里就可以下另一个结论------硬链接没有独立的inode, 不是一个独立的文件。

而且, 硬连接的文件属性中有一个地方发生了变化,上图中, 画圈圈的2处, 这个地方如果我们在实验的时候观察仔细就会发现, 在没有硬链接之前是1, 但是硬链接之后, 就变成了2. 我们这里再做一次实验:

由实验我们真实的看到, 这里的数字从1变成了2。 而这个数字, 博主可以告诉友友们, 其实这个数字就是一个引用计数------这里从1变成了2, 本质上就是引用计数发生了变化!这个引用计数叫做硬链接数

软硬件链接------底层原理

硬链接------深层挖掘

其实, 一般情况下, 我们学习软硬件链接只能学到上面的东西, 但是我们今天还要加深对于软硬件链接的理解。 对于硬链接来说, 我们知道, 硬链接的新文件和原文件的inode是一样的,但是文件名是不一样的。 而且我们又知道, 目录的块里面保存的是什么?------保存的是文件名和inode的映射关系!!! 这里为什么要说这个? ------因为硬连接的本质------其实就是在目录的块里面创建一个文件名和inode的映射关系!!!

对于硬链接数来说, 我们知道任何一个文件,无论是目录, 还是普通文件, 都有inode。 对于inode内部, 都有一个叫做引用计数的计数器

而由于目录里面保存的是:文件名和inode编号的映射关系! 所以多个文件名指向一个inode就有如下图结构:

也就是说, 无论文件名如何变化, inode是不变的。 每一个文件名最终都会指向同一个inode换句话说, 就是每一个文件名最终都会指向同一个文件!!!

所以我们在删除一个文件的时候(rm), 其实就是让该文件的inode里面的引用计数减减如果inode减到了0, 那么再进行inode的删除工作, 也就是我们上篇文章所讲到的删除文件的流程------简单说就是根据目录找到对应的文件的inode编号, 找到编号计算在哪个区, 哪个组当中。 然后根据inode编号找到block NUM, 将block bitmap置为0, 然后inode bitmap置为0.

软链接------深层挖掘

对于软链接来说, 软链接不会影响目标文件的引用计数, 那么就是说, 软连接的本质和硬链接是不同的。 那么软链接是什么情况呢?

我们看下图的一个现象(soft_link是file.txt的软链接):

这是为什么呢? 这是因为软链接里面的数据块里面, 保存的是所指向文件的路径!!!------也就是说, 软链接是一个独立的文件, 有独立的inode, 也有独立的数据块, 他的数据块里面保存的是指向文件的路径
如果我们删除软链接, 那么没有问题。 但是我们如果删除软连接的目标文件****, 就会发生错误, 因为软链接文件找不到原文件了。 如下图:

软链接就像我们常用的快捷方式。 下面是一个快捷方式:

我们桌面上的就是快捷键, 也就是相当于软链接, 然后我们的目标文件其实就是在图中的红框框的路径里。 而且我们可以删除快捷键, 但是如果我们删除了目标路径下的程序文件, 那么快捷方式也不能跑了。

学到了软硬件连接的本质, 底层原理还不够, 我们还要学习一下软硬件连接的应用场景。 只有这样, 我们才算是真正的理解软硬件链接。 下面我们来认识一下具体的场景------

软硬件链接的应用场景

软链接------实例应用

我们先写一个程序,如下图, 代码很简单:

我们直接在当前路径生成可执行程序。


然后我们将软链接文件创建在bin目录下(也就是bin下创建快捷键), 然后我们就可以在任何目录下直接使用文件名运行程序了, 如下图:

这就是软链接的一个应用场景。

硬链接------实例应用

我们创建一个目录:

我们可以看到, 图中的这个新建的目录的硬链接数是2, 为什么呢? ------不知道友友们记不记得我们曾经说过------每个目录下都有.这个文件目录

.目录就是目录本身------上图中的inode也证实了这一点。 而这个inode两者相同, 这就是为什么.是当前目录的原因, 也可以说是本质。------这就是硬链接的一个应用场景。

.谈完了, 再谈..

..我们说过是上级目录, 我们进入newdir, 并且记一下此时newdir目录的硬链接数, 以及inode编号:

我们再在这个目录中创建文件, 就会看到newdir目录的硬链接数加了1, 并且新创建的文件agamk里面的..和newdir的inode是一样的。

也就是说, ..和上一级目录指向的文件是一样的。 ..就代表上一级目录!!而且,只要我们创建一个新的子目录, 当前目录的硬链接数就会加, 这是因为子目录的上一级目录文件的inode都是当前目录的inode!!!

那么我们如果查看根目录下的硬链接数:

如图是19, 那么我们就可以算出, 当前根目录下一共有多少个有效目录呢?------答案是17, 因为空目录为2, 所以19 - 2 = 17.

而且, 我们知道, 正是因为有了.和.., 我们才得以进行路径的定位。 也就是说,硬链接的一个作用是什么呢?------就是进行路径的定位!!

目录硬连接的死循环问题

注意, linux系统不允许创建目录的硬链接。 ------即使.和..是硬链接, 但是这是系统默认的。 而我们的用户是不允许的, 为什么?

下面我们看这么个情况。

下面是文件系统的树形结构图:

如果我们在系统中查找某一个文件的时候, 我们当查到了上面的绿圈圈root, root告诉我们它是硬链接, 我们要返回inode为2的目录再去寻找, 而inode为2就是根目录。 也就是说, 当我们查到root的时候, 我们又会重新查一遍, 反反复复就会陷入死循环。 ------这就是为什么不能硬链接。

但是可能我们会问, 不是刚刚才讲到, .和..不就是硬链接吗?为什么又说不能创建呢? 这是为什么呢?------这是因为操作系统默认已经把.和..创建好了。 操作系统不允许用户创建硬链接目录, 即便这个用户是root

而且, 系统在搜索路径的时候, 不会去搜索.和.., 也就不存在环路问题!!!

------------------以上, 就是本节的全部内容, 下面为本人学习笔记

相关推荐
青山撞入怀111412 分钟前
sql题目练习——聚合函数
数据库·sql
woshihonghonga15 分钟前
停止Conda开机自动运行方法
linux·人工智能·conda
Arva .18 分钟前
面试题02
后端
disanleya18 分钟前
MySQL默认端口为何是3306?修改后如何管理?
数据库·mysql·adb
遇见火星3 小时前
Ubuntu Docker 容器化部署教程
linux·ubuntu·docker
川石课堂软件测试3 小时前
MySQL数据库之DBA命令
数据库·网络协议·mysql·http·单元测试·prometheus·dba
uzong4 小时前
一次慢接口背后,竟藏着40+种可能!你中过几个
后端·面试·程序员
G探险者5 小时前
滴滴P0级故障背后:互联网公司是如何分级处理线上事故的?
后端
ybb_ymm5 小时前
mysql8在linux下的默认规则修改
linux·运维·数据库·mysql