Linux:软硬链接的概念与应用

news2025/4/12 4:36:43

文章目录

  • 软链接和硬链接
  • 软链接的应用场景
  • 硬链接的应用场景
  • 当前目录和上级目录
    • 软硬链接目录和文件的问题
  • 总结

本篇要探讨的主题是关于软硬链接的概念

在Linux系统链接文件中有两种,一种是硬链接,一种是软链接,那么本篇就基于上述的两种链接方式来进行一定的总结和拓展

软链接和硬链接

假设现在我创建了这样的一个文件test.c,然后我执行了这样的指令

ln -s test.c newtest.c

这就是一层软链接,这样就建立起来了一个newtest.c,它链接到了test.c

那这是什么意思呢?这个软链接有什么用呢?

先观察一下属性:

在这里插入图片描述
从中可以发现,这两个文件的inode值不一样,并且链接好的这个文件有一个指向表明它是链接到这个test.c

再看硬链接的操作:

ln test.c hardtest.c

在这里插入图片描述

这里看出,这两个文件的inode值居然是一样的,并且还有一个数字从1变成了2,这是什么呢?有什么意义和价值呢?该如何理解呢?后面来介绍

首先可以得到一个初步结论

软链接提供的是一个独立的文件,而硬链接并不是一个独立的文件,原因是软链接有自己独立的编号,但是硬链接没有,所以从直白的角度来说就是这样的区别

第二个结论是,软链接其实可以类比成是一种快捷方式,为什么要有快捷方式?

其实原因就在这个字面意思上,因为快捷,在Windows系统中,想要调用一个文件有很多种方式,其中一个方式就是在桌面上调用它的快捷方式,还有一种方式是找到它的绝对路径下访问它的exe文件,很明显对于大部分使用场景来说,直接在桌面调用它的快捷方式是一种很便携的方式,而这里的软链接也是如此,我们假设现在的场景

软链接的应用场景

现在有一个test.c,里面存放了一些源代码,并且现在把他编译形成了一个可执行程序,如果我想正常运行它,就必须要找到它所在的绝对路径,然后运行它,这是没问题的,下面是对应的操作

[test@VM-16-11-centos Symbolic and Hard Link]$ ll
total 4
-rw-rw-r-- 1 test test 77 Jan 18 10:35 test.c
[test@VM-16-11-centos Symbolic and Hard Link]$ gcc -o test.exe test.c
[test@VM-16-11-centos Symbolic and Hard Link]$ ./test.exe
hello world

但是缺点也很明显,我想要运行这个文件,必须要在Symbolic and Hard Link这个文件夹下进行运行,如果我不想在这里运行,我想去别的地方也能轻松的访问到可以吗?这就需要借助软链接的帮助了

test@VM-16-11-centos linux-system-and-network]$ ln -s ./Symbolic\ and\ Hard\ Link/test.exe softtest
[test@VM-16-11-centos linux-system-and-network]$ ll
total 28
drwxrwxr-x  4 test test 4096 Dec  7 21:12 File
drwxrwxr-x  3 test test 4096 Nov 16 18:25 Mybash
drwxrwxr-x  2 test test 4096 Dec  7 21:13 my_c_lib
drwxrwxr-x 11 test test 4096 Dec  7 21:06 Process
-rw-rw-r--  1 test test  107 Dec  7 21:08 README.en.md
-rw-rw-r--  1 test test   89 Dec  7 21:08 README.md
lrwxrwxrwx  1 test test   33 Jan 18 10:44 softtest -> ./Symbolic and Hard Link/test.exe
drwxrwxr-x  2 test test 4096 Jan 18 10:36 Symbolic and Hard Link
[test@VM-16-11-centos linux-system-and-network]$ ./softtest 
hello world

此时达成的效果其实与创建了一个快捷方式基本一样,软链接的主要运用场景就在于快速定位文件信息

