【Linux进阶】文件系统8——硬链接和符号连接:ln

    在Linux下面的链接文件有两种,

  1. 一种是类似Windows的快捷方式功能的文件,可以让你快速地链接到目标文件(或目录);
  2. 另一种则是通过文件系统的inode 链接来产生新文件名,而不是产生新文件,这种称为硬链接(hard link),这两种玩意儿是完全不一样的东西,现在就分别来谈谈。

1.硬链接(Hard Link,硬式链接或实际链接)

我们知道几件重要的信息,包括:

  1. 每个文件都会占用一个inode,文件内容由inode的记录来指向;
  2. 想要读取该文件,必须要经过目录记录的文件名来指向到正确的inode号码才能读取。

也就是说,其实文件名只与它所处的目录有关,但是文件内容则与它自己的inode有关。

那么想一想,有没有可能有多个文件名对应到同一个inode号码?

有的,那就是硬链接的由来,所以简单地说:硬链接只是在某个目录下新增一条文件名链接到某inode号码的关联记录而已。

由于linux下的文件是通过索引节点(Inode)来识别文件硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配inode。每添加一个一个硬链接,文件的链接数就加1。

我们看个例子 

#根目录下创建文件夹hardlink,并且在hardlink内创建文件aa.txt

#查看其链接数为1,注意,此处链接数就是硬链接的次数


#创建硬链接

#往aa.txt文件中写入一些内容


#发现aa.link中也同样可以看到

#删除aa.txt,aa.link依然可以正常查看内容,链接数 -1,inode不变

我们回过头来看这个例子

你有没有发现两个文件名都链接到1048579这个inode号码,所以你看看是不是所以您看看,是否文件的权限与属性完全一样?

因为这两个文件名其实是一模一样的文件,而且你也会发现第二个字段由原本的1变成2,那个字段称为链接,这个字段的意义为:有多少个文件名链接到这个inode 号码。如果将读取到正确数据的方式画成示意图,就类似下图:

上图的意思是,你可以通过User1或User2或User3的目录的inode指定的区块找到两个不同的文件名,而不管使用哪个文件名均可以指到那个 inode去读取到最终数据。那这样有什么好处?

  1. 最大的好处就是安全,如同上图中,如果你将任何一个文件名删除,其实inode与区块都还是存在的。此时你可以通过另一个文件名来读取到正确的文件数据。
  2. 此外,不论你使用哪个文件名来编辑,最终的结果都会写入到相同的inode与区块中,因此均能进行数据的修改。

一般来说,使用硬链接设置链接文件时,磁盘的空间与inode的数目都不会改变。

图中可以知道,硬链接只是在某个目录下的区块多写入一个关联数据而已,既不会增加inode 也不会消耗区块数量。

我们接着上面那个例子来讲

那这时候,就有个疑问了,如果链接数只剩下一个,再次删除,会进行什么样的操作呢?
 

实际上,

  1. 如果我们这时候再删除aa.link这个文件,系统只会删除掉inode table中aa.link指向的inode信息,和hardlink 目录项中aa.link的相关信息。
  2. 然后会将aa.link inode指针(也就是硬链接)所指向的数据块设置为空闲的状态,告诉系统这些数据块可以被再次使用。
  3. 而里面的内容却不会被删除,直到新的数据覆盖为止!

        这也就说明了,实际上 linux中被删除的文件数据是可以被找回的,只要相应的数据块没有被再次覆盖使用。

        如果观察的再细致一些,我们会发现,为什么hardlink这个文件夹在创建后就会有两个链接数呢?

通过上述查看,我们可以看出,当进入hardlink目录下后,默认会有个 .的隐藏目录,而该目录也就是当前目录的意思,即hardlink目录。所以才会有两个链接数。

硬链接的制作中其实还是可能会改变系统的区块,那就是当你新增这条数据却刚好将目录的区块填满时,就可能会新加一个区块来记录文件名关联性,而导致磁盘空间的变化。不过,一般硬链接所用掉的关联数据量很小,所以通常不会改变inode与磁盘空间的大小

1.1.硬链接的缺点

1、无法跨分区,跨设备创建硬链接

[root@localhost hardlink]# ln aa.link  /boot/
ln: failed to create hard link ‘/boot/aa.link’ => ‘aa.link’: Invalid cross-device link

因为每个分区都有自己独立的inode体系,

