重新认识Linux下的硬链接和软链接

文章目录

  • 前言
  • 1、软链接?
    • 1.1 工作原理
    • 1.2 特点
  • 2、硬链接
    • 2.1 工作原理
    • 2.2 特点
  • 3、 总结


前言

让自己永远保持一颗好奇心

今天无意间听别人提到了硬链接和软链接,起初我想这么基础的知识我肯定是知道的,毕竟大学接触Linux到现在工作了那么多年,这基础知识怎么会忘呢。

然后就回忆了下,发现自己好像只记得软链接是啥(因为工作中经常用到),但对于硬链接到底是个啥有啥特点,却怎么也想不起来,而且还搞不清楚硬链接和复制的区别是什么了。

刚开始我有点汗颜,觉得自己怎么连这个都不知道了,可转念一想,过去的了解也只是知道软链接和硬链接有什么特点,但是对于其背后的实现原理却无从得知。

所以从最开始自己就只是知其然,不知其所以然,随着时间的推移连最基本的特点都不记得了。

趁着这个机会,和大家一起简单的重新梳理下什么是软链接和硬链接。


1、软链接?

关于软链接是个啥?咱就想想自己桌面上的那个快捷方式就明白了。

1.1 工作原理

软链接是在文件系统中创建一个新的inode文件节点,这个节点保存了软链接所指向文件的路径
当访问软链接时,文件系统会读取该节点中的路径信息。 如果源文件被删除了,软链接指向的就是一个空的地址。

关于inode节点,大家可以理解为文件系统中用于存放文件信息的对象。

执行下方的指令,创建一个软链接

echo "Hello, World!" > original.txt# 创建软链接
ln -s original.txt symlink.txt# 查看 inode 信息
ls -li

示例输出

12345 -rw-r--r-- 1 user user 14 Nov  5 12:05 original.txt
12346 lrwxrwxrwx 1 user user 14 Nov  5 12:06 symlink.txt -> original.txt

如上所示, symlink.txt 与 original.txt 有不同的 inode。symlink.txt 的内容是指向 original.txt 的路径信息。

底层视角

Inode Table:
---------------------------------
| Inode Number | Link Count     |
| 12345      | 1 (original.txt) |
| 12346      | 1 (symlink.txt) |
---------------------------------Data Blocks:
---------------------------------
| Block Number | Data           |
| 567890       | "Hello, World!"|
| 567891       | "original.txt" |
---------------------------------

如上所示,大家可以看到 对于original.txt 而言它里面的内容是文件中对应的文本“Hello, World” ,而symlink.txt的inode节点实际指向的物理flash块中存放的是“original.txt” 这个软链接所指向文件的路径。

所以我们说软链接文件的大小实际上和其所指向文件的路径大小有关。

当系统识别到我们访问的文件是个软链接时,它将该文件对应的iNode节点中所保存的内容(路径信息读取出来),然后访问实际指向的文件。

如果源文件都没了,系统读取到了路径信息,也找不到原始文件,所以软链接所指向的原始文件被删除后所有的软链接就都失效了。

1.2 特点

独立文件:软链接是一个独立的文件,包含链接目标文件的路径信息。

跨文件系统:软链接可以跨越不同的文件系统,因为它只是存储了目标文件的路径。

循环链接:软链接可以指向其他软链接,从而可能产生循环链接现象。

大小:软链接的大小取决于它所链接的路径的长度。

断链风险:如果目标文件被删除,软链接会变成“断链”,指向一个不存在的文件。

2、硬链接

硬链接(Hard Link)和复制是不一样的,它和软链接的实际上很类似,都是为了让两个文件能够产生关系。例如一个地方修改了文件的内容,其他地方都能跟着同步。
我理解实际上硬链接在软链接的基础上,多了个只有删除所有硬链接的文件,原始文件才会删除的特性。以用来弥补软链接删除源文件所有的软链接都失效这个盲点。

2.1 工作原理

硬链接直接指向目标文件的节点(iode)。

在文件系统中iNode有一个链接计数,表示有多少个目录项指向它,当我们创建硬链接时,文件系统会增加节点的链接计数。当删除硬链接时,链接计数减少。当链接计数降为零时,文件才会真正被删除

执行下方的指令,创建一个硬链接

# 创建硬链接
ln target_file hardlink# 查看硬链接
ls -l

示例输出

