Linux技能篇-软链接和硬链接

文章目录

  • 前言
  • 一、硬链接是什么?
  • 二、软链接是什么?
  • 三、硬链接和软链接的区别和共性
    • 1.区别
    • 2.共同点
  • 总结


前言

在Linux系统中,有两个容易混淆的概念,就是软链接(Soft Link)和硬链接(Hard Link)。这个也经常在面试过程中问到,在实际的工作中,可能你并不经常创建链接文件,但是在很多配置文件中你都可以看到它。了解了他们的区别和共性,才能更好的去使用它,提高效率,减少困惑。在这篇文章中,我用图书馆来类比说明,可能有差异,各位看官需要自己理解消化下。
在这里插入图片描述


一、硬链接是什么?

首先,在Linux系统中,每一个保存的文件,文件系统都会自动分配一个索引节点来帮助文件系统查找文件所在的位置,也就是inode index。使用ls命令加-i参数就可以看到,例如:

[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# touch test
[root@localhost ~]# ls -li
total 4
67157570 -rw-------. 1 root root 1259 May 26 05:34 anaconda-ks.cfg
67157597 -rw-r--r--  1 root root    0 Nov 14 06:35 test

我刚刚在/root目录下新建了一个名为test的文件,他的inode号为:67157597,我们可以把文件系统想象成一个图书馆,test想象成书名,而inode号就可以想象成是图书编号,在图书管理系统中通过查找图书编号就可以找到对应书的物理位置和名字,同理在Linux系统中,通过inode号就可以找到文件在磁盘中的位置和文件名。

硬链接就相当于给一个文件做个备份,给源文件的内容都拉过来,包括inode号;类比图书馆,就是给名为test的图书做个备份,这个备份可以是其他名字,但是他们编号是相同的。

所以,在我看来inode号没变,就是因为他们说到底是真实存在的相同的两份内容,存在某种同步的逻辑。

[root@localhost ~]# ls -il
total 4
67157570 -rw-------. 1 root root 1259 May 26 05:34 anaconda-ks.cfg
67195584 -rw-r--r--  1 root root    0 Nov 14 06:44 test
[root@localhost ~]# ln test /root/hard
[root@localhost ~]# ls -il
total 4
67157570 -rw-------. 1 root root 1259 May 26 05:34 anaconda-ks.cfg
67195584 -rw-r--r--  2 root root    0 Nov 14 06:44 hard
67195584 -rw-r--r--  2 root root    0 Nov 14 06:44 test
[root@localhost ~]# echo "this is a test file" >> test
[root@localhost ~]# cat test
this is a test file
[root@localhost ~]# cat hard
this is a test file

如上测试,我修改了源文件的内容,硬链接的内容也发生了变化,那反过来,我修改硬链接文件,源文件会发生改变吗?

[root@localhost ~]# echo "i love moyu" >> hard
[root@localhost ~]# cat hard
this is a test file
i love moyu
[root@localhost ~]# cat test
this is a test file
i love moyu

答案就是会变!不知道各位猜对了没有。
所以说,修改Linux中的硬链接文件,就等同于是在修改源文件。

那不知道各位有没有思考一个问题,删除了硬链接,源文件还存在吗?反过来,删除了源文件,硬链接还存在吗?

这个我不做实验,我从图书馆的角度告诉你答案。我们之前说到,硬链接,就是图书的备份,原本没有了,但是备份还在;同理,备份没了,原本也不会被影响。

所以答案就是删除了硬链接,源文件不会被影响;同样,删除了源文件,硬链接文件也不会被影响。inode号也不会发生变化。

二、软链接是什么?

软链接就是给文件新建一个inode号,两个inode号都指向同一个文件,软链接又叫做符号链接,从名字来理解,那就是给文件新建一个标识符,也就是inode号。

还是用图书馆来类比说明。这就是给名为test的图书再编一个号,现在test这本书就有了两个编号。

[root@localhost ~]# ln -s test /root/soft
[root@localhost ~]# ls -il
total 12
67157570 -rw-------. 1 root root 1259 May 26 05:34 anaconda-ks.cfg
67195584 -rw-r--r--  2 root root   32 Nov 14 06:59 hard
67157597 lrwxrwxrwx  1 root root    4 Nov 14 07:21 soft -> test
67195584 -rw-r--r--  2 root root   32 Nov 14 06:59 test

这里我给test文件建立了一个软链接,可以直观的看到inode号发生了改变,还是一样的套路,我们对源文件进行修改,看看软链接文件会不会发生变化。

[root@localhost ~]# cat test
this is a test file
i love moyu
[root@localhost ~]# cat soft
this is a test file
i love moyu
[root@localhost ~]# echo "i for in love with moyu" >> test
[root@localhost ~]# cat test
this is a test file
i love moyu
i for in love with moyu
[root@localhost ~]# cat soft
this is a test file
i love moyu
i for in love with moyu

结果还是很显而易见的,修改了源文件,软链接文件的内容也发生了变化,反之,修改软连接文件,源文件内容会发生变化吗?我们继续测试。

[root@localhost ~]# echo "moyu is my favourite bloger" >> soft
[root@localhost ~]# cat soft
this is a test file
i love moyu
i for in love with moyu
moyu is my favourite bloger
[root@localhost ~]# cat test
this is a test file
i love moyu
i for in love with moyu
moyu is my favourite bloger

结果显而易见,当然会改变。

还是一样的问题,删除了源文件,软链接文件会不会被影响?反过来,删除了软链接文件,源文件会不会被影响?

类比图书馆,刚刚说到,软链接就是给图书添加额外的编号,原本没了,找到编号也找不到书了,那这个编号也就没有了存在的意义;反过来,删除了一个编号,怎么会对书本身有影响呢?

所以删除了源文件,软连接就会失效;删除了软连接,并不会使源文件产生变化。

三、硬链接和软链接的区别和共性

1.区别

在这里插入图片描述
直观看,有四点区别:

  • 首先是inode号,软链接inode号和源文件不同,硬链接inode号和源文件相同;
  • 然后是软连接在权限前面多了一个“l”的标识位;
  • 软链接不是一个真正意义上的文件,所以文件大小和源文件有差异;
  • 命名来看,软链接指向源文件,硬链接则没有。

删除了硬链接,源文件不会被影响;同样,删除了源文件,硬链接文件也不会被影响。删除了源文件,软连接就会失效;删除了软连接,并不会使源文件产生变化。

在建立方式上,他们也有所不同,软链接的建立需要加-n参数,还必须使用绝对路径;硬链接不需要额外的参数,但是不能链接到不同分区。
(为什么不能跨分区建立硬链接?这个需要解释一下,在linux系统中,inode号是按照每个分区来建立的,在不同的分区中,如果文件系统是同一类型,那inode号的分配方式是相同的,就好比是新华书店的两个分店,店里摆放东西的风格是一样的,但是同一个编号在两个店里可能是不同的两本书。在Linux系统中也一样,同一个inode号标识两个文件这是一定不允许的,系统会报错)

硬链接不能链接目录,目录在Linux文件系统中目录是一个存有inode号和文件名的特殊文件,每个文件系统都有它的目录,所以硬链接不能链接目录,这是系统不允许的;软链接可以理解为快捷方式,它最终还是指向源文件,所以它可以链接目录。(这里解释的比较模糊,这个概念比较抽象,可能还需要各位深入理解一下)

2.共同点

他们都是链接文件,不论是修改软连接还是硬链接都会使源文件发生变化。


总结

  • 这里涉及到了Linux系统下文件的读取原理,存放原理,这部分理解起来比较抽象,只有完整理解了Linux的文件存储才能更好的理解软链接和硬链接。
  • 必须要弄明白贯穿Linux始终的一个哲学思想:一切皆文件,这个需要更加深入的去理解。
  • 我认为,使用图书馆来类比磁盘,用图书管理系统来类比文件管理系统,这个还是相当形象的,可能各位需要理一下思路,我说的可能存在问题,但是类比我们熟悉的事物去学习未知的事物是非常有效的理解方式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时序数据库 TDengine + 高级分析软件 Seeq,助力企业挖掘时序数据潜力

作为一款制造业和工业互联网(IIOT)高级分析软件,Seeq 支持在工艺制造组织中使用机器学习创新的新功能。这些功能使组织能够将自己或第三方机器学习算法部署到前线流程工程师和主题专家使用的高级分析应用程序,从而使单个数据科学家…

EasyDarwin开源流媒体服务器

文章目录 前言一、EasyDarwin 简介二、EasyDarwin 主要功能特点三、安装部署四、推拉流测试1、进入控制页面2、推流测试3、拉流测试 前言 本文介绍一个十分实用的高性能开源 RTSP 流媒体服务器:EasyDarwin。 一、EasyDarwin 简介 EasyDarwin 是基于 go 语言研发&a…

【广州华锐视点】海外制片人VR虚拟情景教学带来全新的学习体验

虚拟现实(Virtual Reality,简称VR)是一种利用电脑模拟产生一个三维的虚拟世界,提供用户关于视觉、听觉、触觉等感官的模拟体验的技术。随着科技的进步,VR已经被广泛应用到许多领域,包括游戏、教育、医疗、房…

VuePress介绍及使用指南

VuePress是一个基于Vue.js的静态网站生成工具,它专注于以Markdown为中心的项目文档。VuePress具有简单易用的特性,同时提供了强大的自定义和扩展性。在本文中,我们将介绍VuePress的基本概念,并提供一个简单的使用指南。 什么是Vue…

Centos7安装mysql8.0.35(亲测)

今天在centos7上安装了mysql8,特此记录以作备忘。 说明: - 我安装的mysql版本:8.0.35 - centos版本:7 - 我的虚拟机没安装过mysql,如果之前安装过mysql记得卸载干净 - 卸载步骤: - rpm -qa|grep mysql (搜索mysql)比如…

自定义Graph Component:1.2-其它Tokenizer具体实现

本文主要介绍了Rasa中相关Tokenizer的具体实现,包括默认Tokenizer和第三方Tokenizer。前者包括JiebaTokenizer、MitieTokenizer、SpacyTokenizer和WhitespaceTokenizer,后者包括BertTokenizer和AnotherWhitespaceTokenizer。 一.JiebaTokenizer   Ji…

5 新的关键字

动态内存分配 回想C语言中,动态内存是怎么分配的?通过C库里面的malloc free去进行动态内存分配。 C通过new关键字进行动态内存申请,动态内存申请是基于类型进行的。 delete 关键字用于内存释放。 //变量申请 type* pointer new type; dele…

arcgis提取栅格有效边界

方法一:【3D Analyst工具】-【转换】-【由栅格转出】-【栅格范围】 打开一幅栅格数据,利用【栅格范围】工具提取其有效边界(不包含NoData值): 方法二:先利用【栅格计算器】将有效值赋值为1,得到…

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline

模型简介 本基线模型共分为三个部分: 基于CNN的判断每张人脸是否是说话人的模型;基于Transformer-Encoder的判断同一段对话中不同轮次的说话人关系的模型;和使用上述两个预测结果求解二次型优化问题的说话人识别求解器。 基于CNN的判断每…

VSCode 好用的插件分享

文章目录 Introlistcode runner 【在文本编辑器中编辑好各类语言的源代码,然后一键运行】gitlens - 【git提交信息即时查看,类似IDEA中的 show annotation】还有更多,会日常补充。 Intro 大四毕业前,我只有一台dell latitude 455…

瑞萨e2studio(29)----SPI速率解析

瑞萨e2studio.29--SPI速率解析 概述视频教学时钟配置解析RA4M2的BRR值时钟速率7.5M下寄存器值3K下寄存器值 概述 在嵌入式系统的设计中,串行外设接口(SPI)的通信速率是一个关键参数,它直接影响到系统的性能和稳定性。瑞萨电子的…

No200.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【Android】画面卡顿优化列表流畅度四之Glide几个常用参数设置

好像是一年前快两年了,笔者解析过glide的源码,也是因为觉得自己熟悉一些,也就没太关注过项目里glide的具体使用对当前业务的影响;主要是自负,还有就是真没有碰到过这样的数据加载情况。暴露了经验还是不太足够 有兴趣的…

点大商城V2版 2.5.3全插件开源独立版 百度+支付宝+QQ+头条+小程序端+unipp开源端安装测试教程

点大商城V2是一款采用全新界面设计支持多端覆盖的小程序应用,支持H5、微信公众号、微信小程序、头条小程序、支付宝小程序、百度小程序,本程序是点大商城V2独立版,包含全部插件,代码全开源,并且有VUE全端代码。 适用范…

Java17新增特性

前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16 的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java16新增特…

Matlab论文插图绘制模板第126期—分组三维气泡图

在之前的文章中,分享了Matlab三维气泡图的绘制模板: 特征渲染的三维气泡图: 进一步,再来分享一下分组三维气泡图。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋…

手机能做静态二维码吗?用手机做二维码的教程

现在手机上有很多的功能,能够帮助我们应对日常生活中的各种问题,那么如果我们想要在手机上生成一个静态二维码,大家知道该怎么来操作吗?一般制作二维码需要专业的二维码生成工具才可以完成制作,那么下面小编来给大家分…

RabbitMQ-基础篇-黑马程序员

代码: 链接: https://pan.baidu.com/s/1nQBIgB_SbzoKu_XMWZ3JoA?pwdaeoe 提取码:aeoe 微服务一旦拆分,必然涉及到服务之间的相互调用,目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中,调…

2023年亚太杯数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 赛题思路算法介绍FP树表示法构建FP树实现代码 建模资料 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模式树算法&#…

Maya v2024(3D动画制作软件)

Maya 2024是一款三维计算机图形动画制作软件。它被广泛应用于电影、电视、游戏、动画等领域中,用于创建各种三维模型、场景、特效和动画。 以下是Maya的主要特点: 强大的建模工具:Maya提供了各种建模工具,如多边形建模、NURBS建模…