linux文件——文件系统——学习、理解、应用软硬件链接

2024-09-01 05:28

本文主要是介绍linux文件——文件系统——学习、理解、应用软硬件链接,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        前言:本篇内容主要讲解文件系统的软硬件链接。 经过前两篇文件系统的文章——讲解硬件(磁盘)、讲解文件系统底层, inode, 我们本节内容可以很好的理解我们要讲解的内容。 并且本节内容较少, 友友们学习本节的时候将会比前几节相对轻松一些。 

        ps:友友们务必了解磁盘的结构以及文件系统的底层原理以及inode, 再学习本节内容。

目录

软硬件链接——认识

什么是软链接

什么是硬链接

软硬件链接——底层原理

硬链接——深层挖掘

软链接——深层挖掘

软硬件链接的应用场景

软链接——实例应用

硬链接——实例应用

目录硬连接的死循环问题


软硬件链接——认识

什么是软链接

        首先, 我们先创建一个空文件, 如下图:

 

        然后, 我们就可以创建这个文件的软链接。 ——注意, 这里的文件是普通文件。 但是目录文件也可以, 最好使用普通文件, 因为好进行下面内容的测试

        上图中, ln就是链接的意思。 -s就是软链接, 然后file.txt就是连接到的文件——也就是目标文件, soft_link就是连接的文件——也就是软链接出的新文件。 也就是说, 由soft_link指向file.txt。

        而且, 我们使用ls -li, 也就是查看文件的inode编号, 会发现, soft_link的编号和file.txt是不一样的。如下图:

        所以, 我们就可以得出一个结论——软链接是一个独立的文件, 具有独立的inode。 

什么是硬链接

        接下来, 我们再创建一个test.txt

        接下来, 我们去掉-s, 直接ln test.txt hard_link——这就是创建硬链接, -s是创建软链接, 而如果去掉-s的话, 就是不创建软链接了, 也就是创建硬链接。 

        而观察硬链接的inode编号, 我们可以发现, 硬链接的编号和原文件相同。 那么我们这里就可以下另一个结论——硬链接没有独立的inode, 不是一个独立的文件。

        而且, 硬连接的文件属性中有一个地方发生了变化,上图中, 画圈圈的2处, 这个地方如果我们在实验的时候观察仔细就会发现, 在没有硬链接之前是1, 但是硬链接之后, 就变成了2. 我们这里再做一次实验:

        由实验我们真实的看到, 这里的数字从1变成了2。 而这个数字, 博主可以告诉友友们, 其实这个数字就是一个引用计数——这里从1变成了2, 本质上就是引用计数发生了变化!这个引用计数叫做硬链接数

软硬件链接——底层原理

硬链接——深层挖掘

        其实, 一般情况下, 我们学习软硬件链接只能学到上面的东西, 但是我们今天还要加深对于软硬件链接的理解。 对于硬链接来说, 我们知道, 硬链接的新文件和原文件的inode是一样的,但是文件名是不一样的。 而且我们又知道, 目录的块里面保存的是什么?——保存的是文件名和inode的映射关系!!! 这里为什么要说这个? ——因为硬连接的本质——其实就是在目录的块里面创建一个文件名和inode的映射关系!!!

         对于硬链接数来说, 我们知道任何一个文件,无论是目录, 还是普通文件, 都有inode。 对于inode内部, 都有一个叫做引用计数的计数器。 

        而由于目录里面保存的是:文件名和inode编号的映射关系! 所以多个文件名指向一个inode就有如下图结构:

        也就是说, 无论文件名如何变化, inode是不变的。 每一个文件名最终都会指向同一个inode换句话说, 就是每一个文件名最终都会指向同一个文件!!!

        所以我们在删除一个文件的时候(rm), 其实就是让该文件的inode里面的引用计数减减如果inode减到了0, 那么再进行inode的删除工作, 也就是我们上篇文章所讲到的删除文件的流程——简单说就是根据目录找到对应的文件的inode编号, 找到编号计算在哪个区, 哪个组当中。 然后根据inode编号找到block NUM, 将block bitmap置为0, 然后inode bitmap置为0. 

