【Linux】认识文件(四):文件系统,inode,以及软硬连接

news2025/1/17 2:50:27

【Linux】认识文件(四):文件系统,inode,以及软硬连接

  • 一.磁盘(仅了解)
    • 1.组成
    • 2.CHS寻址
  • 二.抽象化磁盘(仅了解)
  • 三.文件系统
    • 1.什么是文件系统
    • 2.ext2文件系统的结构
      • i.Date blocks
      • ii.Block Bitmap
      • iii.inode
        • 1.inode Table
        • 2.inode Bitmap
      • iiiii.GDT
      • iiiiii.Super block
  • 四.文件的增删查改
    • 1.创建一个文件需要干什么
    • 2.删一个文件需要干什么
    • 3.查找一个文件需要干什么
    • 4.如何查找文件的inode
  • 五.文件的软硬链接
    • 1.什么是软链接
    • 2.软链接的应用
    • 3.什么是硬链接
    • 4.硬链接数
    • 5.硬链接的应用
    • 6.硬链接和软连接的区别

在文件(一)的博客中曾经提到过:
文件分成打开的文件 和 未打开的文件
前面我们讲了内存中被进程打开文件的管理方式
现在将要带来在未打开的文件管理方式

一.磁盘(仅了解)

这里我们就挑了硬盘作为存储器,来了解磁盘的工作方式。
硬磁盘就是我们常常听说的机械硬盘

虽然固态硬盘相比于机械硬盘,读取速度更快
但是架不住机械硬盘便宜啊
所以在服务器中,机械硬盘依旧是主流

所以这里也是选择磁盘来讲解

1.组成

磁盘结构:
在这里插入图片描述

磁盘的结构大致是这样。

其中:

  • 磁头:是专门用来读写数据
  • 磁盘面:是存储数据的地方

这里来看一下磁盘面的结构:
在这里插入图片描述

  • 磁道则可以理解成划分磁盘面的一个结构,一个磁道上有多个扇面
  • 扇区:可以理解为磁盘中最小的存储单元

2.CHS寻址

如果我们想要向磁盘中读取和写入数据,我们首先要干的是什么?
就是要定位,定位要读取的数据位置或者要写入数据的位置

上面我们知道了,扇区是存储数据的最小单元
所以我们要找到对应的存储数据其实就是找到正确的扇区位置

所以接下来的问题就变成了,在磁盘中定位一个扇区的方式

在这里插入图片描述

首先:
看到一个磁盘中有多个磁面,所以首先要定位到正确的磁面。
这里我们能注意到,一个磁头对应一个磁面
所以要找到正确的磁面只要找到对应的磁头就行

找到正确的磁面后
在这里插入图片描述
接下来就是要确认的就是对应的磁道

然后只要知道对应的扇区在对应磁道的第几个就行了

这就是CHS寻址方式
1.哪个磁头,2.哪个磁道(柱面),3.第几个扇区 确定这三个,就能定位数据

二.抽象化磁盘(仅了解)

说完了实体的磁盘,我们的目标是了解文件在系统中是怎么样
将磁盘进行管理的。
但是我们直接将磁头磁盘磁道搬进去肯定是不行的。

所以我们需要将磁盘进行抽象化,理解成计算机好管理的方式。

我们知道磁盘在物理上是圆形的
但是在逻辑上可以把一个盘面想象成线性结构

我们知道磁盘中有多个磁面
这里我们可以把磁面看做一个线性结构(通俗点就是顺序表)
这样子的话,磁盘中的多个磁面就变成了多个线性结构
这样我们就可以把磁盘看做一个大的线性结构

在这里插入图片描述

现在磁面中还有磁道扇面

我们知道扇面是最小的存储单元
一个磁道上有多个扇面

一个磁面中有多个磁道
所以和磁面一样,可以把磁道看做一个线性结构
这样多个

里面每个单位都是扇面

在这里插入图片描述
基本上大致就能分成这样。

