【Linux】深刻理解软硬链接

一.软硬链接操作

1.软连接

touch 创建一个文件file.txt ,对该文件创建对应的软链接改怎么做呢?

ln  -s  file.txt  file-soft.link .给对应文件创建软连接。

软连接本质就是一个独立的文件,因为我们对应的软连接有独立的inode,他和他指向的file.txt的inode是不同的。

如下图:

我们把字符串写入file.txt中,查看两个文件的内容,都能看到该字符串,说明实际在用户层使用我们的软连接,等同于我们的目标文件。软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和 被引⽤的⽂件的inode不同

2.硬链接

硬链接的使用方法,对文件file.txt怎么创建硬链接?

ln  file.txt  file-head.link.给对应的文件创建硬链接。

硬链接本质上不是一个独立的文件,没有独立的inode,而是相同的inode,不同的文件文件名。

在Linux中可以让多个文件名指向同一个inode。

如上面图片所示,权限后面这个数字是什么呢?没创建硬链接时,数字为1,创建硬链接后数字变成2,这个我们先引出来,后面说!!

Linux中搞懂操作是没什么用的,就跟之前创建进程,等待进程,说了操作,接口讲完没有用,最关键的是他在干什么?下面我们来认识如何理解软硬链接!!!

二.如何理解软硬链接

a.软硬链接有独立的inode,所以一定要有独立的属性和内容,软链接内容上,保存的是目标文件的路径,在Windows中,相当于一个软件在桌面上的快捷方式,所以平时用的这些快捷方式也是一个软连接文件,Linux中,软连接就是指向文件的快捷方式!!

b.硬链接,不是独立的文件,没有独立的inode,硬链接本质就是一组文件名和已经已经存在的文件的inode的映射关系!!!

c.所以当我们建立了软连接,就是相当于在当前目录下建立了一个软连接文件,快捷方式,而其中,我们建立一个硬链接,就是在我们当前所处的目录当中新增加一个文件名和要链接文件的inode的映射关系,所以最终,我们就会发现,这个硬链接文件,他所查到的inode和目标文件inode是一样的了,这个就是硬链接!!!

d.文件权限后面对应的数字是什么呢?创建硬链接文件前,目标文件数字为1,创建硬链接文件后,目标文件变成2?

根据前面讲的文件系统内容,知道了,一个目录也是文件,他的内容保存的是该目录下文件的文件名和inode的映射关系,所以在我们当前目录中,新建一个普通文件,题目文件名不在inode中保存,普通文件的文件名是在我们的文件所处的目录文件他的内容中保存的,创建一个硬链接文件,换句话说,就是在当前目录中有两个文件名,他们两个都会映射到同一个inode,这像什么呢?inode特别像一个指针一样的东西,所以当我们想使用文件名找文件的时候,我们都知道Linux下是通过inode找文件,两个文件的inode相同,所以本质上就是相当于有两个文件名指向同一个inode,换句话说,我作为一个inode,作为一个文件,什么时候在系统上算真正的删除呢?是不是要在整个系统里,没有任何文件名字符串和我这个文件inode的有映射关系时,也就是这个文件没有名字了,这个时候对应的文件就应该被删除了,可是我们怎么知道有多少个文件名通过ionde编号,来和我对应的文件的inode来产生关系呢?答案是在我们inode中,存在一个引用计数的东西,int ret_count,也就是说,今天在一个特定的目录下有一个文件名映射的inode是该文件,ret_count就会++,再有一个文件名和这个文件inode有映射关系,再++,所以我们对应的这个数字,称之为inode本身的引用计数,被称之为硬链接数!!!

e.如果我们对目标文件进行删除会怎么样?

对目标文件进行删除,硬链接还在,里面的内容还能打印出来,这个文件并没有被删除,所以这个删除做了一个什么工作?对目标文件进行重命名的工作,所有平时建立一个普通文件本质上都在不断进行建立硬链接,建立一个文件,本质就是硬链接文件,因为你的文件名和你的inode映射关系就相当于一份,所以删除,目标文件就减少一份,再把剩余的硬链接删除掉,引用计数变为0,文件系统中就会把你对应的这个inode直接删掉了。

删除目标文件,软链接就会变红,因为软链接文件中存的是目标文件的路径,目标文件找不到,软连接也就找不到了。

总结:

其实软链接说到底,其实就相当于,软链接就是一个普通文件,他的内容保存的是目标文件的路径,所以目标文件删除了变成红色,是因为这个软链接文件保存的目标文件的路径没有了,找不到了,而所谓的硬链接就相当于在当前目录下保存一下文件名和inode的映射关系,没有创建新的文件。

三.为什么要有软硬链接呢?各种应用场景

软链接:

 a.如果我们创建一个可执行程序code.exe,在命令行上要执行该文件是  ./code.exe 如果我们想要  ./code  就直接可以执行,我们该怎么办?

