【Linux】第二十六站:软硬链接
文章目录
- 一、软链接
- 二、硬链接
- 三、ln命令
- 四、该如何理解硬链接?
- 五、如何理解软链接
- 六、为什么要用软硬链接
- 1.软链接的应用场景
- 2.硬链接的应用场景
一、软链接
如下所示,我们创建一个文件以后,然后执行下面的指令
ln -s file.txt soft-link

这时候我们看见了一个soft-link的文件,这个文件指向file.txt。这就是一个软连接
如果我们去查看inode,我们可以看到是两个inode,说明是两个不同的文件,因为一个文件一个inode

所以软连接是一个独立的文件,因为具有独立的inode
二、硬链接
如果我们直接这样做
ln test.txt hard-link

我们发现产生了一共hard-link文件,并且它和test.txt的第二个属性变为了2
也就是说这个数字其实叫做硬链接数
如果我们再去查看他们的inode

我们会发现hard-link与test.txt的inode居然是一样的
所以,硬链接不是一个独立的文件,因为他没有独立的inode
三、ln命令
ln命令是链接命令,它如果带上-s选项代表是软连接,如果不带就是硬链接。
无论如何都是由后者指向前者
ln -s file.txt soft-link //软链接
ln test.txt hard-link //硬链接
四、该如何理解硬链接?
如下图所示

因为我们一开始是先创建的test.txt,所以这个会献给test.txt分配一个inode
然后我们使用了硬链接,我们发现,出现了一共hard-link的文件,并且这两个文件的inode是一样的,这就说明了,他们的文件属性,文件内容一定是一样的
通过这里我们也可以再次印证,文件名并不在inode中存储,否则这两个文件名是一样的
所以我们建立一个硬链接,这个硬链接做了什么么?
所谓的建立硬链接,本质其实就是在特定目录的数据块中新增,文件名和指向的文件inode编号的映射关系!!
也就是说,像我们上面的例子中,就是在test_2023_12_03这个目录文件中,对应的数据块上写上一个文件名和inode的对应关系。
这样的话,假如我们将test.txt文件给删掉了,其实这个文件本质上还是存在的,因为inode为61的这个文件还是存在着的。不过引用计数由2变为1了

所以上面的工作,我们成功的完成了一次取别名(因为inode在,这个文件就还在)
任意一共文件,无论是目录,还是普通文件,都有inode
每一个inode内部,都有一个叫做引用计数的计数器
目录里面保存的是文件名:inode编号的映射关系。
文件名1:inode1234
文件名2:inode1234
文件名3:inode1234
文件名4:inode1234
所以我们可以用不同的文件名映射同一个inode,所以因为inode本身的缘故,我们可以间接的认为每一个文件名都指向同一个文件
而这个就是我们以前类似的指针
所以这个引用计数表示的就是,有多少个文件名指向该文件
所以删除一个文件就是让引用计数减减,然后删除掉这个映射关系。
只有当减到0的时候,才会真正的删除掉这个inode文件
所以刚刚这个文件就没有被删除
所以我们建立的大多数普通文件他的硬连接数都是1。因为默认建立的文件只有一个文件名与inode对应。所以我们删除时候会直接删除到0,进而删除掉这个文件
五、如何理解软链接
我们知道,在我们前面使用软链接以后,他的引用计数没有发生变化

并且软连接的文件和原来的文件有不同的inode,所以他们是不同的文件
所以这里就告诉了我们一个事实:我们的软连接是一个独立的文件,且不影响目标文件的引用计数
那么我们如何理解软链接呢?
由于软链接具有独立的inode和数据块,所以我们可以将这个软连接想象成一个独立的文件,该文件有自己的属性。
并且这个软连接文件里面放着的是所指向文件的路径
所以软链接是一个独立的文件,有独立的inode,也有独立的数据块,他的数据块里面保存的是指向的文件的路径
所以对于这个软链接,他可以有如下的场景
像file.txt中写入文件,但是我们可以用soft-link访问到对应的内容

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

其实这个软链接特别像windows中的快捷方式
删除这个软连接文件我们除了使用rm的方式,也可以使用unlink的方式
六、为什么要用软硬链接
1.软链接的应用场景
当我们写了一个.c程序以后

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

如果我们要执行这个可执行程序,必须按照路径依次往里找
这对于客户来说太麻烦了
所以我们就可以形成一个软链接文件