可以说,扇面就是最小的存储单位

如果我们想要在磁盘中进行存储和删除和修改内容时:
都要找到对应的扇面位置进行操作

所以首先就是要找到存储位置对应的扇面

经过上面将磁盘进行抽象化,我们能清楚的发现:
通过第几个盘面,第几个磁道,第几个扇面
我们就能准确得定位一个扇面的位置

在这里插入图片描述

我们上面讲了这么多,只是把一整个磁盘进行了抽象化了

在实际使用磁盘的时候,我们会将磁盘进行分区:

在这里插入图片描述
一块分成不同分区了以后,肯定要进行管理

接下来就轮到文件系统的登场了。

三.文件系统

在这里插入图片描述

1.什么是文件系统

上面我们是把磁盘进行了线性化,发现对应的内容进行存储的扇面进行定位,然后就能进行增删查改

但是我们在日常使用的时候,我们用户只是创建和删除文件而已,计算机甚至没有提到过扇面磁道磁面的概念

这就是文件系统作用了:

文件系统在用户层为用户提供了文件的增删查改的功能,在底层将用户的操作转化成对磁盘的操作

所以上面的磁盘只是了解一下,因为真正和磁盘打交道的是文件系统,不是用户
我们要做的是了解文件系统的操作和它的结构

不同系统的不同版本的文件系统可能都不用一样
所以这里就挑一个经典的文件系统进行讲解:Linux ext2文件系统

2.ext2文件系统的结构

结构大图:

在这里插入图片描述

这里能看到一个磁盘进行分区以后,一个大区中:
BootBlock和多个Block group
Boot Block主要功能是:在计算机启动时负责引导操作系统的加载和启动过程

一个大区中有多个Block group,我们主要讲的就是它的构成。

在这里插入图片描述
接下来讲分别讲解各个部分对应的作用

i.Date blocks

这算是Block group中最大的一个部分了
主要存储的是文件的内容
因为在linux中,文件的内容和文件的属性是分开来存储的
在这里插入图片描述

这里面的一个个块就是文件系统块
一般大小是4kb,一般都是磁盘格式化时定义好的

从底层看,一个快就是由一个个扇区组合而成的,可以说一个块就是一部分扇区的集合

一个文件可能由多个文件系统块组成

这里我们假设一个文件系统块是4kb,但如果一个文件实际内容大小就只有1kb

那这个文件依旧还是占据一个文件系统块

ii.Block Bitmap

听这个名字就知道,它是block的位图
最主要的作用是判断datablock中的用于存储的比特位分配情况

如果想要在Date block中写入数据,首先要通过Block的位图
找出没有被使用的区块号,然后返回给文件系统,对空闲的区块号进行数据写入

iii.inode

这里我们来了解什么是inode
还记得前面说过的:Linux中文件内容和文件属性是分开来存放的

inode就是一个结构体,描述的就是文件的属性
在这里插入图片描述
这里是随便列举的几个属性

但是其中有一个比较重要的:int blocks[nums]

这个是为了找到Blocks中存储的文件内容的对应的区块号
这里就通过图片让大家认识更清晰一点

这里用的是直接索引,对应的区块号存储的就是文件的实际内容
在这里插入图片描述

接下来就是间接索引
在这里插入图片描述

就比如这里的7,8,9区块号存储的是存储这个文件的内容的其他区块号

这种就叫做二级索引
要注意:可能不止有二级索引,还有可能有三级,四级索引

这种方法可以增加记录文件区块号的大小,只依赖block[nums]太少了

不光如此
每个文件都有一个单独的inode编号,系统中不是通过文件名来区分文件的, 而是通过inode编号区分的
文件名不属于inode中的属性
inode 编号是按照在该对应组的存储的顺序进行分配的
每个组都有自己对应的inode表和inode存储区域

1.inode Table

inode Table听名字就能大概知道:存储inode的地方

这里要注意,inode是有编号的。

磁盘分区后,不同区的inode是完全分隔的,没有关系。