$ ln original.txt hardlink.txt
$ ls -li
total 8
1441045 -rw-r--r-- 2 user user 40 Sep 29 12:34 hardlink.txt
1441045 -rw-r--r-- 2 user user 40 Sep 29 12:34 original.txt

如上所示硬链接时hardlink.txt 和 original.txt 指向的都是同一个iNode。

底层视角

Inode Table:
---------------------------------
| Inode Number | Link Count     |
| 1234567      | 2 (original.txt, hardlink.txt)   |
---------------------------------Data Blocks:
---------------------------------
| Block Number | Data           |
| 567890       | "Hello, World!"|
---------------------------------

和软链接相比,inode的数量没有发生变化,变化的是iNode的硬链接数。
因为指向的都是同一个inode,而同一个inode又指向同一个Data Block,所以自然而然硬链接的操作是同步的。

2.2 特点

共享文件节点:硬链接和目标文件共享同一个节点(inode)。也就是说,它们是文件系统中同一个对象的多个入口。

链接计数:每创建一个硬链接,文件的链接计数就会增加。当一个硬链接被删除时,链接计数减少,只有计数归零时文件数据才被删除。

节省空间:因为硬链接共享同一个 inode 和数据块,所以不会额外占用磁盘空间,只有 inode 信息会增加。

文件同步:更改任何硬链接或原始文件的内容,所有硬链接指向的内容都会同步变化,因为它们实际上是同一个文件。

限制:只能在同一个文件系统内创建,不能跨文件系统。

3、 总结

特性硬链接复制
文件节点共享是,共享同一个节点(inode)否,每个文件有独立的节点(inode)
磁盘空间使用节省空间,只有 inode 信息增加额外占用新的磁盘空间
文件数据同步是,共享内容,修改任意一个都同步否,独立文件,修改互不影响
链接计数增加,每个硬链接增加计数不增加,独立文件计数为1
跨文件系统否,只能在同一文件系统内是,支持跨文件系统

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

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

相关文章

前OpenAI首席技术官为新AI初创公司筹资;我国发布首个应用临床眼科大模型 “伏羲慧眼”|AI日报

文章推荐 2024人工智能报告.zip |一文迅速了解今年的AI界都发生了什么? 今日热点 据报道,前OpenAI首席技术官Mira Murati正在为一家新的AI初创公司筹集资金 据路透社报道,上个月宣布离职的OpenAI首席技术官Mira Murati正在为一…

栈和队列(一)

栈和队列的定义和特点 栈和队列是一种特殊的线性表,只能在表的端点进行操作 栈的定义和特点 这就是栈的结构,是一个特殊的线性表,只能在栈顶(或者说是表尾)进行操作。其中top为栈顶,base为栈底 栈s的存储…

华为:高级ACL 特定ip访问特定ip命令

网络拓扑图: 网络环境: 全网互通即可 1.创建一个名为test的高级ACL acl name test advance 2.添加规则 ##拒绝所有ip访问 rule 10 deny ip source any destination 192.168.1.10 0.0.0.0 只允许特定ip访问特定ip rule 5 permit ip source 192.168.2.10…

【Vulnhub靶场】Kioptrix Level 5

目标 本地IP:192.168.118.128 目标IP:192.168.118.0/24 信息收集 nmap探测存活主机,扫全端口,扫服务 首先探测到目标ip为:192.168.118.136 nmap -sP 192.168.118.0/24nmap -p- 192.168.118.136nmap -sV -A 192.168.…

BurpSuite渗透工具的简单使用

BurpSuite渗透工具 用Burp Suite修改请求 step1: 安装Burp Suite。官网链接:Burp Suite官网 step2: 设置代理 step3: 如果要拦截https请求,还需要在客户端安装证书 step4: 拦截到请求可以在Proxy ->…

【嵌入式实时操作系统开发】智能家居入门4(FreeRTOS、MQTT服务器、MQTT协议、STM32、微信小程序)

前面已经发了智能家居入门的1、2、3了,在实际开发中一般都会使用到实时操作系统,这里就以FreeRTOS为例子,使用标准库。记录由裸机转到实时操作系统所遇到的问题以及总体流程。相较于裸机,系统实时性强了很多,小程序下发…

opencv环境配置-适配b站阿童木的opencv教程

首先,opencv作为一个库文件,目的是为了让更多人不需要学习底层像素操作就能上手视觉技术,所以他适配很多环境,目前电脑端我知道的就可以适配C语言 C Python MCU端就是openmv跟他最类似,还有个k210 canmv 阿童木教的…