这样的话就可以直接运行这个程序了
所以我们就会发现在/lib64/这个目录下,存在着大量的软链接

所以未来我们可以直接在下面的路径下建立一个可执行程序
sudo ln -s 可执行程序路径 /usr/bin/my.exe
如下所示

所以未来我们要装软件的话,我们可以随意装,只需要在/usr/bin路径下安装一个软链接即可。
2.硬链接的应用场景
当我们建立一个普通文件的时候,它的硬链接数是1

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

这是为什么呢?
首先这个dir它自己本身就有一组映射关系,所以这里已经有1了
但是当我们进入这个文件的时候,我们知道它有两个隐藏文件
我们会发现这个点也叫60,所以这个叫做当前目录

现在我们就理解了什么叫做当前目录了,因为这个点就是dir的一个硬链接
而两个点表示这个上级路径
我们也可以注意到,这里确实是一个硬链接

所以我们就理解了,为什么cd …会进入到上级目录了,因为这就是一个硬链接
当我们向这个dir文件里面继续创建了一个目录以后,我们会发现这个引用计数变为了3

如下所示
就是因为存在这样一个点点目录

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

我们也就知道了,当前我们系统的有效的目录是16个
所以在我们的系统中硬链接必须存在,虽然它很少用,但是它要维持linux的目录结构
所以硬链接通常用于路径定位,采用硬链接,可以进行目录间切换
但是我们要注意,硬链接不允许对目录来进行定义,但是可以软链接
那么Linux系统不允许对目录建立硬链接,这是为什么呢?
如下图所示,这是一个Linux的一个目录,假设第一个是一个根目录,然后有一天我们在第三层的第一个文件中建立了一个硬链接,那么此时造成了闭环。
未来当我使用find / -name test.c命令的时候,会进入到环里面。
所以硬链接给目录很容易产生环路问题,引发系统级别的bug
那么我们可能会好奇目录内部有点和点点这个不是目录的硬链接吗?
这其实是因为系统不相信我们,只相信自己,系统自己不会产生环路问题。
可是我们又会好奇,那既然系统自带点和点点,那在搜索时候不是已经自带环路问题了吗?
其实这是因为系统在搜索时默认不会搜索这两个文件
相关文章:
【Linux】第二十六站:软硬链接
文章目录 一、软链接二、硬链接三、ln命令四、该如何理解硬链接?五、如何理解软链接六、为什么要用软硬链接1.软链接的应用场景2.硬链接的应用场景 一、软链接 如下所示,我们创建一个文件以后,然后执行下面的指令 ln -s file.txt soft-link…...
开源播放器GSYVideoPlayer + ViewPager2 源码解析
开源播放器GSYVideoPlayer ViewPager2 源码解析 前言一、GSYVideoPlayer🔥🔥🔥是什么?二、源码解析1.ViewPager2Activity 总结 前言 本文介绍GSYVideoPlayer源码中关于ViewPager2 GSYVideoPlayer 实现的滑动播放列表的实现原理。…...
重启路由器可以解决N多问题?
为什么重启始终是路由器问题的首要解决方案? 在日常的工作学习工作中,不起眼的路由器是一种相对简单的设备,但这仍然是我们谈论的计算机。 这种廉价的塑料外壳装有 CPU、随机存取存储器 (RAM)、只读存储器 (ROM) 和许多其他组件。 该硬件运行预装的软件(或固件)来管理连接…...
Python WebSocket 客户端教程
WebSocket 是一种在客户端和服务器之间实现双向通信的协议,常用于实时聊天、实时数据更新等场景。Python 提供了许多库来实现 WebSocket 客户端,本教程将介绍如何使用 Python 构建 WebSocket 客户端。 什么是 WebSocket WebSocket 是一种基于 TCP 协议…...
洛谷 P2984 [USACO10FEB] Chocolate Giving S
文章目录 [USACO10FEB] Chocolate Giving S题面翻译题目描述输入格式输出格式 题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 题意解析CODE给点思考 [USACO10FEB] Chocolate Giving S 题面翻译 题目链接:https://www.luogu.com.cn/problem/P2984 题目描…...
【专题】【数列极限】
【整体思路】 【常用不等式】...
oracle基础系统学习文章目录
oracle基础系统学习——点击标题可跳转对应文章 01.CentOS7静默安装oracle11g 02.Oracle的启动过程 03.从简单的sql开始 04.Oracle的体系架构 05.Oracle数据库对象 06.Oracle数据备份与恢复 07.用户和权限管理 08.Oracle的表 09.Oracle表的分区 10.Oracle的同义词与序列 11.Or…...
长度最小的子数组(Java详解)
目录 题目描述 题解 思路分析 暴力枚举代码 滑动窗口代码 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条…...
计算机组成学习-数据的表示和运算总结
复习本章时,思考以下问题: 1)在计算机中,为什么要采用二进制来表示数据?2)计算机在字长足够的情况下能够精确地表示每个数吗?若不能,请举例说明。3)字长相同的情况下,浮点数和定点数的表示范围…...
目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】机器视觉(基础篇)(八)
目录 前言 知识储备 机器视觉学习路线 视觉算法流程...
【4】基于多设计模式下的同步异步日志系统-框架设计
7. 日志系统框架设计 本项⽬实现的是⼀个多日志器日志系统,主要实现的功能是让程序员能够轻松的将程序运行日志信息落地到指定的位置,且⽀持同步与异步两种方式的日志落地方式。 项目的框架设计将项目分为以下几个模块来实现。 日志等级模块 日志等级模…...
Jupyter Markdown 插入图片
首先截图 注意 这一步是关键的!! 它需要使用电脑自带的截图,用qq啊vx啊美图秀秀那些都不行哦。 截图之后复制: 然后快捷键粘贴到jupyter里面,它会生成一段代码(没有代码就是说截图形式不对)&a…...
web自动化 -- pyppeteer
由于Selenium流行已久,现在稍微有点反爬的网站都会对selenium和webdriver进行识别,网站只需要在前端js添加一下判断脚本,很容易就可以判断出是真人访问还是webdriver。虽然也可以通过中间代理的方式进行js注入屏蔽webdriver检测,但…...
Java 数组另类用法(字符来当数组下标使用)
一、原因 看力扣的时候发现有位大佬使用字符来当数组下标使用。 class Solution {public int lengthOfLongestSubstring(String s) {int result 0;int[] hash new int[130];int i 0;for(int j 0; j < s.length(); j) {while(hash[s.charAt(j)] > 0) {hash[s.charAt…...
error转string
1 概述 在golang中,error类型是非常常见的一种数据类型。在开发过程中,经常会遇到需要将error类型转换成string类型的情况。本文主要介绍几种常见的golang error转string的方法。 2 使用Error()函数 在golang中,Error()函数是error类型的一…...
Android监听用户的截屏、投屏、录屏行为
Android监听用户的截屏、投屏、录屏行为 一.截屏 方案一:使用系统广播监听截屏操作 从Android Q(10.0)开始,Intent.ACTION_SCREEN_CAPTURED_CHANGED字段不再被支持。这是因为Google在安卓10 中引入了一个新的隐私限制&#…...
MATLAB算法实战应用案例精讲-【路径规划】 图搜索算法
目录 前言 几个高频面试题目 运动规划、路径规划、轨迹规划对比 1. 运动规划 2. 路径规划VS轨迹规划...
Elasticsearch-Kibana使用教程
1.索引操作 1.1创建索引 PUT /employee {"settings": {"index": {"refresh_interval": "1s","number_of_shards": 1,"max_result_window": "10000","number_of_replicas": 0}},"mappi…...
mysql(八)docker版Mysql8.x设置大小写忽略
Mysql 5.7设置大小写忽略可以登录到Docker内部,修改/etc/my.cnf添加lower_case_table_names1,并重启docker使之忽略大小写。但MySQL8.0后不允许这样,官方文档记录: lower_case_table_names can only be configured when initializ…...
KALI LINUX攻击与渗透测试
预计更新 第一章 入门 1.1 什么是Kali Linux? 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 …...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
2024 年,高端封装市场规模为 80 亿美元,预计到 2030 年将超过 280 亿美元,2024-2030 年复合年增长率为 23%。 细分到各个终端市场,最大的高端性能封装市场是“电信和基础设施”,2024 年该市场创造了超过 67% 的收入。…...
性能优化中,多面体模型基本原理
1)多面体编译技术是一种基于多面体模型的程序分析和优化技术,它将程序 中的语句实例、访问关系、依赖关系和调度等信息映射到多维空间中的几何对 象,通过对这些几何对象进行几何操作和线性代数计算来进行程序的分析和优 化。 其中࿰…...