就比如:
A区的inode编号100对应的可能是文件A
B区的inode编号100对应的可能是文件B

但是相同区的不同组inode虽然是分隔的,但是还是有关系的
比如A组的inode范围是0-100
那么B组的inode就要从101开始

这里要注意特殊情况
有可能会出现inode table存储完了,但是Dateblock 还没有用光
同样也会有可能inode table还有,但是Data Block用光了

2.inode Bitmap

这个和Block Bitmap一致,存储的就是inode table中的分配情况

iiiii.GDT

GDT记录了Block group内其他所有区域(inode bitmap,Block Bitmap等)的信息

包含了块组的相关信息,包括块位图的位置。通过读取块组描述符中的块位图位置,可以获得块组的分配情况。

iiiiii.Super block

SuperBlock是:
每个Block group的大小,每个Block group的inode数量,每个Block group的block数量,每个Block group的起始inode
这个SuperBlock不用每个组都有,因为它描述的是所有组的分类情况
但是也不能只有一个,因为一个如果挂掉了,整个磁盘的分类情况都要毁了

四.文件的增删查改

这里我们通过文件系统,来看看想要对文件进行增删查改,文件系统都进行了哪些操作?

1.创建一个文件需要干什么

1.创建文件一定是在一个路径下进行创建的,路径就能确定文件在哪个分区和哪个分组里面

2.找到对应分区和分组后,就是分配inode:

对应组的GDT会查看它记录的inode TableDataBlock占用的情况
如果空间足够,则会通过inodebitmap将最近一个没有被占用的inode编号,作为你的inode

如果还需要写入文件内容的话
3.写入数据
首先告诉写入了多少大小的数据,到GDT中查看是块使用情况,判断空间是否大小充足
在block bitmap中找到没有被使用的块号
将它传给对应的inode并写入Block[nums]中,之后到对应的data block中进行数据写入。

2.删一个文件需要干什么

1.找到文件对应的inode,在对应的inode中找到存储的对应的区块号
2.在block bitmap将对应的区块置0,表示该区块允许被覆盖
这里要注意不会去动data block中的内容
所以计算机中的删除相当于允许被覆盖

这就是为什么计算机中的拷贝复制很慢
因为需要动Data Block的内容
但是删除却很快,因为只是动了Bitmap将对应的区块置0,没有动 DataBlock

3.查找一个文件需要干什么

1,找到文件的inode,然后通过inode bitmap判断inode是否有效,
2.通过inode中的block,通过block bitmap判断内容是否有效
3.data block中进行读取内容

4.如何查找文件的inode

这里我们能发现:
这里面的每一步都是要找到文件的先找到文件对应的inode

在讲如何找到inode之前, 首先来聊一下目录:

如何理解目录?

目录也是文件,通过文件=内容+属性
所以目录也有内容,放的是该目录下所有的文件名字,和文件名对应的inode映射关系

所以想找到文件对应的inode:
就要找到自己所在的目录的文件内容中的自己的文件名和inode的映射关系

所以通过上面,我们可以想到以前没想到的几个问题:

1.为什么同一个目录下不能有同名文件
因为要通过文件名找到自己的inode

2.目录下没有w,我们无法创建文件
就算创建了文件夹,也无法将(没有权限)文件名和inode的映射关系写进目录中的内容中
3.目录下没有r,无法查看文件
因为想要读文件内容,也需要读目录中的文件名和inode映射关系,没有权限读不了

所以想找到文件对应的inode:就要找到自己所在的目录的文件内容中的自己的文件名和inode的映射关系
那也就是说要找到文件的名字,首先要找到目录的内容

需要找到目录的内容,就要找到目录的inode
要找到目录的inode,就要找到目录的目录的文件内容
这样不就无限查找上去了吗,确实是这样
但是查找到根目录就行了。

所以要访问文件,都需要一路向上递归,找到根目录,然后再一路返回,找到对应目录的inode,最后找到本文件的inode