Unity 山水树木

本章节内容 1. Unity对3D游戏物体的简单操作; 2. 构建山水树木的场景 1. Unity 简易操作 1.1 新建3D游戏场景 1. 打开Unity Hub,点击 New Project (新建项目)按键,选择第二项 3D(Built-In Render Pipeline)&#xf…

Linux之实战命令41:lshw应用实例(七十五)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

虚拟滚动是怎么做性能优化的?

前言 一个简单的情景模拟(千万别被带入): A: 假设现在有 10 万条数据,你作为前端该怎么优化这种大数据的列表? B: 针对大数据列表一般不会依次性加载,会采用上拉加载、分页加载等…

如何用数据字典提升数据质量和决策效率?

在前面的文章中我们谈到过数据字典的概念,本文将继续探讨如何用数据字典提升数据质量和决策效率。 一、数据字典 数据字典:一种对数据的定义和描述的集合,它包含了数据的名称、类型、长度、取值范围、业务含义、数据来源等详细信息。 数据字…

Java中的一些名词概念

**函数式接口:** 概念&#xff1a;一个接口中的抽象方法只有一个&#xff0c;那么这个接口就是一个函数式接口。形参: 形参变量是**功能函数里的变量**&#xff0c;只有<u>在被调用的时候才分配内存单元</u>&#xff0c;<u>调用结束后立即释放</u>。…

AUTOSAR_EXP_ARAComAPI的6章笔记(2)

☞返回总目录 相关总结&#xff1a;AutoSar AP CM实例说明符的使用方法总结 6.2 实例说明符的使用方法 一、InstanceSpecifier 的概念 InstanceSpecifier 是在 [3] 中定义的一个核心概念&#xff0c;它由符合特定模型元素绝对路径的模型元素 shortName 组成&#xff0c;表现…

【10月最新】植物大战僵尸杂交版即将新增【植物】内容介绍预告(附最新版本下载链接)

新增植物 玉米旋转机 玉米旋转机是一种支持性植物&#xff0c;每4秒可散射6颗油炸玉米或黄油&#xff08;概率20%&#xff09;&#xff0c;油炸玉米经过火炬可变为爆米花&#xff0c;造成范围爆炸伤害。其价格为325&#xff0c;并在每种植一颗后&#xff0c;价格增加50。玉米旋…

Imagic: Text-Based Real Image Editing with Diffusion Models

https://openaccess.thecvf.com/content/CVPR2023/papers/Kawar_Imagic_Text-Based_Real_Image_Editing_With_Diffusion_Models_CVPR_2023_paper.pdfhttps://imagic-editing.github.io/ 问题引入 针对的是text based image editing问题&#xff0c;可以解决non rigid edit&am…

进程的了解

目录 一、进程控制块抽象&#xff08;PCB Process Control Block&#xff09; 1.pid&#xff1a;进程的身份标识 2.内存指针&#xff1a; 3.文件描述符表 进程的调度&#xff08;额外知识&#xff0c;不是进程属性&#xff09;&#xff1a; 4.进程的状态&#xff1a; 5.…

学习threejs,通过THREE.Raycaster给模型绑定点击事件

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Raycaster光线投射概…

Go语言基础学习(Go安装配置、基础语法)

一、简介及安装教程 1、为什么学习Go&#xff1f; 简单好记的关键词和语法&#xff1b;更高的效率&#xff1b;生态强大&#xff1b;语法检查严格&#xff0c;安全性高&#xff1b;严格的依赖管理&#xff0c; go mod 命令&#xff1b;强大的编译检查、严格的编码规范和完整的…

图神经网络

定义&#xff1a; 对图上所有的属性&#xff0c;包括顶点、边、全局、上下文进行的一个可以优化的变换&#xff0c;该变换可以保存住图的对称信息&#xff08;将顶点进行另外一个顺序的排序后&#xff0c;结果不变&#xff09; Message passing neural network&#xff1a;使…

Java爬虫API:获取商品详情数据的利器

为什么选择Java爬虫API 强大的库支持&#xff1a;Java拥有丰富的网络编程库&#xff0c;如Apache HttpClient、OkHttp等&#xff0c;这些库提供了强大的HTTP请求功能&#xff0c;使得发送请求和处理响应变得简单。高效的数据处理&#xff1a;Java的数据处理能力&#xff0c;结…