假设A分区的文件在B分区做了一个硬链接,此时访问B分区的此链接,按照我们想的是需要它访问A分区的inode,进行数据查询,但是它只会根据B分区的inode,在B数据块中查找数据。

就相当于两套独立的数据库,你不可能拿着A数据库的某个主键去B数据库搜索数据,是一样的道理。

2、无法创建文件夹/目录的硬链接

至于为何设置为无法创建文件夹,这里还是用反推来验证。

假设可以创建文件夹的硬链接:ln  /hardlink  /test/dir.link。那么有个问题,首当其冲。 

hardlink目录下的 . 是当前目录的意思,此处代表hardlink,那dir.link中的 ‘.’是代表test目录呢?还是 hardlink目录呢?

其次,假设存在目录 /A/B.link 和 /B/A.link。如果B.link是B目录的硬链接,A.link是A目录的硬链接。那A.link既然是/A的链接,那它里面肯定有B.link。同理B.link里面肯定有A.link。这样依次循环 /A/B.link/A.link/B.link/A.link/…。就造成了死循环的现象。这也就是为什么不允许创建文件夹硬链接的原因了。

由于硬链接局限性比较多,所以工作中使用的不多。

2.符号链接(Symbolic Link,亦即是快捷方式)

相对于硬链接,符号链接可就好理解多了。

符号链接相当于我们 Windows 中的快捷方式,即如果你软链接一个目录,只是一个目录的快捷方式到指定位置,操作系统找这个快捷方式会直接找到真实目录下的文件。

基本上,符号链接就是建立一个独立的文件,而这个文件会让数据的读取指向它链接的那个文件的文件名。

由于只是利用文件来做为指向的操作,所以,当源文件被删除之后,符号链接的文件会【打不开了】,会一直说【无法打开某文件】,实际上就是找不到原始文件名而已。


创建软链接

由上图的结果我们可以知道两个文件指向不同的inode号码,当然就是两个独立的文件存在。

而且链接文件的重要内容就是它会写上目标文件的文件名,你可以发现上表中链接文件的大小为6B。因为箭头(-->)右边的文件名【aa.txt】总共有6个字母,每个字母占用1个字节,所以文件大小就是12B了。

但是事实真的是这样子吗?它真的存是是文件名吗?

事实上,软连接记录的是链接文件箭头后面的路径字符串大小

不信的话我们来验证一下
这里我们写入一些内容到aa.txt中 

再次查看,原文件大小发生了改变,而链接文件大小依旧没变化。

这其实就是软链接的特性之一,因为软链接的inode指向的数据块保存的是 原文件的路径,如果没有路径,是由文件名,默认会在软链接所在路径查找

 

再次举例论证

ls.link大小正好是 /usr/bin/ls的路径字符串大小 

软链接的使用,如果观察Centos7,会发现,既有使用相对路径创建的软链接,也有使用绝对路径创建的软链接。
而使用相对路径创建软链接,则有如下注意点:

上图中,我们使用 ln -s …/aa.txt /tmp/aa.link在/tmp下创建了软链接,却发现,竟然提示报错!找不到aa.txt。

        因为/tmp/aa.link在指向…/aa.txt 的过程中。它会以自己的路径为初始点去寻找aa.txt。即 /tmp/aa.link -> …/aa.txt,在系统看来,它会理解成。以aa.link所在路径为起点,回到上一级目录,去寻找aa.txt。很显然没有找到,所以报错。

        创建的软连接,指向的文件,默认会以软链接的路径为主,去寻找指向的文件,所以创建时,请以软链接的路径作为起点路径 去写原文件的相对路径

        那既然相对路径创建这么麻烦,为什么还要使用这种方式呢?

因为使用相对路径的话,迁移只要相对迁移,不会影响链接的使用,更加灵活。而绝对路径的软链接,则必须要求路径的正确性。

而由于软链接 inode指向的数据块只保存 原文件的地址字符串,所以可以跨分区、跨设备创建,并且文件夹也可以创建。

当然如果原文件被删除了,链接则也会失效,无法向硬链接那样拥有独立性。

基本上,符号链接的用途比较广,所以您要特别留意符号链接的用法,未来一定还会常常用到。 

3、软链接与硬链接的区别

  • 1、本质:

硬链接:同一个inode,只是多个名字。
软链接:是不同的文件,inode不同

  • 2、跨分区

硬链接无法跨分区、跨设备建立,软链接可以

  • 3、目录