这样确实效率很低,所以系统一般会将你经常访问的目录通过dentry缓存进行记录

通过这里我们就知道了
要查找文件就需要目录中有文件名和inode的映射关系

五.文件的软硬链接

1.什么是软链接

软链接:

ln 	      -s      file.txt    soft-link
         (soft)	   目标文件	  创建的软链接名

在这里插入图片描述

在这里插入图片描述
从这里的inode我们能看到
软链接是一个独立的文件,有独立的inode

所以:
软链接是一个独立的文件,有独立的inode有独立的数据块,里面存储的是指向的文件的路径
将软连接指向的文件进行删除后软链接就会失效
在这里插入图片描述

软链接就类似于win中的快捷方式

2.软链接的应用

软链接的应用就可以看做是windows中的快捷方式
快捷方式有啥作用应该也不用多讲了吧
应该大伙基本上都用过

3.什么是硬链接

硬链接:

ln 			test.txt    hard-link
             目标文件	创建的软链接名

在这里插入图片描述

从这里能看到:
硬链接不是一个独立的文件,没有独立的inode

所谓建立硬链接的本质其实是:
在特定目录的数据块中新增另一个硬链接文件名和指向被链接文件的inode编号的映射关系
类似于C++中的取别名

4.硬链接数

不知道大伙有没有发现:
在这里插入图片描述
在这里插入图片描述
创建一个 文件的硬链接后,这个数字发生了增加

相反的是软连接就不会有这个功能。

在这里插入图片描述

这个数字就叫做硬链接数

从名字上看:就是一个文件被硬链接的数量

但是我们回顾硬链接的本质:在特定目录的数据块中新增另一个硬链接文件名和指向被链接文件的inode编号的映射关系

所以说硬链接数就是有多少个文件名和这个inode建立了映射关系。

任意一个文件都有inode,每一个inode内部,都有一个叫做引用计数的计数器(表明有多少个文件指向我)
如果当计数器变成0的时候文件才会被删除,因为没有一个文件名能访问到这个inode了

这就是为什么硬链接的源文件被删除后,硬链接没有失效,因为引用计数没有变成0,还有文件名能访问到这个inode

5.硬链接的应用

硬链接有什么用
这里可以在回头看看目录
**加粗样式**
这里我们能发现
空的目录文件比常规文件的硬链接数多一个
空的目录文件多了两个文件:“.“”和 “…“

这里应该不难猜出: “.”其实是目录文件的硬链接

那也可以推出:"…"其实是父目录的硬链接

所以虽然硬链接的使用场景很少,但是是不可缺少的

6.硬链接和软连接的区别

这里来提两个问题:
1.软链接能连接目录吗?
2.硬链接能连接目录吗?

这个问题其实我们根据两个链接的原理其实就能猜出来
软链接存储的是链接目标的路径,是一个独立的文件

所以这里肯定是可以的

在这里插入图片描述
至于硬链接

硬链接的原理是:将硬链接创建的文件名和目标文件的inode产生依赖关系
相当于C语言中的取别名
这里我们来想想硬链接如果链接目录的问题:
如果一个A目录中塞进了一个硬链接B
同时这个硬链接B指向了A目录
但是硬链接只是类似于取别名,文件名不同,但是对应的inode是相同的
那么根据牛顿相对论,B硬链接A的同时,B也是被A硬链接的
这种情况就叫做循环链接

第二个问题:
1.软连接能跨系统吗
2.硬链接能跨系统吗

这其实也是想想原理就能理解的问题:
软链接只是记录了文件的路径,所以和文件啥系统没啥关系
但是硬链接就不一样了,它记录了文件名和inode的映射关系
先不说不同系统的文件系统不一致
inode在同一个盘中,不同分区的inode都不能通用,更别说跨系统了,跨区都难(在ext2中)

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

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

相关文章

VC 编程开发中的 封装类 :log日志类 和SQL server 操作类 源代码