软链接——深层挖掘

        对于软链接来说, 软链接不会影响目标文件的引用计数, 那么就是说, 软连接的本质和硬链接是不同的。 那么软链接是什么情况呢?

        我们看下图的一个现象(soft_link是file.txt的软链接):

        这是为什么呢? 这是因为软链接里面的数据块里面, 保存的是所指向文件的路径!!!——也就是说, 软链接是一个独立的文件, 有独立的inode, 也有独立的数据块, 他的数据块里面保存的是指向文件的路径

        如果我们删除软链接, 那么没有问题。 但是我们如果删除软连接的目标文件, 就会发生错误, 因为软链接文件找不到原文件了。 如下图:

 

        软链接就像我们常用的快捷方式。 下面是一个快捷方式:

        我们桌面上的就是快捷键, 也就是相当于软链接, 然后我们的目标文件其实就是在图中的红框框的路径里。 而且我们可以删除快捷键, 但是如果我们删除了目标路径下的程序文件, 那么快捷方式也不能跑了。

        学到了软硬件连接的本质, 底层原理还不够, 我们还要学习一下软硬件连接的应用场景。 只有这样, 我们才算是真正的理解软硬件链接。 下面我们来认识一下具体的场景——

软硬件链接的应用场景

软链接——实例应用

我们先写一个程序,如下图, 代码很简单:

        我们直接在当前路径生成可执行程序。 

        然后我们将软链接文件创建在bin目录下(也就是bin下创建快捷键), 然后我们就可以在任何目录下直接使用文件名运行程序了, 如下图:

        这就是软链接的一个应用场景。

硬链接——实例应用

我们创建一个目录:

我们可以看到, 图中的这个新建的目录的硬链接数是2, 为什么呢? ——不知道友友们记不记得我们曾经说过——每个目录下都有.这个文件目录

        .目录就是目录本身——上图中的inode也证实了这一点。 而这个inode两者相同, 这就是为什么.是当前目录的原因, 也可以说是本质。——这就是硬链接的一个应用场景。 

        .谈完了, 再谈..

        ..我们说过是上级目录, 我们进入newdir, 并且记一下此时newdir目录的硬链接数, 以及inode编号:

        我们再在这个目录中创建文件, 就会看到newdir目录的硬链接数加了1, 并且新创建的文件agamk里面的..和newdir的inode是一样的。

        也就是说, ..和上一级目录指向的文件是一样的。 ..就代表上一级目录!!而且, 只要我们创建一个新的子目录, 当前目录的硬链接数就会加, 这是因为子目录的上一级目录文件的inode都是当前目录的inode!!!

        那么我们如果查看根目录下的硬链接数:

        如图是19, 那么我们就可以算出, 当前根目录下一共有多少个有效目录呢?——答案是17, 因为空目录为2, 所以19 - 2 = 17.

        而且, 我们知道, 正是因为有了.和.., 我们才得以进行路径的定位。 也就是说, 硬链接的一个作用是什么呢?——就是进行路径的定位!!

目录硬连接的死循环问题

        注意, linux系统不允许创建目录的硬链接。 ——即使.和..是硬链接, 但是这是系统默认的。 而我们的用户是不允许的, 为什么?

        下面我们看这么个情况。 

        下面是文件系统的树形结构图:

        如果我们在系统中查找某一个文件的时候, 我们当查到了上面的绿圈圈root, root告诉我们它是硬链接, 我们要返回inode为2的目录再去寻找, 而inode为2就是根目录。 也就是说, 当我们查到root的时候, 我们又会重新查一遍, 反反复复就会陷入死循环。 ——这就是为什么不能硬链接。

        但是可能我们会问, 不是刚刚才讲到, .和..不就是硬链接吗?为什么又说不能创建呢? 这是为什么呢?——这是因为操作系统默认已经把.和..创建好了。 操作系统不允许用户创建硬链接目录, 即便这个用户是root。 

        而且, 系统在搜索路径的时候, 不会去搜索.和.., 也就不存在环路问题!!!

——————以上, 就是本节的全部内容, 下面为本人学习笔记

这篇关于linux文件——文件系统——学习、理解、应用软硬件链接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126062

相关文章

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio