Linux相关概念和易错知识点(19)(HDD、Block group)

news2024/11/23 22:05:59

目录

1.HDD

(1)HDD存储描述

(2)HDD结构图

(3)磁盘管理的分治思想

(4)硬盘中文件系统的整体划分图

2.Block group

(1)文件管理

①文件属性的存储

②inode分配和管理

③Data blocks存储和inode存储的解耦合、组的设计和文件设计的解耦合

④常见文件管理

(2)分区的格式化

(3)inode如何映射数据块

(4)inode和文件名的映射


1.HDD

(1)HDD存储描述

HDD磁盘是利用磁铁的磁性来存储数据的。永磁铁的两个磁性分别对应数据的0、1。一块HDD磁盘实际上是由三块竖直叠放的磁盘(正反共6个面)构成的,每个面都可以存放数据。每个面都有磁头紧贴但悬空在盘面上。所有磁头连接在一个传动臂(机械臂杆)上,由传动臂的运动来定位磁盘不同位置。所有磁头从竖直方向看都始终重合,它们受传动臂约束同步运动,都指向每个盘面的同一个相对区域。

(2)HDD结构图

下面是对HDD物理结构和逻辑结构的剖析,按照顺序看完,我们就能大致明白HDD的写数据模式了。

(3)磁盘管理的分治思想

通过上图的解析,管理磁盘从管理物理结构变成了对数组的管理,但磁盘太大,OS不可能一次性全部管完,因此就像我们国家分成多个省一样,磁盘需要分区管理每个分区互不干扰,一个分区坏了不会影响另一个分区。同时仅仅分区还是太大了,磁盘的每个分区还分成了几个组(Block group),我们只需要管理好每个组就可以了。一个组里面又由多个部分组成,每个都对文件的存储有特定的管理,我们后续会讲到。我们需要注意的是,OS管理数据的最小单位是数据块(一般都是几KB,而不是扇区),每次写入读出都是以数据块为单位进行的。

总之,我们在这一步需要进一步理解磁盘管理的分治思想,这是后面详细理解每个组里面的不同部分的功能的关键。

(4)硬盘中文件系统的整体划分图

每一层向下划分都有对应的管理者,如分区表、BootBlock、超级块,我们了解即可。我们重点关注每一组下面的其它分组,理解整个文件存储和读取流程对我们认识文件很有帮助。

2.Block group

(1)文件管理

文件 = 文件内容 + 文件属性

①文件属性的存储

文件属性通过inode的结构体专门存到Block group的inode Table里面(每个文件都有自己独一无二的inode,inode都配有一个编号用于唯一性标识)。inode里面存储了当前组所有文件的属性信息(权限、属性、大小等,但注意文件名不存在inode里面)。每次存储一个inode,inode Bitmap和GDT里面都会进行相应的更新,这些细节我们注意即可。

但有一点非常重要,inode是以分区为单位分配的,不能跨文件系统。每个分区一套inode编号方法,因此不同分区的inode编号有可能相同。但在同一分区下,inode是全局且唯一的,针对不同组inode永远不会重复。

②inode分配和管理

由于inode在一个分区里是全局且按顺序分配的,GDT存储inode在该组的起始编号,这个起始编号对应inode Bitmap和inode Table的第0位,同时GDT还掌握该组允许的inode最大数量。每个组的GDT都这样处理,由此一来查找inode就会变得非常简单,仅需对GDT进行访问即可知道该组有没有要查找的inode

因此创建inode会依次到inode Bitmap里面找0位置,再对应到inode Table里面开辟空间并写入数据,最后更新GDT和inode Bitmap。之后就需要存储内容了。我们需要知道,存储数据时会在GDT找Block Bitmap的空闲块,最后在对应的Data blocks存数据。但如果这个时候Data blocks存满了呢?inode是白白创建了吗?我们需要删掉这个inode,直到找到一个能存数据的组再创建inode并存储吗?

③Data blocks存储和inode存储的解耦合、组的设计和文件设计的解耦合