VC 编程开发中的 封装类 :日志类 和SQL server 操作类 源代码 在VC(Visual C)开发中,日志文件输出是一个至关重要的环节,它对于程序调试、问题排查以及系统监控等方面都具有不可替代的作用。以下是对日志文件输出在VC开…

阿里云ECS服务器实例挂载数据盘步骤(磁盘自动挂载.、访问挂载点)

阿里云ECS服务器实例挂载数据盘步骤 相关指令 df -h 查看磁盘空间 du -sh * 查看使用内存大小1.磁盘自动挂载 首先登录阿里云ECS服务器,通过 df -h 命令查看当前磁盘挂载情况 通过 fdisk -l 命令查看磁盘情况,可以发现有两个盘: 系统盘 …

Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)

1 漏洞概述 CVE-2018-2628 是 Oracle WebLogic Server(WLS)核心组件中的一个反序列化命令执行漏洞。此漏洞允许未授权的用户通过 T3 协议在远程服务器上执行任意命令,从而可能完全控制受影响的服务器。 2 影响版本 该漏洞影响了以下版本的…

java 并发线程应用

java 并发线程相关 线程状态 新建(NEW): 创建后尚未启动。可运行(RUNABLE): 正在 Java 虚拟机中运行。但是在操作系统层面,它可能处于运行状态,也可能等待资源调度(例如处理器资源),资源调度完成就进入运行状态。所以该状态的可运行是指可以被运行,具体有没有运行要看底层…

国外新闻媒体推广:多元化媒体分发投放-大舍传媒

前言 :随着全球化的进程,国外新闻市场呈现出快速发展的趋势。在这个趋势下,国外新闻媒体推广成为了各行业企业宣传业务的重要一环。本文将重点介绍大舍传媒的多元化媒体分发投放服务,以及对国外新闻媒体推广的意义。 1. 多元化媒…

前端已死? Bootstrap--CSS组件

目录 Bootstrap 下载 Bootstrap--全局CSS样式 栅格系统 栅格参数 正常显示 实例 代码演示: 排版 代码演示 表格 代码演示 表单 代码演示 等等...(文档很清晰了) Bootstrap--组件 结合演示:(页面) Bootstrap Bootstrap v3 中文文档 Bootstrap 是最受欢迎的 HT…

Java项目实现报文数据校验注解方式(必输项、值大小)

普通项目 导入校验依赖 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.1.0.Final</version></dependency><dependency><groupId>javax.validation</…

lerna实战(一)

前言 将大型代码仓库分割成多个独立版本化的 软件包&#xff08;package&#xff09;对于代码共享来说非常有用。但是&#xff0c;如果某些更改 跨越了多个代码仓库的话将变得很 麻烦 并且难以跟踪&#xff0c;并且&#xff0c; 跨越多个代码仓库的测试将迅速变得非常复杂。 …

使用System.Drawing绘制基本几何图形

