【Linux】第二十六站:软硬链接

文章目录

  • 一、软链接
  • 二、硬链接
  • 三、ln命令
  • 四、该如何理解硬链接?
  • 五、如何理解软链接
  • 六、为什么要用软硬链接
    • 1.软链接的应用场景
    • 2.硬链接的应用场景

一、软链接

如下所示,我们创建一个文件以后,然后执行下面的指令

ln -s file.txt soft-link

image-20231203174337228

这时候我们看见了一个soft-link的文件,这个文件指向file.txt。这就是一个软连接

如果我们去查看inode,我们可以看到是两个inode,说明是两个不同的文件,因为一个文件一个inode

image-20231203175357395

所以软连接是一个独立的文件,因为具有独立的inode

二、硬链接

如果我们直接这样做

ln test.txt hard-link

image-20231203175808493

我们发现产生了一共hard-link文件,并且它和test.txt的第二个属性变为了2

也就是说这个数字其实叫做硬链接数

如果我们再去查看他们的inode

image-20231203180226943

我们会发现hard-link与test.txt的inode居然是一样的

所以,硬链接不是一个独立的文件,因为他没有独立的inode

三、ln命令

ln命令是链接命令,它如果带上-s选项代表是软连接,如果不带就是硬链接。

无论如何都是由后者指向前者

ln -s file.txt soft-link     //软链接
ln test.txt hard-link        //硬链接

四、该如何理解硬链接?

如下图所示

image-20231203181134294

因为我们一开始是先创建的test.txt,所以这个会献给test.txt分配一个inode

然后我们使用了硬链接,我们发现,出现了一共hard-link的文件,并且这两个文件的inode是一样的,这就说明了,他们的文件属性,文件内容一定是一样的

通过这里我们也可以再次印证,文件名并不在inode中存储,否则这两个文件名是一样的

所以我们建立一个硬链接,这个硬链接做了什么么?

所谓的建立硬链接,本质其实就是在特定目录的数据块中新增,文件名和指向的文件inode编号的映射关系!!

也就是说,像我们上面的例子中,就是在test_2023_12_03这个目录文件中,对应的数据块上写上一个文件名和inode的对应关系。

这样的话,假如我们将test.txt文件给删掉了,其实这个文件本质上还是存在的,因为inode为61的这个文件还是存在着的。不过引用计数由2变为1了

image-20231203182334267

所以上面的工作,我们成功的完成了一次取别名(因为inode在,这个文件就还在)

任意一共文件,无论是目录,还是普通文件,都有inode

每一个inode内部,都有一个叫做引用计数的计数器

目录里面保存的是文件名:inode编号的映射关系。

文件名1:inode1234

文件名2:inode1234

文件名3:inode1234

文件名4:inode1234

所以我们可以用不同的文件名映射同一个inode,所以因为inode本身的缘故,我们可以间接的认为每一个文件名都指向同一个文件

而这个就是我们以前类似的指针

所以这个引用计数表示的就是,有多少个文件名指向该文件

所以删除一个文件就是让引用计数减减,然后删除掉这个映射关系。

只有当减到0的时候,才会真正的删除掉这个inode文件

所以刚刚这个文件就没有被删除

所以我们建立的大多数普通文件他的硬连接数都是1。因为默认建立的文件只有一个文件名与inode对应。所以我们删除时候会直接删除到0,进而删除掉这个文件

五、如何理解软链接

我们知道,在我们前面使用软链接以后,他的引用计数没有发生变化

image-20231203184307622

并且软连接的文件和原来的文件有不同的inode,所以他们是不同的文件

所以这里就告诉了我们一个事实:我们的软连接是一个独立的文件,且不影响目标文件的引用计数

那么我们如何理解软链接呢?

由于软链接具有独立的inode和数据块,所以我们可以将这个软连接想象成一个独立的文件,该文件有自己的属性。

并且这个软连接文件里面放着的是所指向文件的路径

所以软链接是一个独立的文件,有独立的inode,也有独立的数据块,他的数据块里面保存的是指向的文件的路径

所以对于这个软链接,他可以有如下的场景

像file.txt中写入文件,但是我们可以用soft-link访问到对应的内容

image-20231203184924724

所以如果我们删除掉了这个soft-link文件,并不会影响到file.txt文件

但是一旦我们删除掉了file.txt文件,就会影响到soft-link文件,如下所示,因为它指向的文件已经不存在了

image-20231203185123389

其实这个软链接特别像windows中的快捷方式

删除这个软连接文件我们除了使用rm的方式,也可以使用unlink的方式

image-20231203185433138

六、为什么要用软硬链接

1.软链接的应用场景

当我们写了一个.c程序以后

image-20231203195221213