数据块号和inode都是全局建立的,可以跨组。在Data blocks中每个数据块都有自己的下标,由GDT里面存储的起始块号 + 当前下标就能得到Data blocks里面的全局数据块号。这就导致数据块在全局都不会搞混,同一分区下可以跨组。

当我们要存储数据时,会根据GDT里面的inode分配情况先找到空位。这里我们需要注意每个组inode的个数,Data blocks里面数据块的个数都是固定的。当找到空位置之后,inode就被创建下来了,这个时候再去根据GDT找数据块的分配情况,将有空位的数据块占用了,并将占用的数据块号存到inode里面。这个块号是全局的,只要找到了inode,根据里面存储的块号一定能找到数据块,就算数据存在和inode完全不同的组。

我们能够发现,这样存数据,inode可以依次将所有组中inode Table填满,Data blocks也能依次存储,它们之间不需要强行要求一起存在一个组。数据存自己的,inode也存自己的,磁盘存储数据的利用率也会上升,只要inode里面用块号定位数据块就永远不怕定位失败。这就叫Data blocks存储和inode存储的解耦合。同时组的设计和文件的存储解耦合,文件存储再也不受组的限制。

理解了这一点,分配和定位inode、数据块都不再是问题,只需要比较起始inode或起始块号 + inode或块号的存储个数就能找到对应的数据,具体而言我们可以通过inode里面的数据块号找数据,也能通过块号反定位inode,这些都是可行的。到这里,我们也能理解为什么inode和块号会设计成全局。

④常见文件管理

如何查找文件?知道分区和inode编号后,先通过GDT确定组,再通过inode Bitmap和inode Table确定inode内容,进一步确定块号,和查找inode的方法一样找到文件。

如何删除文件?先查找inode,直接将inode Bitmap置0即可,再根据inode内容找到数据块号,根据块号去找Block Bitmap并置0,与此同时GDT更新数据块和inode的空闲情况。这也告诉我们如果误删了文件,最好的办法是什么都别做,因为所谓删除只是修改状态,想办法修改回Bitmap和GDT是最重要的,如果这部分磁盘被新数据覆盖了就无力回天了。

如何修改文件?先将inode或内容加载到内存中,修改了再写回去。

如何新增文件?先根据GDT找一个组(参考文件大小、名称等),具体根据inode Bitmap来分配inode,再在全局范围内分配Block Bitmap。GDT时刻更新。

以上就是在硬盘侧对文件的管理,那么OS侧应该通过什么渠道来管理呢?遍历寻找inode或块编号是怎么进行的呢?

我们只需将Super Block和GDT的内容保存在内存中,进行内存级操作和访问,就能进一步对inode编号、块编号等做出判断并及时操作。这依然是先描述再组织的思想。

(2)分区的格式化

当我们进行分区格式化时,就算当时我们不写数据,也要初始化组里面的各个部分,针对GDT、Bitmap、Table、blocks写入一些基本信息,这叫格式化。格式化的本质是向一个分区写入空的文件系统,注意这是以分区为单位的,对一个分区进行格式化不会影响其他分区。

(3)inode如何映射数据块

inode作为文件属性,它是如何映射到数据块呢?我们只知道大概是通过存储全局块号进行的,但具体怎样仍未讲清楚。

inode里面有一个数组int block[15]存储全局的块编号。前12个直接映射全局块号,能直接通过GDT映射到块中,这些块直接存文件数据后续三个其实也是全局块号,但对应里面存的数据并不是文件数据,而是一级、二级、三级间接块索引表指针。

一级间接块索引指针大小就是一个数据快的大小,它的内容是除最开始12个块以外其它存文件数据的块号二级索引指针也不保存文件数据,数据块里存的是其它一级索引的块号;三级索引指针存二级索引指针的块号。三级指针保证文件大小上限能够达到TB级别,同时保证inode里面的数组int block[15]大小恒定,都是15 * 4个字节。这就使得所有文件的inode大小都是恒定的,文件的最不可控因素就是文件的大小,当这个存储索引的问题解决后,所有文件的inode都可以是固定字节的。