1.使用System.Drawing绘制一个正方形 using System; using System.Drawing; using System.Windows.Forms;public partial class MyForm : Form {public MyForm(){// 你可以在这里设置Form的双缓冲&#xff0c;以避免绘制时出现的闪烁 this.DoubleBuffered true;}protected o…

论文阅读:Self-Consistency Improves Chain of Thought Reasoning in Language Models

思维链 prompt 与预训练的大型语言模型相结合&#xff0c;在复杂的推理任务上取得了令人鼓舞的结果。在本文中&#xff0c;作者提出了一种新的解码策略&#xff0c;即自我一致性&#xff08;self-consistency&#xff09;&#xff0c;以取代思维链 prompt 中使用的 naive 贪婪解…

易货模式:引领交易新潮流,实现资源高效利用

随着全球经济的繁荣和科技的日新月异&#xff0c;传统的交易模式正面临革新。在追求高效、便捷与环保的当下&#xff0c;易货模式作为一种新兴的交易方式&#xff0c;逐渐崭露头角&#xff0c;受到越来越多人的青睐。 易货模式&#xff0c;简而言之&#xff0c;就是通过平台或在…

AI日报:OpenAI全能模型GPT-4o发布;阿里推自动化视频剪辑神器;AI作品会侵权吗?调研结果...;零一万物开源Yi-1.5模型

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;https://top.aibase.com/ 1、干翻所有语音助手&#x…

FreeRTOS中的动态内存管理(heap_1、heap_2、heap_3、heap_4)

FreeRTOS 提供了多种动态内存分配方案&#xff0c;这些方案通过不同的内存管理器&#xff08;heap managers&#xff09;实现&#xff0c;主要位于 FreeRTOS/Source/portable/MemMang 目录下。以下是几种常见的动态内存分配方案&#xff1a; heap_1 特点&#xff1a; 简单性…

np.linalg.norm()

np.linalg.norm()是NumPy中用于计算向量或矩阵的范数的函数。它可以计算不同类型的范数&#xff0c;包括向量的L1范数、L2范数以及矩阵的Frobenius范数等。 基本用法如下, numpy.linalg.norm(x, ordNone, axisNone, keepdimsFalse) x&#xff1a;输入数组&#xff0c;可以是…

【linux系统学习教程 Day02】网络安全之Linux系统学习教程,管道,文件内容统计,过滤排序,去重,目录介绍

1-4 管道 管道符号&#xff1a; | &#xff0c;可以将前面指令的执行结果&#xff0c;作为后面指令的操作内容。 ## 比如过滤ip地址 ip addr | tail -4 | head -1 解释一下就是先执行 ip addr ,得到的结果当做 tail -4 的输入&#xff0c;意思就是查看ip addr 结果的后四行内容…

高清模拟视频采集卡CVBS四合一信号采集设备解析

介绍一款新产品——LCC261高清视频采集与编解码一体化采集卡。这款高品质的产品拥有卓越的性能表现和丰富多样的功能特性&#xff0c;能够满足广大用户对于高清视频采集、处理以及传输的需求。 首先&#xff0c;让我们来了解一下LCC261的基本信息。它是一款基于灵卡技术研发的高…

linux学习:视频输入+V4L2

目录 V4L2 视频采集流程 代码例子 核心命令字和结构体 VIDIOC_ENUM_FMT VIDIOC_G_FMT / VIDIOC_S_FMT / VIDIOC_TRY_FM VIDIOC_REQBUFS VIDIOC_QUERYBUF VIDIOC_QBUF /VIDIOC_DQBUF VIDIOC_STREAMON / VIDIOC_STREAMOFF V4L2 是 Linux 处理视频的最新标准代码模块&…

苹果M4芯片:大模型本地运算的转折点

在人工智能和机器学习领域&#xff0c;大模型的兴起对硬件提出了前所未有的挑战。苹果公司最近推出的M4芯片&#xff0c;被视为其在这场竞赛中的“第一式”。本文将探讨M4芯片的特点&#xff0c;并与其他芯片进行比较。 M4芯片的亮点 Neural Engine算力&#xff1a;M4芯片的…

2024上半年软考准考证什么时候出?怎么打印?

2024上半年软考准考证打印时间&#xff1a; 北京&#xff1a;5月21日至5月24日 天津&#xff1a;5月21日9:00后 河北&#xff1a;5月20日起 山西&#xff1a;5月20日上午9:00至5月28日下午14:00 内蒙古&#xff1a;5月20日-5月25日 吉林&#xff1a;5月20日开始 辽宁&am…

批量剪辑与转码解析:一键实现MP4到FLV顺畅转换的技巧

在数字化多媒体日益盛行的今天&#xff0c;视频格式转换成为了我们日常生活和工作中不可或缺的一部分。尤其是当需要将MP4格式的视频转换为FLV格式时&#xff0c;批量剪辑与转码功能的出现&#xff0c;极大地提升了我们处理视频的效率。本文将为您详细解析云炫AI智剪如何一键实…