那么工作的原理是什么呢?由前面的例子可以有初步的理解是,软链接有一个独立的inode编号,这也就意味着在创建软链接的时候会在文件系统中做出修改,会修改文件系统中位图和数据块等等的信息,而软链接出来的文件也是文件,既然是文件就必然会有内容和属性,那么就分别进行讨论文件中到底放的是什么东西?

内容:既然是软链接,那软链接内部的内容就是指向的目标文件的路径,换句话说可以认为,软链接文件的内容中保存的是目标文件
属性:和普通文件基本一致

硬链接的应用场景

关于硬链接,可以从它和软链接的区别入手,一个很明显的区别就是,硬链接不是一个独立的文件,它的inode编号和原来的文件是相同的。这意味着硬链接和目标文件从inode获取的编号是一样的,也就意味着访问的会是同一个文件的属性和同一个属性的内容,在前面的知识中提到过,文件名其实并不是文件的属性,文件名只是在目录的数据块中会和文件的inode编号建立一个映射关系,也就是说inode和文件名是分开存储的,也就是说硬链接产生的文件其实就是新建了一层映射关系,只不过这个inode的映射关系建立的是一个前面的已经存在的inode,只是新增了一个映射关系

最后要谈到的一点是这个数字的问题


这个数字到底是什么呢?现在也不陌生了,这个数字其实就是硬链接数,这个有多少个映射关系指向这个inode,那么这个硬链接数也会随之而发生变化,从中得出的结论是,如果这个文件被删除了,但是它还有其他的硬链接数,那么它实际上被删除了吗?其实是没有的,那么什么情况下才是真正被删除了呢???

答案是,没有inode和它本身进行映射,也就意味着用户已经不需要这个inode了,在用户关心的这些文件中已经没有任何一个文件指向这个inode编号,那么不就意味着这个文件被删除了吗,而删文件在操作系统层面上就是删位图,把位图删除掉,就算是把这个文件清空了,那么在文件系统的层面上,它怎么知道有多少文件指向了我呢?文件该如何知道,自己在什么时候已经被用户所抛弃了,不再需要了呢?其实就是引出到了引用计数的概念,这个词也并不陌生,在前面的智能指针部分已经有了一个明确的概念,那么这里就不多进行阐述了,那么新增硬链接和删除硬链接本质上就是对这个inode的引用计数进行新增和删除,等到这个inode的引用计数变成0的时候,就意味着这个inode编号没有任何一个文件名和它建立联系,那么就算是真正意义上的删除了

文件名在目录中是唯一的,从某种意义来说,文件名就是一种指针,它指向了一个一个的inode,当文件名去掉一个指针,这个引用计数就减去1,而新增一个硬链接数,就相当于是有一个东西指向了这个inode编号,引用计数就加1

硬链接的本质就是相当于文件名和inode之间建立一层映射的关系,文件名相当于是一个指针,指向的是inode的编号,当我们需要访问的时候,就通过这个引用指针对这个文件进行新增或删除,删除的意义就是把这层文件名和inode编号之间的映射删除,并且同时对这个inode编号的引用计数减去1,当没有任何一个文件名指向它的时候,就表示要删除了,就把它在位图中进行合适的修改即可

当前目录和上级目录

有了这些基础知识,那么就可以根据这些知识解释一些现象了:

在这里插入图片描述
新建一个文件夹,它的硬链接数是2?为什么呢?

在这里插入图片描述
原因是有两个文件名指向这个inode,一个是上级目录,一个是当前目录,所以在这个目录中:

在这里插入图片描述
所以这个目录下就存在一个叫做当前目录的文件,它指向的就是这个inode,而它本身也会指向一个inode,所以就有两层映射关系

在这个目录下再新建一个目录,引用计数变成3了,这是为什么呢?

在这里插入图片描述

这就是上级目录的功劳了!在原来的基础上又多了一个上级目录指向了这个文件,自然引用计数就再加1了
在这里插入图片描述
从这个例子中也能看出来,为什么在调用cd ..这个命令的时候可以回到上级目录?凭什么?凭的就是上级目录中存储的是上级目录的inode,我借助这个inode就是能进入这个目录下进行访问