因此inode这个结构体大小固定、稳定,可以有效提高文件的访问效率。

(4)inode和文件名的映射

文件名不属于inode,文件名是目录文件的内容。文件名和inode在目录文件中组成了一一映射的关系,当我们使用文件名进行定位时,本质是转换为inode进行定位。但目录文件是什么?我们需要进一步介绍。

目录文件本质也是一个文件(inode属性 + 内容)。目录的内容(即Data blocks存的内容)里面存的是文件名和inode的映射关系。当我们用文件名查找时,就在当前目录文件里映射查找inode,这也能解释同一级目录下不能有同名文件,这违反了map的基本特性。

理解到了这一点,我们重新梳理目录权限,没有r就没办法读取文件名和inode,拿不到inode,自然无法显示具体信息;同样的,无w就写不了映射关系,也就无法新建文件,改变文件映射等;没有x本质上就意味着打不开目录文件。很明显,像ls -i -l操作就是通过文件名的映射,获取inode里面的部分属性向我们展示的。

从这种映射关系中,我们也知道了对Linux系统来说,文件名、用户名这些字符串会降低系统效率,对系统来说,inode编号、UID等数字的处理才是高效率的。

(5)初步认识文件系统

上述所说都是针对ext系列文件系统。一块磁盘可以有多个分区,每个分区可以有不同文件系统(一块磁盘可以有不同文件系统,它们是以分区为界限的)。不同文件系统意味着对数据的保存、管理、解读的不同。除了ext系列文件系统外,还有XFS、Btrfs等。

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

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

相关文章

【跟着官网学技术系列之Java】第1天之Java开胃菜

前言 在当今信息爆炸的时代,拥有信息检索的能力很重要。 作为一名软件工程师,遇到问题,你会怎么办?带着问题去搜索引擎寻找答案?亦或是去技术官网,技术社区去寻找? 根据个人经验,一…

网络自动化03:简单解释send_config_set方法并举例

目录 拓扑图设备信息 netmiko涉及方法send_config_set()方法的简单示例代码输出结果代码解释导入模块配置信息config_device_interface_description 函数主程序块总结 send_config_set方法参数:1. enter_config_mode2. config_commands3. enter_config_mode4. error…

vue2,vue3,uniapp,小程序实现前端url生成二维码

最近遇到一个项目,api返回url地址,前端通过地址生成二维码。 话不多说直接上代码,亲测有效,希望能帮助大家,同时如果有更好的方法希望大家能够分享 1、第一步,在项目的utils文件夹下面创建一个weapp-qrco…

openlayers实现图层裁剪,只展示关心区域,抹掉无关区域,“抠”地图

先给大家看一下效果: 很久没有用ol了,今天突发奇想,想完成一下在ol中如何实现图层裁剪,抹掉消除非关心区域的地图的操作。过去写了有关于遮罩和掩膜的教程,现在看来好像有点低级,不足以满足需求,于是我们重新来做一下。 首先要知道ol官方是支持canvas参数传递的,就是说…

SpringBoot框架:共享汽车管理的创新工具

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 共享汽车管理系统的系统管理员可以管理用户,可以对用户信息修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 投放地区管理 系统管理员可以对投放地区信息进行添加&#…

初学者指南:用例图——开启您的软件工程之旅

目录 背景: 基本组成: 关联(Assciation): 包含(Include): 扩展(Extend): 泛化(Inheritance): 完整银行…

MySQL —— Innodb 索引数据结构

文章目录 不用平衡二叉树或红黑树作为索引B树适合作为索引比B树更适合作为索引的结构——B树总结 MySQL 使用 B树索引数据结构(因为默认使用 innodb 存储引擎) B树:有序数组 平衡多叉树;B树:有序数组链表 平衡多叉树…

安信金业:3d黄金跟999足金的区别

