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始终的一个哲学思想:一切皆文件,这个需要更加深入的去理解。
  • 我认为,使用图书馆来类比磁盘,用图书管理系统来类比文件管理系统,这个还是相当形象的,可能各位需要理一下思路,我说的可能存在问题,但是类比我们熟悉的事物去学习未知的事物是非常有效的理解方式。

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

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

相关文章

连小白都在用的电子期刊制作网站

你是不是也想制作一份精美的电子期刊,却苦于没有专业的技能和工具?现在,有一款制作电子期刊的网站,连小白都能轻松制作电子期刊!它就是今天要介绍的——【FLBOOK在线制作电子杂志平台】! 【FLBOOK在线制作电…

国际阿里云:无法访问ECS实例中的服务的排查方法!!!

操作场景 无法访问ECS实例中的服务可能有以下原因: 可能原因 排查方案 ECS实例的安全组未开放相应端口 检查ECS实例安全组规则 ECS实例中,该服务未启动/开启或服务对应端口未被监听 检查服务状态及端口监听状态 ECS实例内防火墙设置错误 检查ECS…

Git之分支与版本->课程目标及知识点的应用场景,分支的场景应用,标签的场景应用

1.课程目标及知识点的应用场景 Git分支和标签的命名规范 分支 dev/test/pre/pro(即master) dev:开发环境--windows (自己的电脑) test:测试环境--windows/linux (公司专门的测试电脑 pre:灰度环境(非常大的公司非常重要的项目) pro:正式环境 灰度环境与正式环境的服务器配置…

实用篇-ES-RestClient操作文档

一、RestClient案例准备 对es概念不熟悉的话,先去看上面的 实用篇-ES-索引库和文档,不建议基础不牢就直接往下学 ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求来发送给ES。 官…

怎样正确选择等保测评机构开展等保测评工作?

随着大家对网络安全的重视,越来越多的企业需要做等保测评了。很多小伙伴想知道怎样正确选择等保测评机构开展等保测评工作?这里就给大家简单说说。 怎样正确选择等保测评机构开展等保测评工作? 【回答】:正确选择等保测评机构开展…

Tomcat学习

一、入门 在webapp里面必须先创建一个文件夹,文件夹里面放的内容,才会被访问到。 创建一个javaweb项目后 二、servlet 1.概述 2.servlet生命周期 3.servlet实例的创建时机 4.Servlet实例的初始化参数 5.HTTP状态码 6.servelet返回JSON数据 7.服务端设置…

源码级JVS低代码功能新增:动态配置、逻辑多级循环嵌套等等

低代码更新功能 新增: 1.下拉组件选项新增动态配置; 选项的内容可以根据特定的条件或数据源进行动态变化的功能,通过动态配置,用户可以灵活地设置下拉组件的选项内容,例如从数据库或其他数据源中获取选项数据,或者根…

C++之Max

背景 想学习数据结构,这是看的课程的习题,讲课老师用的是类C语言,具体的实现还是得自己来。 准备工作 用开发工具Microsoft Visual Studio(VS)建立一个空白的C控制台项目 选择项目的存储路径 成功建立 我在 Microsoft Visual Studio中用…

OSG路径动画:osg::AnimationPath示例

一、效果 飞船绕地球飞行 二、源码 // osg_AnimationPath.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <windows.h> #include <iostream> #include <osgViewer/Viewer>

Elasticsearch的配置学习笔记

文/朱季谦 Elasticsearch是一个基于Lucene的搜索服务器。它提供一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口&#xff0c;Elasticsearch是用Java语言开发的。 关于Elasticsearch系列笔记&#xff0c;主要从Elasticsearch的配置、核心组件、架构设计、使…

navicat导入已有sql表过程

已知我有一个外部的sql表&#xff0c;如图&#xff1a; 想要将其导入navicat并运行。 看一下我的navicat&#xff0c; navicat里已有的数据库并没有library&#xff0c;所以需要建立一个同名的library数据库来存储library.sql文件。 具体步骤如下&#xff1a; 在“本地连接”…