之前说过,可以把当前路径增加到环境变量或者把可执行文件拷贝到系统默认路径下,就可以不带  ./  直接执行。

现在我们学了软链接,就可以在当前路径下直接创建软链接:
ln -s code.exe code

这样就创建了一个软链接,就直接可以  ./code  直接执行该可执行程序。

如果想不加  ./  呢?

可以在 /usr/bin/ 路径下建立软链接,/usr/bin/ 是系统存放可执行文件的默认路径,这样就直接进行code就可以执行,创建快捷方式,直接建立软链接,就可以指向目标程序了。

删除一个软链接文件:一个rm  一个unlink

b.如果可以执行程序藏在一个比较深的路径下,比如 ./dir1/dir2/dir3/ 里,我们要在当前所处的路径使用可执行程序,就必须带一串路径,所以我们可以在当前路径下创建软链接。

c.我们也可以给一个目录形成一个软链接,比如  /usr/inlude/  我想查看头文件,就可以给这个目录创建一个软链接。

d.软链接就是为了快速定位文件,以最简单的方式进入!!!

e.作用:快捷方式

   最主要用途:快速找到指令,快速找到对应的库

 硬链接:

 a.在一个目录里创建一个普通文件和一个目录,普通文件的引用计数是1,是因为在当前目录中只有一个文件名与该inode有映射关系,那为什么新建一个目录,他的引用计数是2呢?进入这个目录中,再新建一个目录,引用计数为什么变成3了呢?

因为在目录里面有一个  .  文件和  ..  文件,之前说过,一个点表示当前目录,两个点表示上级目录,那么一个点凭什么表示当前目录他自己,一个点他是一个文件名,他所映射的inode和当前所处的目录的映射的inode是一样的!!文件名不同但指向的文件是一样的,所以一个点就表示当前工作路径,所以再在新建的目录中创建一个新目录,里面有两个点的文件名,他映射的inode与上级目录映射的inode相同,所以此时就有三个文件名指向同一个文件,所以,引用计数是3,所以我们在Linux中,在每一个目录下都要有一个  .  和  ..  呢?就是为了进行路径切换!!!

b.创建一个文件,在一个目录比如 /tmp/ 下,给这个文件创建一个硬链接,这时,如果误操作,把原本文件进行了删除,但是没关系,因为我们在特定的路径下,有一个该文件的硬链接文件,我们照样可以通过该硬链接文件拿到该文件的内容,这意味着什么?这意味着,在Linux下,对文件做备份,只需要建立硬链接文件就可以了,不需要拷贝了!!! 

c.我们现在可以对普通文件做硬链接,那么我们可不可以对目录进行建立硬链接呢?

Linux中,不允许对目录新建硬链接文件,因为主要怕,新建硬链接形成一些环状路径,进而导致系统出现问题,但是目录里面  .  和 ..  不都是当前目录和上级目录的硬链接文件吗?这该怎么理解呢?不怎么理解,因为这是Linux特殊进行处理的!!! 

目录创建硬链接形成环状路径的危害

  • 文件系统遍历异常:文件系统的遍历算法通常是基于树形结构进行的,假设可以对目录创建硬链接形成环状路径,当系统或应用程序尝试遍历目录树时,就可能陷入无限循环,无法正常完成遍历操作,导致程序挂起甚至系统崩溃。
  • 元数据更新混乱:目录的硬链接会使得目录的元数据(如目录的链接数、修改时间等)管理变得极为复杂且容易出现混乱。例如,当通过一个硬链接对目录进行修改时,很难确定应该如何正确更新其他硬链接所指向的同一目录的元数据,可能导致文件系统的元数据不一致,进而影响文件系统的稳定性和可靠性。
  • 权限管理复杂:在 Linux 中,权限是基于文件和目录的 inode 进行管理的。如果存在目录硬链接形成的环状结构,权限的继承和传播会变得非常复杂,可能导致权限漏洞或错误的权限设置,威胁系统安全。

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

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

相关文章

第三十六章 Spring之假如让你来写MVC——拦截器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…

快速上手 HarmonyOS 应用开发

一、DevEco Studio 安装与配置 1. DevEco Studio 简介 DevEco Studio 是 HarmonyOS 的一站式集成开发环境(IDE),提供了丰富的工具和功能,支持 HarmonyOS 应用开发的全流程。 2. DevEco Studio 下载与安装 下载地址&#xff1a…

Java Web开发进阶——错误处理与日志管理

错误处理和日志管理是任何生产环境中不可或缺的一部分。在 Spring Boot 中,合理的错误处理机制不仅能够提升用户体验,还能帮助开发者快速定位问题;而有效的日志管理能够帮助团队监控应用运行状态,及时发现和解决问题。 1. 常见错误…

图解Git——分支的新建与合并《Pro Git》

⭐分支的新建与合并 先引入一个实际开发的工作流: 开发某个网站。为实现某个新的需求,创建一个分支。在这个分支上开展工作。 正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补。你将按照如下方式来处理: 切换到你…