软硬链接目录和文件的问题

软链接可以链接目录,但是硬链接不可以链接目录,为什么?

原因在于,在Linux的文件系统中,是一个类似于树形结构,如果为某个目录新增了一个硬链接,那么当需要进行查找的时候就会遇到诸如环状路径的问题,导致查找失败,这是不被允许的,因此在Linux中,除了系统自定义的当前目录和上级目录这两个硬链接外,其余情况下一般是不允许创建目录的硬链接

总结

自此,就解决了软硬链接的问题,硬链接本身就是这样来进行路径的切换,用户用硬链接来构建Linux的整个路径结构,方便进行路径的回退,这就是硬链接的意义

那软硬链接的区别是什么?区别之一就是软链接是一个真正的文件名,有自己的文件名和inode,文件内部的内容存储的是目标文件,但是不能对于目录进行软链接

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

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

相关文章

IDEA的database使用

一、数据据库 在使用database之前,首先你的电脑要安装好了数据库并且启动。 MySQL卸载手册 链接:https://pan.baidu.com/doc/share/AVXW5SG6T76puBOWnPegmw-602323264797863 提取码:hlgf MySQL安装图解 链接:https://pan.baidu.…

2024年,给程序员的六点建议

作为程序员,持续进步和发展是至关重要的。除了技术能力的提升,还有一些关键的行为和思维方式可以帮助工程师在职业生涯中取得更大的成功。本文将提供六个重要的建议,这些建议将帮助程序员在职业生涯中迈出成功的步伐。 走出舒适区 走出舒适区…

IEEE-2024年第五届人工智能、机器人及控制国际会议(AIRC 2024)

IEEE--2024年第五届人工智能、机器人及控制国际会议(AIRC 2024) 会议时间: 2024年4月22-24日 会议地点: 埃及开罗 埃及英国大学 会议网址:AIRC 2024 | Artificial Intelligence, Robotics and Controlhttps://www.airc.org/ 埃及开罗 埃及英国大学 会议组织单位: 征…

关于安装Dubbo+zookeeper过程中遇到的许多问题

在学习dubbozookeeper时安装启动dubbo-admin出现的一些问题: 首先我是跟着狂神安装zookeeper,基本下来没什么问题。然后就是安装dubbo-admin,狂神安装的是dubbo-admin-master,但是现在github上已经没有这个版本了,只能…

[小程序]Http网络请求

一、数据请求限制 出于安全性(bushi)考虑,小程序请求的数据接口必须具备以下两个条件: ①只能请求Https类型 ②必须将接口域名添加到信任列表中 1.配置request合法域名 配置步骤如下:小程序管理后台->开发->开发设置->服务器域名-&g…

“揭秘Maven:如何成为大数据项目的管理能手?“

介绍:Maven是一个项目管理和构建自动化工具,广泛应用于Java项目中。具体来说:项目对象模型(POM):Maven通过一个名为POM的模型来描述项目信息,包括项目的坐标、依赖关系、插件目标等。这个模型通…

从零开始的OpenGL光栅化渲染器构建5-阴影

