Ext2 文件系统:数字世界的基石,深度解码超时空存储魔法

本篇博主将带大家深入底层探秘系统是如何与磁盘进行相互交流的,配合精美配图,细节讲解来带大家深入探究(注:本篇文章建议了解磁盘内部物理结果组成及设计再进行阅读)。 

  羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C++题海汇总,AI学习,c++的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c++,c语言,ubuntu,linux,数据结构领域.https://blog.csdn.net/2401_82648291?spm=1010.2135.3001.5343https://blog.csdn.net/2401_82648291?spm=1010.2135.3001.5343

 欢迎拜访:羑悻的小杀马特.-CSDN博客

本篇主题:秒懂系统磁盘交互

制作日期:2025.01.18

隶属专栏:linux之旅

目录

一·磁盘内部的划分:

1.1superblock:

1.2GDT:

1.3block bitmap:

1.4inode bitmap:

1.5inode table:

1.6Data blocks:

二·目录与文件:

三·系统与磁盘如何交互:

3.1路径解析:

3.2路径缓存:

3.3 挂载分区:

四·系统(进程)与文件交互总结: 

​编辑

五·软硬链接:

5.1软链接:

5.2硬链接:

六.软硬链接在系统中的差异:


 

一·磁盘内部的划分:

首先就先默认我们都已经学习了解了磁盘物理结构和设计,那么下面磁盘是分成这样,请看图:

首先是分区:我们最小单位是扇面,其次可以比它大来分区如: c d盘:。

然后就是我们的分组。

下面分讲一下每个组含有的都是啥意思: 

1.1superblock:

存放文件系统本身的结构信息,描述整个分区的文件系统信息。记录的信息主要有: bolck和inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等他文件系统的相关信息 

 说白了就是储存着每一个分区的一些信息,对分区很重要,因此需要多个备份放在当下分区的不同组块中(防止被删除) 

1.2GDT:

对块组的介绍以及记录块组内其他部分有啥分布等 
 

1.3block bitmap:

每个bit表⽰⼀个inode是否空闲可⽤。

1.4inode bitmap:

判断块占用情况,方便到时候知道哪个文件被删除了,还是要创建哪里的文件 。

1.5inode table:

存放⽂件属性如⽂件⼤⼩,所有者,最近修改时间等,当前分组所有Inode属性的集合。

多个结构体的集合;

里面存放着不仅仅是inode及一些其他属性还有inode对应的块(可以同组也可以不同组,后面讲)

每个结构体的大小都是相等的都是128字节;又因为这个集合大小是4kb故我们可以得出最多可以放32个inode结构体。

这里我们再阐述一个事实:

inode和block都可以跨组但是不能跨分区:

即同一个分区内部inode和块编号都是唯一的。

下面我们来解释一下:

就是我们的inode和块的编号可以从组之间是连续的;但是分区和分区之间不能连续每个分区开始的编号都是0。

其实inode结构体有一个记录它所对应的块的类似数组的东西,可以方便我们根据inode找到对应的文件数据位置;下面形象看一下:

这样就实现了我们小的空间可以找到inode对应的大量的块了。 

那么下面我们该如何知道对应文件名字它的inode(指令ls -li):

 

1.6Data blocks:

据不同的⽂件类型有以下⼏种情况:

1·对于普通⽂件,⽂件的数据存储在数据块中。

2·对于⽬录,该⽬录下的所有⽂件名和⽬录名存储在所在⽬录的数据块中看到的其它信息保存在该⽂件的inode中。

二·目录与文件:

访问文件,必须打开当前目录,根据文件名,获得对应的inode号,然后进行文件访问(目录中内容是里面文件以及和inode对应关系) ;本质是必须能打开当前工作目录文件,查看目录文件的内容!

当然了目录它也是文件了;遵循着文件的规律也就适用于目录了;只需要目录结构就好了。

三·系统与磁盘如何交互:

3.1路径解析:

都要从根目录开始,依次打开每一个目录,根据目录名,依次访问每个目录下指定的目录,直到访问到test.c。这个过程叫做Linux路径解析。 

本质就是在磁盘文件系统中,新建目录文件。而你新建的任何文件,都在你或者系统指定的目录下新建,这不就是天然就有路径了嘛 !

 

说白了就是查找某个文件首先要先上推然后返回来找到的过程罢了。 

3.2路径缓存:

如果向上面一样查找一直往回找到根目录的话就太慢了,因此实际不是这样的。

这里系统默认从根(/)开始缓存。

因此我们下面就要引出dentry:

Linux中,在内核中维护树状路径结构的内核结构体叫做: struct dentry;来缓存历史路径

每个文件相当于一个dentry结构体节点把他们串起来:

下面大概举例一下一些dentry存的结构:

 

每个文件都对应的有dentry然后系统把它多叉起来(其中这个结构不仅参与文件查找还有一系列与文件相关的任务->"网状") 
 

3.3 挂载分区:

谈到这里,我们首先要明白:

分区写⼊⽂件系统,⽆法直接使⽤,需要和指定的⽬录关联,进⾏挂载才能使⽤。

所以,可以根据访问⽬标⽂件的"路径前缀"准确判断我在哪⼀个分区。


因此我们可以知道每个目录都会挂有分区,我们对其内文件操作必然要通过这个目录找到分区.

下面我们就来看看分区是如何挂到目录上的:

四·系统(进程)与文件交互总结: 

首先先看张图:

五·软硬链接:

5.1软链接:

软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和被引⽤的⽂件的inode不同,应⽤常⻅上可以想象成⼀个快捷⽅式。

说白了我们可以理解为快捷方式即:

这就是一个软链接。

指令: ln -s  要软链接源文件  链接文件(快捷方式) ;取消是unlink +链接文件

里面存的是abc的文件路径,访间abc.s即去拿到abc路径再访间abc:而册掉abc.s后abc还是存在的。

 用途:作为快捷方式,方便查找(当我们删除后,它真正文件并没有删除)

5.2硬链接:

我们看到,真正找到磁盘上⽂件的并不是⽂件名,⽽是inode。其实在linux中可以让多个⽂件名对应于同⼀个inode。
 

指令:ln 要软链接源文件  链接文件(快捷方式) ;取消是unlink +链接文件

 

这里其实就用到了引用计数。

硬链接文件inode和源文件相同也就是都是指向同一个inode这就产生了引用计数:

故: 

1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
 

 用途:./..的使用以及备份工作。

六.软硬链接在系统中的差异:

软连接是独⽴⽂件;硬链接只是⽂件名和⽬标⽂件inode的映射关系;下面请看图:

这里还有个小疑问:就是目录可以软链接但是不能硬链接? 

解释下: linux系统只允许自己硬链接(./..),但是不允许用户操作;而软链接无要求。 
 

 

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

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

相关文章

在centos上编译安装opensips【初级-默认安装】

环境:centos9 last opensips3.2 dnf update -y dnf install -y gcc make git automake libtool pcre-devel libxml2-devel \libcurl-devel postgresql-devel \bzip2-devel zlib-devel ncurses-devel libuuid-devel \libpcap-devel # 有报错的直接删除cd /usr/lo…

从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)

从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CI/CD) 目录 项目初始化:构建一个简单的 Node.js 应用设置 Docker 环境:容器化你的应用配置 CI/CD:自动化构建与部署上线前的最后检查:…

类和对象——类的对象占用内存的大小计算

类的对象大小的计算 类的对象大小的计算1 案例分析2 如何计算类对象的大小案例分析中的猜测结构体内存对齐规则 类的对象大小的计算 1 案例分析 #include<iostream>class Date { public:void Init(int year, int mouth, int day) {year year;_mouth mouth;day_ day;…

nuxt3项目打包部署到服务器后配置端口号和开启https

nuxt3打包后的项目部署相对于一般vite打包的静态文件部署要稍微麻烦一些&#xff0c;还有一个主要的问题是开发环境配置的.env环境变量在打包后部署时获取不到&#xff0c;具体的解决方案可以参考我之前文章 nuxt3项目打包后获取.env设置的环境变量无效的解决办法。 这里使用的…

如何使用CRM数据分析和洞察来支持业务决策和市场营销?

如何使用CRM数据分析和洞察来支持业务决策和市场营销&#xff1f; 大家好&#xff01;今天咱们聊聊一个特别重要的话题——如何利用客户关系管理&#xff08;CRM&#xff09;系统中的数据进行分析与洞察能够帮助我们做出更好的业务决策以及提升市场营销效果。其实啊&#xff0…

关于linux的ld.so.conf.d

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

STM32-CAN总线

1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线&#xff08;CAN_H、CAN_L&#xff09;&#xff0c;线路少&#xff0c;无需共地差分信号通信&#xff08;相对的是单端信号&#xff09;&#…

在线宠物用品|基于vue的在线宠物用品交易网站(源码+数据库+文档)

|在线宠物用品交易网站 目录 基于springbootvue的在线宠物用品交易网站 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&am…

StarRocks 怎么让特定的SQL路由到FE master节点的

背景 本文基于 StarRocks 3.1.7 大家都知道对于Starrocks来说 FE 是分 master和follower的&#xff0c;而只有master节点才能对元数据进行写操作。但是为什么呢&#xff1f;哪里有体现呢&#xff1f; 这其中的原因在网上是搜不到的&#xff0c;所以大家只知道只有master节点才…

JavaScript语言的正则表达式

JavaScript语言的正则表达式详解 正则表达式&#xff08;Regular Expression&#xff0c;简称Regex或RegExp&#xff09;是一种强大的文本处理工具&#xff0c;可以在字符串中执行模式匹配和替换操作。在JavaScript中&#xff0c;正则表达式是处理字符串时不可或缺的部分&…

Android SystemUI——快捷面板的创建(十四)

上一篇文章介绍了快捷面板界面 QSFragment 的创建流程,这里我们继续介绍快捷按键 QSTile 和管理 QSTile 生命周期和服务注册的 QSTileHost。 一、QSTileHost初始化 Android 9.0 以及之前的版本,实例化 QSTileHost 类是在 StatusBar 的 makeStatusBarView() 方法中。 1、Sta…

AI时代下 | 通义灵码冲刺备战求职季

AI时代下 | 通义灵码冲刺备战求职季 什么是通义灵码使用智能编程助手备战求职靠谱吗体验心得 AI时代下&#xff0c;备战求职季有了不一样的方法&#xff0c;使用通义灵码冲刺备战求职季&#xff0c;会有什么样的体验&#xff1f; 什么是通义灵码 在开始话题之前&#xff0c;首…

Qt之QDjango-db的简单使用

QDjango是一款由C编写、依托于Qt库的Web开发框架&#xff0c;其设计理念受到了广受欢迎的Python框架Django的影响。这个项目旨在提供一个高效、灵活且易于使用的工具集&#xff0c;帮助开发者构建高质量的Web应用。其项目地址: https://gitcode.com/gh_mirrors/qd/qdjango&…

冯诺依曼架构和哈佛架构的主要区别?

冯诺依曼架构&#xff08;Von Neumann Architecture&#xff09;和哈佛架构&#xff08;Harvard Architecture&#xff09;是两种计算机体系结构&#xff0c;它们在存储器组织、指令处理和数据存取等方面有明显的不同。以下是它们的主要区别&#xff1a; 1.存储器结构 冯诺依曼…

NoETL | 数据虚拟化如何在数据不移动的情况下实现媲美物理移动的实时交付?

在我们之前的文章中&#xff0c;我们回顾了Denodo在逻辑数据仓库和逻辑数据湖场景中所使用的主要优化技术&#xff08;具体内容请参阅之前的文章&#xff09;。 数据架构 | 逻辑数据仓库与物理数据仓库性能对比_物理数仓、逻辑数仓-CSDN博客文章浏览阅读1.5k次&#xff0c;点赞…

【Linux】Linux重要工具

Linux中一切皆文件&#x1f493;&#x1f493;&#x1f493; 目录 ✨说在前面 &#x1f34b;知识点一&#xff1a;Linux软件包管理器yum •&#x1f330;1. 什么是软件包 •&#x1f330;2. 查看软件包 •&#x1f330;3. 如何安装、卸载软件 &#x1f34b;知识点二&#…

JS通过ASCII码值实现随机字符串的生成(可指定长度以及解决首位不出现数值)

在之前写过一篇“JS实现随机生成字符串&#xff08;可指定长度&#xff09;”&#xff0c;当时写的过于简单和传统&#xff0c;比较粗放。此次针对此问题&#xff0c;对随机生成字符串的功能进行优化处理&#xff0c;对随机取到的字符都通过程序自动来完成。 在写之前&#xff…

K8S-Pod资源清单的编写,资源的增删改查,镜像的下载策略

1. Pod资源清单的编写 1.1 Pod运行单个容器的资源清单 ##创建工作目录 mkdir -p /root/manifests/pods && cd /root/manifests/pods vim 01-nginx.yaml ##指定api版本 apiVersion: v1 ##指定资源类型 kind: Pod ##指定元数据 metadata:##指定名称name: myweb ##用户…

【C++】在线五子棋对战项目网页版

目录 1.Websocket 1.1.Websocket的简单认识 1.2.什么是轮询呢&#xff1f; 1.3.websocket协议切换过程 1.4.websocketpp库常用接口认识 1.5.websocketpp库搭建服务器流程 1.6.websocketpp库搭建服务器 2.mysqlclient库-接口认识 3.项目模块的划分&#xff1a; 4.项目…

pytest+playwright落地实战大纲

前言 很久没有更新博客&#xff0c;是因为在梳理制作Playwright测试框架实战相关的课程内容。现在课程已经完结&#xff0c;开个帖子介绍下这门课程&#xff08;硬广, o(〃&#xff3e;▽&#xff3e;〃)o&#xff09; 课程放在CSDN学习频道&#xff0c; 欢迎关注~ PyTestPl…