如下所示,当我们编译好软件以后,我们会将可执行程序放入到一些更深层的目录中

image-20231203195544522

如果我们要执行这个可执行程序,必须按照路径依次往里找

这对于客户来说太麻烦了

所以我们就可以形成一个软链接文件

image-20231203195745213

这样的话就可以直接运行这个程序了

所以我们就会发现在/lib64/这个目录下,存在着大量的软链接

image-20231203195945660

所以未来我们可以直接在下面的路径下建立一个可执行程序

sudo ln -s 可执行程序路径 /usr/bin/my.exe

如下所示

image-20231203201118667

所以未来我们要装软件的话,我们可以随意装,只需要在/usr/bin路径下安装一个软链接即可。

2.硬链接的应用场景

当我们建立一个普通文件的时候,它的硬链接数是1

image-20231203202222195

但是当我们创建一个目录文件的时候,它的硬链接数为2

image-20231203202253127

这是为什么呢?

首先这个dir它自己本身就有一组映射关系,所以这里已经有1了

但是当我们进入这个文件的时候,我们知道它有两个隐藏文件

我们会发现这个点也叫60,所以这个叫做当前目录

image-20231203202442299

现在我们就理解了什么叫做当前目录了,因为这个点就是dir的一个硬链接

而两个点表示这个上级路径

我们也可以注意到,这里确实是一个硬链接

image-20231203203143883

所以我们就理解了,为什么cd …会进入到上级目录了,因为这就是一个硬链接

当我们向这个dir文件里面继续创建了一个目录以后,我们会发现这个引用计数变为了3

image-20231203203405922

如下所示

就是因为存在这样一个点点目录

image-20231203203512767

如果我们去查看根目录的引用计数

image-20231203203857637

我们也就知道了,当前我们系统的有效的目录是16个

所以在我们的系统中硬链接必须存在,虽然它很少用,但是它要维持linux的目录结构

所以硬链接通常用于路径定位,采用硬链接,可以进行目录间切换

但是我们要注意,硬链接不允许对目录来进行定义,但是可以软链接

那么Linux系统不允许对目录建立硬链接,这是为什么呢?

如下图所示,这是一个Linux的一个目录,假设第一个是一个根目录,然后有一天我们在第三层的第一个文件中建立了一个硬链接,那么此时造成了闭环。

未来当我使用find / -name test.c命令的时候,会进入到环里面。

所以硬链接给目录很容易产生环路问题,引发系统级别的bug

image-20231203204756740

那么我们可能会好奇目录内部有点和点点这个不是目录的硬链接吗?

这其实是因为系统不相信我们,只相信自己,系统自己不会产生环路问题。

可是我们又会好奇,那既然系统自带点和点点,那在搜索时候不是已经自带环路问题了吗?

其实这是因为系统在搜索时默认不会搜索这两个文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++模拟实现unordered_map和unordered_set

目录 1.了解哈希表 1.哈希表 1.他的实现原理就是: ​编辑 2.写单个数据的类型(这边先模拟map的kv类型,后面会再一起改,这边先一步步的先简单实现他) 3.封装整个类: 4.哈希表中存储string 2.哈…

前后端分离部署https

引用:https://blog.csdn.net/weixin_35676679/article/details/127841598 前后端部署,,一般用的是nginx和java,,, 下载SSL证书: java配置https 将证书配置到springboot中 server:port: 544…

线程...

文章目录 1.Linux中线程该如何理解2.重新定义线程 和 进程3.重谈地址空间 --- 第四讲4.Linux线程周边的概念 线程:是进程内的一个执行分支。线程的执行粒度,要比进程要细 很多教材喜欢这么说,这只是一个线程的特征之一,来解释线程。 1.Linux中线程该如何…

基于51单片机的交通灯_紧急开关+黄灯倒计时+可调时间

51单片机交通灯_紧急开关黄灯倒计时可调时间 开题报告系统硬件设计主控制器选择系统硬件结构图时钟及复位电路指示灯及倒计时模块 倒计时模块:程序软件主流程框架main函数 设计报告资料清单资料下载链接 基于51单片机交通灯_紧急开关黄灯倒计时可调时间 仿真图prote…

题目:神奇的进制

解题思路: 用电脑自带的计算器,切换到程序员模式。里面有进制转换功能。 由题目,要求严格递增且都为字母,还要大于2023,则数字16进制为ABC。

【STM32】电机驱动

一、电机分类 二、直流电机的分类 1.有刷电机 2.无刷电机 3.直流减速电机 三、H桥电路 正向旋转 驱动Q1和Q4 反向旋转 驱动Q2和Q3 四、MC3386电机驱动芯片 1.基本原理图 1)前进/后退:IN1和IN2的电平顺序决定电机的正反转 2)调节速度&#…