前言 阴影是光线被阻挡的结果;当一个光源的光线由于其他物体的阻挡不能够达到一个物体的表面的时候,那么这个物体就在阴影中了。阴影能够使场景看起来真实得多,并且可以让观察者获得物体之间的空间位置关系。 直接阴影 阴影映射(Shadow Ma…

【转载】java面试题

java面试题大全 何为进程?何为线程?JVM拓展为什么程序计数器、虚拟机栈和本地方法栈是线程私有的呢?为什么堆和方法区是线程共享的呢虚拟机栈和本地方法栈为什么是私有的?一句话简单了解堆和方法区单核 CPU 上运行多个线程效率一定会高吗?创建线程有哪…

贝锐蒲公英云AP体验:云端快速部署、远程管理,轻松满足办公环境

公司原本的网络由于采用多个路由器,导致无线信号杂乱,管理不便,且远程办公体验较差,作为IT负责人的我,一直想寻找一个可以实现网络统一管理并有效提升远程工作便捷性的产品。 于是,我决定在公司内部部署贝…

使 a === 1 a === 2 a === 3 为 true 的几种“下毒“方法

前言 这算得上是近些年的前端网红题了,曾经对这种网红题非常抵触,认为非常没有意义。 看到了不少人有做分享,有各种各样的方案,有涉及到 JS 非常基础的知识点,也不得不感叹解题者的脑洞之大。 但是,拿来…

30、WEB攻防——通用漏洞SQL注入CTF二次堆叠DNS带外

文章目录 堆叠注入二次注入DNS注入 堆叠注入 堆叠注入:根据数据库类型决定是否支持多条语句执行,用分号隔开。堆叠注入在代码中被执行是一方面,是否被执行成功又是另一方面。支持数据库类型:Mysql、Mssql等。 在mysql中&#xf…

react 页签(自行封装)

思路:封装一个页签组件,包裹页面组件,页面渲染之后把数据缓存到全局状态实现页面缓存。 浏览本博客之前先看一下我的博客实现的功能是否满足需求,实现功能: - 页面缓存 - 关闭当前页 - 鼠标右键>关闭当前 - 鼠标右…

【rust/bevy】使用points构造ConvexMesh

目录 说在前面问题提出Rapier具体实现参考 说在前面 操作系统:win11rust版本:rustc 1.77.0-nightlybevy版本:0.12github:这里 问题提出 在three.js中,可以通过使用ConvexGeometry从给定的三维点集合生成凸包(Convex Hu…

【软考中级-软件设计师】day9:进程资源图、信号量PV操作、死锁和银行家算法

大纲 概述 进程的组成和状态 前趋图 进程资源图 真题 同步与互斥 信号量 生产者和消费者 真题 死锁 线程

【C++第二课 - 类和对象上 - 入门知识】struct类、class类、访问限定符、this指针

目录 面向过程与面向对象初步认识类的定义struct定义类class定义类 类的访问限定符及封装访问限定符 声明与定义分离this指针类成员的命名问题this 类的实例化类的对象大小的计算成员函数为何不在对象里面类对象大小计算 面向过程与面向对象初步认识 C语言是面向过程的&#x…

基于Elasticsearch+Logstash+Kibana+Filebeat的日志收集分析及可视化

sudo rm /var/lib/dpkg/lock* sudo dpkg --configure -a apt update tail -f /var/log/car.log 1.1、项目概述 海量的业务应用,也带来了海量的日志数据,给业务应用的运维带来了新的挑战。例如,我们常用的网约车应用,单个平台…

六、数组(1)二维数组

一、二维数组定义方式 1、数据类型 数组名[行数][列数]; 2、数据类型 数组名[行数][列数]{{数据1,数据2},{数据3,数据4}}; 3、数据类型 数组名[行数][列数]{数据1,数据2,数据3,数据4}; 4、数据类型 数组名[][列数]{数据1,数据2,数据3,数据4}; 注:第二种定义方式更…

S32K3系列 --- 硬件I2C Mcal配置

前言 网上看到很多I2C的教程,基本都是模拟I2C,现在S32K3的芯片支持硬件I2C,我想着就配一个硬件的出来吧,这边记录一下,供大家学习。 一、I2C原理 这里主要教大家如何去配置,去使用。 原理的话可以参考这篇文章: 一文搞懂I2C通信总线_i2c通信的详细讲解-CSDN博客 I2…

生信人 RNA-seq

RNA-seq:6-qc-2 #先跑一个综合的 Multiqc 报告 #将fastqc生成的多个报告整合成一个报告,方便查看所有测序数据的质量。 conda install multiqc -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda cd /home/yinwen/RNA-seq_report/ mult…

【算法与数据结构】474、LeetCode一和零

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题要找strs数组的最大子集,这个子集最多含有 m m m个0和 n n n个1。本题也可以抽象成一个…