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

目录

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.mzph.cn/bicheng/60144.shtml

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

相关文章

WWDC24(Xcode 16)中全新的 Swift Testing 使用进阶

概述 WWDC 24 祭出的全新单元测试系统着实让苹果开发者们眼前一亮。“原来测试还可以这么爽!?”,日渐逼近蟋蟀发型的某位码农如是说。 Swift Testing 在简洁性以及灵活性全面超越老大哥 XCTest 的同时,也让秃头码农们真正见识到了…

k8s-service、endpoints、pod之间是怎么进行网络互通的

k8s-service、endpoints、pod之间是怎么进行网络互通的 1、service2、endpoints3、service、endpoints、pod通信图4、不同服务pod内部间访问 1、service 在K8S中,Service是一种抽象,定义了一组Pod的逻辑集合和访问这些Pod的策略。首先,我们需…

命令行工具PowerShell使用体验

命令行工具PowerShell使用 PowerShell是微软开发的一种面向对象的命令行Shell和脚本语言环境,它允许用户通过命令行的方式管理操作系统。相较于传统CMD,PowerShell增加了面向对象的程序设计框架,拥有更强大的功能和扩展性。使用PowerShell可…

企业IT架构转型之道:阿里巴巴中台战略思想与架构实战感想

文章目录 第一章:数据库水平扩展第二章:中台战略第三章:阿里分布式服务架构HSF(high speed Framework)、早期Dubbo第四章:共享服务中心建设原则第五章:数据拆分实现数据库能力线性扩展第六章&am…

【优选算法篇】微位至简,数之恢宏——解构 C++ 位运算中的理与美

文章目录 C 位运算详解:基础题解与思维分析前言第一章:位运算基础应用1.1 判断字符是否唯一(easy)解法(位图的思想)C 代码实现易错点提示时间复杂度和空间复杂度 1.2 丢失的数字(easy&#xff0…

在 WPF 中,绑定机制是如何工作的?WPF数据绑定机制解析

在WPF(Windows Presentation Foundation)中,数据绑定机制是其核心功能之一,广泛用于连接应用程序的UI(用户界面)和应用程序的业务逻辑层。数据绑定允许你将UI元素与数据源(如对象、集合或其他数…

基于 STM32 的天气时钟项目中添加天气数据的网络获取功能

基于 STM32 的天气时钟项目中添加天气数据的网络获取功能,您需要确保您的开发环境具备网络连接能力。这里以 ESP8266 Wi-Fi 模块为例,详细说明如何实现网络获取天气数据的功能。 1. 硬件连接 连接 ESP8266 模块 请参考以下连接方式,将 ESP82…

晓宇电视 1.9 | 电视直播软件,几千频道,高清秒播

晓宇电视是一款电视直播软件,提供数千个高清频道,支持秒播。最大的特色是没有广告,且不需要用户手动更新源地址。安装后即可使用,频道节目丰富,包括影视剧轮播专区,用户可以轻松观看喜爱的电影和电视剧。软…

双指针算法的妙用:提高代码效率的秘密(2)

双指针算法的妙用:提高代码效率的秘密(2) 前言: 小编在前几日讲述了有关双指针算法两道题目的讲解,今天小编继续进行有关双指针算法习题的讲解,老规矩,今天还是两道题目的讲解,希望…

MySQL:客户端工具创建数据库

MySQL 是一个开源的关系型数据库管理系统(RDBMS),用于存储、管理和检索数据。MySQL是基于SQL语言的,它具有高效、可靠、易用的特点。 客户端工具 这个mysqld.exe就在计算机安装的数据可服务,启动之后,mys…

使用python向钉钉群聊发送消息

使用python向钉钉群聊发送消息 一、在钉钉群中新建机器人二、使用代码发送消息 一、在钉钉群中新建机器人 在群设置中添加机器人 选择自定义 勾选对应的安全设置 完成后会展示webhook,将地址复制出来,并记录,后面会用到 二、使用代码发送消…

【芯智雲城】Sigmastar星宸科技图传编/解码方案

一、图传技术简介 图传是指将图像或媒体内容从一个设备传输到另外一个设备的技术,传输的媒介可以是无线电波、光纤、以太网等。图传系统主要由图像采集设备、传输设备和接收设备组成,图像采集设备负责采集实时图像,传输设备将采集到的图像转…

sql专题 之 常用命令

文章目录 查询基础语法查询全表查询选择查询&#xff1a;常量和运算&#xff1a; 条件查询where运算符&#xff1a;、 !、<、>空值&#xff1a;null模糊查询&#xff1a;like逻辑运算&#xff1a;and or not 去重&#xff1a;distinct排序&#xff1a;order by截断和偏移…

Linux学习笔记之定时任务调度

crond 任务调度 任务调度&#xff1a;指系统在某个时间执行的特定的命令或程序 任务调度分类&#xff1a;1.系统工作&#xff1a;有些重要的工作必须周而复始地执行&#xff0c;如病毒扫描等。 2.个别用户工作&#xff1a;个别用户可能希望执行某些程序&#xff0c;如对mysql数…

MyBatisPlus 用法详解

文章目录 一、快速入门1.1 引入依赖&#xff1a;1.2 定义 Mappper&#xff1a;1.3 使用演示&#xff1a;1.4 常见注解&#xff1a;1.4.1 TableName:1.4.2 TableId&#xff1a;1.4.3 TableField&#xff1a; 1.5 常见配置&#xff1a; 二、核心功能2.1 条件构造器&#xff1a;2.…

C++ -- 多态与虚函数

多态 概念 多态&#xff08;polymorphishm&#xff09;&#xff1a;通常来说&#xff0c;就是指事物的多种形态。在C中&#xff0c;多态可分为编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&#xff09;&#xff0c;这里我们重点讲的是运行时多…

ORU 的 Open RAN 管理平面 (M 平面)

[TOC](ORU 的 Open RAN 管理平面 (M 平面)) ORU 的 Open RAN 管理平面 (M 平面) https://www.techplayon.com/open-ran-management-plane-m-plane-for-open-radio-unit/ ORU M 平面 在 ORAN 中&#xff0c;设置参数的 O-RU 管理功能是通过 M-Plane 完成的。管理功能包括 O-…

使用Go语言编写一个简单的NTP服务器

NTP服务介绍 NTP服务器【Network Time Protocol&#xff08;NTP&#xff09;】是用来使计算机时间同步化的一种协议。 应用场景说明 为了确保封闭局域网内多个服务器的时间同步&#xff0c;我们计划部署一个网络时间同步服务器&#xff08;NTP服务器&#xff09;。这一角色将…

电信网关配置管理系统 upload_channels.php 文件上传致RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…

STM32H503开发(2)----STM32CubeProgrammer烧录

STM32H503开发----2.STM32CubeProgrammer烧录 概述硬件准备视频教学样品申请源码下载参考程序自举模式BOOT0设置UART烧录USB烧录 概述 STM32CubeProgrammer (STM32CubeProg) 是一款用于编程STM32产品的全功能多操作系统软件工具。 它提供了一个易用高效的环境&#xff0c;通过…