黄金饰品,作为一种永恒的象征,一直备受人们的喜爱。随着工艺技术的不断革新,黄金饰品也呈现出多元化的风格。近年来,3D硬金逐渐走入人们的视野,与传统的999足金形成了鲜明的对比。那么,3D硬金和999足金究竟…

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计,使得Mac book有着非常棒的使用体验,但是在Mac电脑的使用时间过长时,电脑也会出现响应速度变慢或应用程序崩溃的情况,当发生的时候却不知道什么原因导致的,想要查询电脑…

c语言其实很简单----【数组】

TOC 1.输入10个学生成绩&#xff0c;计算及格人数&#xff0c;平均成绩&#xff0c;总成绩。 #include<stdio.h> int main(){float score[10];int i ,cut;float avar0.0,sum0.0;for(i0;i<10;i)scanf("%f",&score[i]);//输入10个学生的成绩cut0;for(i0…

音视频入门基础:H.264专题(22)——通过FFprobe显示H.264裸流每个packet的信息

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

centos7的maven配置

首先进入conf配置文件夹下的setting.xml 要改两个地方 第一&#xff1a;设置镜像源 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>c…

【优选算法 — 滑动窗口】滑动窗口小专题(一)

长度最小的子数组 长度最小的子数组 题目解析&#xff1a; 对于示例一 对于剩下两种示例&#xff1a; 解法一&#xff1a;暴力枚举 把所有的子数组全部枚举出来&#xff0c;并且枚举出的每一个子数组求和判断&#xff0c;返回长度最小的子数组&#xff1b; 时间复杂度 &…

从零创建vue+elementui+sass+three.js项目

初始化&#xff1a; vue init webpack projectnamecd projectnamenpm install支持sass: npm install sass --save-dev npm install sass-loader7.1.0 --save-dev npm install node-sass4.12.0 --save-devbuild/webpack.base.conf.js添加 rules: [...,{test: /\.scss$/,loade…

Golang--网络编程

1、概念 网络编程&#xff1a;把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统&#xff0c;从而使众多的计算机可以方便地互相传递信息、共享数据、软件、数据信息等资源。 客户端&#xff08;Client&#xff09; 客户端是请求服务…

RNN(循环神经网络)详解

1️⃣ RNN介绍 前馈神经网络&#xff08;CNN&#xff0c;全连接网络&#xff09;的流程是前向传播、反向传播和参数更新&#xff0c;存在以下不足&#xff1a; 无法处理时序数据&#xff1a;时序数据长度一般不固定&#xff0c;而前馈神经网络要求输入和输出的维度是固定的&a…

Parallax.js:让智能设备视差效果更智能、更自然

今天给大家分享一款功能非常强大的javascript视觉差特效引擎插件&#xff1a;Parallax.js。 Parallax.js简介 Parallax.js是一个简单的&#xff0c;轻量级的视差引擎。你可以将它作为作为jQuery或Zepto插件来使用&#xff0c;也可以以纯JS的方式来使用。 最-最-最厉害的是它…

【三维重建】Semantic Gaussians:开放词汇的3DGS场景理解

文章目录 摘要一、引言二、主要方法1.3D Gaussian Splatting2.其他方法2.1 Gaussian Grouping&#xff08;ECCV 2024&#xff09;2.2 GARField 3. 2D Versatile 投影4. 3D Semantic Network4. 推理 四、实验1. 实验设置2.定量结果 论文&#xff1a;https://arxiv.org/pdf/2403.…

【功能介绍】信创终端系统上各WPS版本的授权差异

原文链接&#xff1a;【功能介绍】信创终端系统上各WPS版本的授权差异 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于信创终端操作系统上WPS Office各版本&#xff08;不包括政务版、企业版等&#xff09;之间的差异的文章。WPS Office作为国内广泛使用的办公软…

Elmo驱动器上位机软件的详细配置

续接上文,本文讲解Elmo驱动器上位机软件更详细的配置,重点关注,在电机的位置受到约束的情况下,完成驱动器的参数整定过程,以及一些调试方法 一 硬件介绍 本文使用的是另一套设备,假设电机的位置是受到约束的 1 编码器规格书 编码器已知信息是 :读数头是26位的,通讯…