【数据可视化-12】数据分析岗位招聘分析

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

excel仅复制可见单元格,仅复制筛选后内容

背景 我们经常需要将内容分给不同的人,做完后需要合并 遇到情况如下 那是因为直接选择了整列,当然不可以了。 下面提供几种方法,应该都可以 直接选中要复制区域然后复制,不要选中最上面的列alt;选中可见单元格正常复制&#xff…

支持向量回归(SVR:Support Vector Regression)用于A股数据分析、预测

简单说明 支持向量回归是一种用来做预测的数学方法,属于「机器学习」的一种。 它的目标是找到一条「最合适的线」,能够大致描述数据点的趋势,并允许数据点离这条线有一定的误差(不要求所有点都完全落在这条线上)。 可以把它想象成:找到一条「宽带」或「隧道」,大部分…

LabVIEW水位监控系统

LabVIEW开发智能水位监控系统通过集成先进的传感技术与控制算法,为工业液体存储提供精确的水位调控,保证了生产过程的连续性与安全性。 项目背景 在化工和饮料生产等行业中,水位控制的准确性对保证生产安全和提高产品质量至关重要。传统的水…

深入浅出 Android AES 加密解密:从理论到实战

深入浅出 Android AES 加密解密:从理论到实战 在现代移动应用中,数据安全是不可忽视的一环。无论是用户隐私保护,还是敏感信息的存储与传输,加密技术都扮演着重要角色。本文将以 AES(Advanced Encryption Standard&am…

React Fiber框架中的Render渲染阶段——workLoop(performUnitOfWork【beginWork与completeWork】)

触发渲染过程——renderRoot renderRoot 是一个函数,用于触发渲染工作。它通常会调用并递归地执行一系列的渲染任务,直到完成整个更新过程。这个过程包括执行 Fiber 树中的 beginWork 和 completeWork,以及渲染新状态或 DOM。 function ren…

【优先算法】思还故里闾,欲归道无因 - 前缀和

本篇博客给大家带来的是前缀和算法的知识点, 也是一样通过OJ题理解,掌握,应用该算法. 🐎文章专栏: 算法 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&…

亿道三防丨三防笔记本是什么意思?和普通笔记本的优势在哪里?

三防笔记本是什么意思?和普通笔记本的优势在哪里? 在现代社会中,笔记本电脑已经成为人们工作和生活中不可或缺的一部分。然而,在一些特殊行业或环境中,普通笔记本电脑由于其脆弱性和对环境条件的敏感性,往…

SOME/IP 协议详解——服务发现

文章目录 1. Introduction (引言)2. SOME/IP Service Discovery (SOME/IP-SD)2.1 General(概述)2.2 SOME/IP-SD Message Format2.2.1 通用要求2.2.2 SOME/IP-SD Header2.2.3 Entry Format2.2.4 Options Format2.2.4.1 配置选项(Co…

Go语言之路————go环境的初始化

Go语言之路————go环境的初始化 前言一、Go的安装二、环境配置三、初始化一个新项目四、常用的一些指令 前言 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go,到后面能正…

鸿蒙UI开发——基于onTouch事件实现表情选择胶囊

1、背 景 有朋友留言说,抖音APP中,长按评论按钮触发的快捷表情选择胶囊动画比较好(效果如下图),希望使用鸿蒙ArkTs也实现一个类似的。 本文在鸿蒙ArkTs下也实现一个类似的效果,如下: 首先&…

Node.js——http 模块(二)

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

研华 PCI-1751 驱动更新导LabVIEW致程序异常

问题描述: 某 LabVIEW 程序长期运行正常,但在使用研华 PCI-1751 数据采集卡运行一段时间后,程序开始出现不正常的行为。具体过程如下: 初始问题: 更换新的 PCI-1751 板卡后,驱动程序被更新,但程…

接上篇基于Alertmanager 配置钉钉告警

Alertmanager 是一个用于处理和管理 Prometheus 警报的开源工具。它负责接收来自 Prometheus 服务器的警报,进行去重、分组、静默、抑制等操作,并通过电子邮件、PagerDuty、Slack 等多种渠道发送通知。 主要功能 去重:合并相同或相似的警报&…

网络原理(三)—— 传输层 之 UDP 和 TCP协议

传输层 在传输层两大关键的协议就是UDP和TCP协议了,除此之外,还有别的传输层协议,本文章将介绍UDP和TCP协议,重点介绍TCP协议。 首先回顾TCP和UDP 的特点: UDP:不可靠传输,面向数据包&#xf…

针对服务器磁盘爆满,MySql数据库始终无法启动,怎么解决

(点击即可进入聊天助手) 很多站长在运营网站的过程当中都会遇到一个问题,就是网站突然无法打开,数据一直无法启动 无论是强制重启还是,删除网站内的所有应用,数据库一直无法启动 这个时候,就需要常见的运维手段了,需要对服务器后台各个资源,进行逐一排查…