硬链接无法创建目录硬链接,软链接可以

  • 4、相互关系

硬链接没有主次之分,相互独立
软链接依赖于原文件,原文件被删除,软链接即不可用

  • 5、链接数

硬链接会删除增加会影响链接数,软链接不会,因为inode不一样。

  • 6、相对路径

硬链接创建时,原始文件路径是相对于当前路径。
软链接创建时,原始文件路径是 相对于软链接的路径

  • 7、文件类型

硬链接的类型与原始文件类型一致,软链接则会显示 symbolic link

  • 8、创建方式

硬链接创建:ln [原文件] [硬链接]
软链接创建:ln -s [原文件] [软链接]

4.关于目录的链接数量

或许您已经发现了,那就是,当我们以硬链接进行文件的链接时,可以发现,在ls-l所显示的第二字段会增加一才对,那么请教,如果建立目录时,它默认的链接数量会是多少?

让我们来想一想,一个空目录里面至少会存在些什么?

呵呵,就是存在.与..这两个目录。

那么,当我们建立一个新目录名称为/tmp/testing时,基本上会有三个东西,那就是:

  • /tmp/testing
  • /tmp/testing/.
  • /tmp/testing/..

而其中/tmp/testing与/tmp/testing/.其实是一样的。都代表该目录,而/tmp/testing/.则代表/tmp 这个目录。所以说,当我们建立一个新的目录时,【新的目录的链接数为2,而上层目录的链接数则会增加1】

不信的话,我们来做个测试看看:

看,原本的所谓上层目录/tmp的链接数量由10增加为11,至于新目录/tmp/testing则为2。这
样可以理解目录链接数量的意义了吗?
 

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

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

相关文章

sql注入时间盲注

基于时间的盲注 也叫延时注入。通过观察页面,既没有回显数据库内容,又没有报错信息也没有布尔类型状态,那么我们可以考虑用“绝招”--延时注入。延时注入就是根据页面的响应时间来判断是否存在注入,一点一点注入出数据库的信息。我…

HTML+CSS+JS 实现3D风吹草动效果(B站视频)

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>3D effect&…

Python 爬虫与 Java 爬虫:相似之处、不同之处和选项

在信息时代&#xff0c;网络上可用的数据量巨大且不断增长。为了从这些数据中提取有用的信息&#xff0c;爬虫已成为一种重要的技术。Python 和 Java 都是流行的编程语言&#xff0c;都具有强大的爬虫功能。本文将深入探讨 Python 爬虫和 Java 爬虫之间的差异&#xff0c;以帮助…

PCIe驱动开发(1)— 开发环境搭建

PCIe驱动开发&#xff08;1&#xff09;— 开发环境搭建 一、前言 二、Ubuntu安装 参考: VMware下Ubuntu18.04虚拟机的安装 三、QEMU安装 参考文章&#xff1a;QEMU搭建X86_64 Ubuntu虚拟系统环境 四、安装Ubuntu 下载地址&#xff1a;https://old-releases.ubuntu.com…

【错题集-编程题】买卖股票的最好时机(四)(动态规划)

力扣对应题目链接&#xff1a;188. 买卖股票的最佳时机 IV - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;买卖股票的最好时机(四)_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 1、状态表示 为了更加清晰的区分买入和卖出&#xff0c;我们换成有股…

昇思MindSpore学习笔记6-05计算机视觉--SSD目标检测

摘要&#xff1a; 记录MindSpore AI框架使用SSD目标检测算法对图像内容识别的过程、步骤和方法。包括环境准备、下载数据集、数据采样、数据集加载和预处理、构建模型、损失函数、模型训练、模型评估等。 一、概念 1.模型简介 SSD目标检测算法 Single Shot MultiBox Detecto…

MapReduce底层原理详解:大案例解析(第32天)

系列文章目录 一、MapReduce概述 二、MapReduce工作机制 三、Map&#xff0c;Shuffle&#xff0c;reduce阶段详解 四、大案例解析 文章目录 系列文章目录前言一、MapReduce概述二、MapReduce工作机制1. 角色与组件2. 作业提交与执行流程1. 作业提交&#xff1a;2. Map阶段&…

linux_进程概念——理解冯诺依曼体系结构