Redis对象

Redis根据基本数据结构构建了自己的一套对象系统。主要包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象 同时不同的对象都有属于自己的一些特定的redis指令集,而且每种对象也包括多种编码类型,和实现方式。 Redis对象结构 struct redisOb…

Linux 防火墙

目录 安全技术 防火墙的分类 按保护范围划分 按实现方式划分 按网络协议划分 应用层防火墙(7层) 防火墙的工作原理 linux防火墙的基本认识 防火墙工具介绍 1.iptables 2.firewalld 3.nftables 安全技术 —— 入侵检测系统(Intru…

centos7中通过kubeadmin安装k8s集群

k8s部署官方提供了kind、minikube、kubeadmin等多种安装方式。 其中minikube安装在之前的文章中已经介绍过,部署比较简单。下面介绍通过kubeadmin部署k8s集群。 生产中提供了多种高可用方案: k8s官方文档 本文安装的是1.28.0版本。 建议去认真阅读一下…

使用coco数据集进行语义分割(1):数据预处理,制作ground truth

如何coco数据集进行目标检测的介绍已经有很多了,但是关于语义分割几乎没有。本文旨在说明如何处理 stuff_train2017.json stuff_val2017.json panoptic_train2017.json panoptic_val2017.json,将上面那些json中的dict转化为图片的label mask&am…

Docker下安装MySQL

如果在Docker下直接拉取MySQL并运行镜像,由于没有指定字符编码集,可能会存在插入中文出现乱码的情况,并且当容器删除后,容器里面存在的数据会丢失,所以在运行容器时应该使用数据卷进行挂载,按照如下步骤操作…

大模型中幂律缩放法则和涌现能力

幂律缩放法则是一种用于描述两个变量之间关系的数学模型。 根据幂律缩放法则,当一个变量的值变化时,另一个变量的值以指数方式变化。具体而言,幂律缩放法则可以表示为Y a * X^b,其中Y表示一个变量的值,X表示另一个变…

网页中的json文档,怎么保存到本地

火狐浏览器操作方法 方法一 右键——>另存页面为 方法二 点击右边的三条横线——>另存页面为 谷歌浏览器操作方法 方法一 右键——>另存为 方法二

阵列信号处理---均匀线阵和均匀加权线阵

均匀线阵 均匀线性阵列(ULA:Uniform Linear Array):有N个阵元位于z轴上且具有均匀间距d。 一般都把阵列的中心放在坐标系的原点。如下图 阵元的位置为 p z n ( n − N − 1 2 ) d , n 0 , 1 , … , N − 1 p_{z_n}\big(n-\frac{N-1}{2}\b…

LLM 开发模式 RAG,MRKL,Re-Act,Plan-Execute 模式对比

本心、输入输出、结果 文章目录 LLM 开发模式 RAG,MRKL,Re-Act,Plan-Execute 模式对比前言RAG、MRKL、Re-Act和Plan-Execute模式的一些对比花有重开日,人无再少年实践是检验真理的唯一标准 LLM 开发模式 RAG,MRKL&…

Wireshark抓包分析RTMP协议时,出现Unknown问题

进行rtmp推流时,使用wireshark抓包,发现部分包显示Unknown 解决方法: 编辑 -> 首选项 -> Protocols -> RTMPT,这里Maximum packet size默认是32768 将该值调大,比如调成1048576,即可解决该问题。…

pytorch 中的dim 的作用范围

1. 二维矩阵时 不同的运算, dim 的作用域都是一样的思想; 当数据是二维矩阵时, 可以按照下面的思想理解: 对于矩阵: dim0 按列操作(沿列向下)。 dim1 按行操作(跨行)。 …

Windows修改MAC地址的方法(以windows11为例)

我们在日常的工作中,如果mac地址被限制,就需要修改mac地址,本文总结一下修改windows的mac地址的方法。 方法一:网络适配器中配置 网络适配器中配置的方式适用于能够在网络适配器中找到物理地址(NetworkAddress)的情况。 1、打开…

腾讯云轻量服务器通过Docker搭建外网可访问连接的redis5.x集群

原创/朱季谦 最近买了一台4核16的腾讯云轻量应用服务器,花了我快四百的大洋,打算搭建一堆docker组件集群,最先开始是通过docker搭建redis集群,计划使用三个端口,分别是7001,7002,7003。 腾讯云服务器有防火墙限制,故…

使用trigger-forward跨流水线传递参数

参考文档:https://docs.gitlab.com/ee/ci/yaml/#triggerforward 今天给大家介绍一个gitlab CI/CD的关键字 - forward,该关键字是一个比较偏的功能,但同时也是一个很实用的功能,我们通过在gitlab的ci文件中使用forward关键字&#…