前言&#xff1a; 本篇内容是为了让友友们较好地理解进程的概念&#xff0c; 而在真正了解进行概念之前&#xff0c; 要先了解一下冯诺依曼体系结构。 所以博主会先对冯诺伊曼体系结构进行解释&#xff0c; 然后再讲解进程的概念。 ps&#xff1a; 本篇内容适合了解一些linux指…

Firealpaca 解锁版下载及安装教程 (火焰羊驼绘画软件)

前言 FireAlpaca是一款简单易用的电脑绘画软件&#xff0c;采用了类似于Photoshop的图层绘画方式。对于喜欢手绘和创作漫画的朋友来说&#xff0c;FireAlpaca的多图层功能使得绘画过程更加便捷和简单。作为一个小型图像编辑软件&#xff0c;它能够轻松处理多个图层或手绘图&am…

网络编程的学习之udp

Udp编程过程 Sento不会阻塞 实现聊天室效果 上线 聊天 下线 服务端需要一个地址&#xff0c;去保留名字和ip地址 交互的时候发结构体 下面这个宏只能在c语言里使用 ser.sin_port htons(50000); 上面是端口号50000以上&#xff0c;两边要一样 这里是不要让udp发的太快&am…

Python | Leetcode Python题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack:def __init__(self):"""Initialize your data structure here."""self.queue collections.deque()def push(self, x: int) -> None:"""Push element x onto stack."&…

Java 快速入门学习 -- Day 1

Java 快速入门 Ⅰ 学习视频快捷键封装继承方法的重写多态异常I/O 流多线程网络编程 -- 单向通信XML注解navicat mysqlJDBC查询数据库中所有元素并打印 ) 学习视频 【3天搞定JavaSE到SpringBoot框架】 快捷键 // psvm 回车 public static void main(String[] args) {}// s…

【动态规划Ⅳ】二维数组的动态规划——最小路径和

二维数组的动态规划 最小路径和64. 最小路径和原地修改数组定义二维数组进行状态转移优化&#xff1a;用 一维数组进行状态转移相似题目&#xff1a;LCR 166. 珠宝的最高价值 120. 三角形最小路径和原地修改数组定义二维数组进行状态转移一维数组进行状态转移自底向上&#xff…

推荐一个比 Jenkins 使用更简单的项目构建和部署工具

最近发现了一个比 Jenkins 使用更简单的项目构建和部署工具&#xff0c;完全可以满足个人以及一些小企业的需求&#xff0c;分享一下。 项目介绍 Jpom 是一款 Java 开发的简单轻量的低侵入式在线构建、自动部署、日常运维、项目监控软件。 日常开发中&#xff0c;Jpom 可以解…

【R语言+Gephi】利用R语言和Gephi实现共发生网络的可视化

【R语言Gephi】利用R语言和Gephi实现共发生网络的可视化 注&#xff1a;本文仅作为自己的学习记录以备以后复习查阅 一 概述 Gephi是一款开源免费的多平台网络分析软件&#xff0c;在Windows、Linux和Mac os上均可以运行&#xff0c;像他们官网所说的&#xff0c;他们致力于…

Excel第29享:基于sum嵌套sumifs的多条件求和

1、需求描述 如下图所示&#xff0c;现要统计12.17-12.23这一周各个人员的“上班工时&#xff08;a1&#xff09;”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 首先&#xff0c;确定逻辑&#xff1a;“对多个条件&#xff08;日期、人员&#xff09;进行“工时”…

ONLYOFFICE 8.1版本版本桌面编辑器测评

ONLYOFFICE官网链接&#xff1a;ONLYOFFICE - 企业在线办公应用软件 | ONLYOFFICE ONLYOFFICE在线办公套件&#xff1a;在线办公套件 | ONLYOFFICE ONLYOFFICE在线PDF编辑器、阅读器和转换器&#xff1a;在线PDF查看器和转换器 | ONLYOFFICE ONLYOFFICE 8.1版本桌面编辑器是…

【中项第三版】系统集成项目管理工程师 | 第 4 章 信息系统架构⑤ | 4.8 - 4.9

前言 第4章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术相关的内容&#xff0c;学习要以教材为准。本章分值预计在4-5分。 目录 4.8 云原生架构 4.8.1 发展概述 4.8.2 架构定义 4.8.3 基本原则 4.8.4 常用架构模式 4.8.5 云原生案例 4.9 本章…

【DevOps】在云原生时代的角色与重要性探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是云原生 2、云原生的核心特性 3、什么是DevOps…