【Linux】C文件系统详解(四)——磁盘的物理和抽象结构

news2024/11/15 18:34:24

文章目录

  • 磁盘结构
    • 磁盘物理结构
    • 磁盘的具体物理结构
    • 磁盘结构的逻辑抽象
  • 文件系统
    • BootBlock
    • SuperBlock
    • GroupDescriptorTable
    • inode table
    • DataBlocks
    • inodeBitmap
    • blockBitmap
    • linux中的inode 和文件名
    • 如何理解文件的增删查改
    • 补充细节
      • 1.如果文件误删了,我们该怎么办?
      • 2.inode确定分组,inode number是在一个分区内有效,不能跨分区
      • 3.上面我们学到的分区,分组,填写系统属性->谁做的呢?什么时候做的呢
      • 4.我们如果inode只是单单地用数组和datablock的映射关系
      • 5.有没有可能一个分区,数据块没用完,inode没了,或者inode没用完,datablock用完了

磁盘结构

磁盘物理结构

磁盘是计算机上唯一的一个机械设备,同时还是外设->非常慢(相对于cpu/内存)
磁头和盘面是没有挨着的,但是距离依旧很近:好比波音747距离地面一米飞行

对数据做写入和读取:更改基本元素的南北磁极
![[基础IO 2023-11-17 10.43.58.excalidraw|900]]

![[Pasted image 20230325115202.png]]

向磁盘写入:N->S
删除磁盘数据:S->N
所以一旦摩擦生热,就会消磁,数据就会丢失了

磁盘的具体物理结构

尝试在硬件上,理解数据的一次读和写
![[基础IO 2023-11-17 11.03.04.excalidraw|900]]

磁盘中存储的基本单元:扇区,一般是512字节(4096个比特位),也有4kb字节的
一般磁盘,所有的扇区,都是512字节
半径相同的所有扇区,构成一圈"磁道"(多个面的相同磁道形成一个柱面)
在一面上,如何在硬件上定位一个扇区呢?
首先定位哪一个面:只需要确定用哪一个磁头读取,磁头的编号表示的就是哪一个面
然后:

  1. 先定位在哪一个磁道->由半径决定
  2. 再确定在该磁道的哪一个扇区->根据扇区的编号来定位一个扇区

磁头 head->柱面(磁道) cylinder->扇区 sector
CHS定位法

而一个普通文件(属性+数据) ->都是数据(0/1) -> 无非就是占用一个或者多个扇区,来进行自己的数据存储的.
我们既然能够用CHS定位任意一个扇区,我们就肯定能定位多个扇区,从而将文件从硬件角度,进行读取或者写入

磁盘结构的逻辑抽象

根据以上内容,如果OS能够得知任意一个CHS地址,就能访问任意一个扇区
但是OS内部不是直接使用的CHS地址
为什么?

  1. OS是软件,硬件定位一个地址是用得CHS,但是,如果OS直接用了这个地址,万一硬件变了,OS也要发生变化.OS要和硬件做好解耦工作
  2. 即便是扇区,512字节,单位IO的基本数据量也是很小的,硬件是按照512字节处理,OS实际进行IO,基本单位是4KB(可以调整->通过编译linux源代码),因此我们把磁盘叫做块设备. 所以OS需要一套新的地址来进行块级别的访问

我们将圆形的磁盘盘面想象为一个线性结构:
![[基础IO 2023-11-17 21.12.02.excalidraw|900]]

可是我们磁盘只认CHS
所以我们需要让LBA和CHS互相转换

通过简单的数学运算就可以做到:
伪代码:
假设两个面,每个面5000个扇区,每个磁道500扇区
LBA:6500
C:6500/1000 = 6 (6号磁道)
H:int n = 6500/5000 = 1 (所以在第二面)
S:6500%1000 = 500(第500扇区)
连续读取8个扇区,我们就能得到块了

OS要管理磁盘,就将磁盘看作一个大数组,所以对磁盘的管理,就变成了对数组的管理

先描述,再组织!!!

文件系统

![[基础IO 2023-11-17 21.40.52.excalidraw|900]]

接下来我们谈的都是一个分区:(分区就类似与win的"分盘: C盘,D盘…")
![[Pasted Image 20231117214219_277.png]]

文件 = 内容 + 属性

最终都要以块的形式,保存在磁盘的某个位置
Linux是将内容和属性分离的

BootBlock

与系统的开机有关

SuperBlock

文件系统的所有属性信息

  1. 文件系统的类型
  2. 整个分组的情况
    为什么每个分组都可能有SB,而且是统一更新的:

是为了防止SB区域坏掉,如果出现故障,整个分区就不可以被使用了,所以要做好备份
(多副本保证分区安全)

GroupDescriptorTable

GDT -> 组描述符–改组内的详细统计等属性信息

inode table

一般而言,一个文件内部所有属性的集合,我们称之为inode节点(128字节),一个文件,有一个inode
即便是一个分区,内部也会存在大量的inode节点
一个group需要有一个区域来专门保存该group内所有文件的inode节点–>inode table
分组内部可能会存在多个inode,所以需要将inode区分开来,每一个inode都会有自己的inode编号
inode编号也属于对应文件的属性id

DataBlocks

一个文件的内容是变化的,我们是用数据块来进行文件内容的保存的,所以一个有效文件,要保存内容,就需要[1,n]个数据块
如果有多个文件,就需要更多的数据块,DataBlocks
Linux查找一个文件,首先是要根据inode编号,来进行文件查找,包括读取内容

struct inode
{
	int number;
	//...
	int blocks[NUM];//先简单理解,对应的就是该文件对应的数据块的编号
}

所以一个inode对应一个文件,该文件inode属性和该文件blocks内容(数据块->4kb)是有映射关系的

inodeBitmap

inode bitmap的每一个bit表示inode是否空闲可用
4kb(一个块):4096*8 = 32768(比特位)
1表示inode正常工作,0表示inode不正常工作

blockBitmap

block bitmap的每一个bit表示datablock是否空闲可用

ls -il//显示文件的inode编号

linux中的inode 和文件名

linux系统只认inode号,inode属性中文件,并不存在文件名!
文件名是给用户用的
->重新认识目录:

  1. 目录是文件吗–是
  2. 目录有inode以及内容吗–有
  3. 任何一个文件,一定是在一个目录内部,所以目录的内容是什么呢?数据块,目录的数据块里面保存的是该目录下文件名和文件inode编号对应的映射关系,在目录内,文件名和inode互为key值
  4. 当我们访问一个文件的时候,我们是在特定目录下访问的,基本流程是:
    1. cat log.txt 先要在当前目录下,找到对应的inode编号
    2. 一个目录也是一个文件,一定隶属于一个分区,结合inode,在该分区中找到分组,在该分组中inodetable中找到inode
    3. 通过inode和对应的datablock关系找到对应的数据块,并加载到OS,并显示到显示器

如何理解文件的增删查改

常识:删除数据比拷贝数据快多了
做法:

  1. 根据文件名->inode number
  2. inode number -> inode属性中的映射关系,设置block bitmap 对应的比特位置0
  3. inode number 设置inode bitmap 对应的比特位为0
    删文件只需要修改位图即可

补充细节

1.如果文件误删了,我们该怎么办?

正确的做法:什么都不要干,使用某种软件找到这个文件的inode编号,首先在分组中对应的inodebitmap对应位置置为1,再查找inode表对应的数据块bitmap置为1,然后查找数据块,就能恢复出来了

2.inode确定分组,inode number是在一个分区内有效,不能跨分区

举个例子,一个分区内,有100个分组,每个分组有100个inode编号,当inode是250号的时候,我们就能推算出他是在第三组的

3.上面我们学到的分区,分组,填写系统属性->谁做的呢?什么时候做的呢

是操作系统做的,是在分区完成之后,后面要让分区能够正常使用,我们要用格式化
格式化的过程,其实是OS向分区写入文件系统的管理属性信息

冷门知识:
大型公司更换磁盘,其中的磁盘不能随意流向市场,必须被销毁

4.我们如果inode只是单单地用数组和datablock的映射关系

假设inode里的数组大小是15*4kb,是不是意味着一个文件内容最多放入60kb呢

struct inode
{
	int inode number;
	int ref_count;
	mode_t mode;
	int uid;
	int gid;
	int size;
	data;
	//...
	block datablock[NUM];
}

![[基础IO 2023-03-25 17.15.44.excalidraw|900]]

5.有没有可能一个分区,数据块没用完,inode没了,或者inode没用完,datablock用完了

有可能
这样确实可能会存在资源浪费,但是没什么大影响

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

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

相关文章

SMART PLC数值积分器功能块(矩形+梯形积分法完整源代码)

PLC的数值积分器算法也可以参考下面文章链接: PLC算法系列之数值积分器(Integrator)-CSDN博客文章浏览阅读1.5k次,点赞3次,收藏3次。数值积分和微分在工程上的重要意义不用多说,闭环控制的PID控制器就是积分和微分信号的应用。流量累加也会用到。有关积分运算在流量累加上…

充电桩负载测试需要检测哪些项目

充电桩负载测试在进行充电桩负载测试时,需要检测以下几个项目: 充电速度:测试充电桩的充电速度,包括直流充电桩的最大输出功率和交流充电桩的充电功率,以确定其是否符合标准要求。充电效率:测试充电桩的充电…

横向扩展统一存储备份解决方案的特点与优势

Infortrend 使企业能够实现高效和可靠的数据备份,确保业务不间断的运行,保护有价值的业务信息。用户可以依靠我们的存储解决方案实现恢复时间目标(RTO)和恢复点目标(RPO),用于广泛的备份应用场景…

【网络安全】国家专利局专利办理系统存在信息泄漏风险

今天在办理专利的时候,发现该系统存在严重的信息泄漏问题。 废话少说,贴图为证。 每一个都可以点开,查看身份证、港澳通信证扫描件,很清晰。 本人没找到可以反馈的渠道,微博被限流。 发此贴只为警醒相关主管部门和运…

JAXB:用XmlElement注解复杂类型的Java属性,来产生多层嵌套的xml元素

例如&#xff0c;下面这段请求的xml代码&#xff0c;在元素body下面又多了一层&#xff0c;嵌套了4个元素&#xff1a; <?xml version"1.0" encoding"UTF-8"?><request><reqtype>04</reqtype><secret>test</secret>…

2005B 2.4W AB类音频功率放大器应用领域

2005B 2.4W AB类音频功率放大器应用领域&#xff1a;1、便携式DVD&#xff1b;2、笔记本电脑&#xff1b;3、插卡音箱 / USB音箱&#xff1b;4、液晶电视 / 液晶显示器等等。 2005B是一颗单通道AB类音频功率放大器。在5V 电源供电&#xff0c;THDN10%&#xff0c;4欧姆负载上可…

QQ同步通讯录,详细操作方法来了!

腾讯QQ是一款功能丰富的即时通信软件&#xff0c;能够让用户随时随地与好友保持联系&#xff0c;不受时间和地域限制&#xff0c;受到了广大用户的喜爱和信赖。 为了能够快速添加QQ好友&#xff0c;我们可以通过开启通讯录来实现。那么&#xff0c;qq同步通讯录如何操作呢&…

YOLOv8改进 | 2023 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

论文地址&#xff1a;官方Inner-IoU论文地址点击即可跳转 官方代码地址&#xff1a;官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址&#xff1a; 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其Focus变种 一、本文介绍 本文给…

53. 最大子数组和 : 图解从 O(n) 的常规理解到 O(n) 的分治做法

题目描述 这是 LeetCode 上的 「53. 最大子数组和」 &#xff0c;难度为 「中等」。 Tag : 「前缀和」、「区间求和问题」、「线性 DP」、「分治」 给你一个整数数组 nums&#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#…

NC Cloud uploadChunk文件上传漏洞复现

简介 NC Cloud是指用友公司推出的大型企业数字化平台。支持公有云、混合云、专属云的灵活部署模式。该产品uploadChunk文件存在任意文件上传漏洞。 漏洞复现 FOFA语法&#xff1a; app"用友-NC-Cloud" 访问页面如下所示&#xff1a; POC&#xff1a;/ncchr/pm/fb/…

酷柚易汛ERP - 客户等级操作指南

1、应用场景 客户等级用于整个系统对客户进行分级&#xff0c;同一商品可设定多个不同价格&#xff0c;当然这个价格是以客户等级进行区分。 注意&#xff1a;系统中默认设定五种等级&#xff0c;默认等级是不允许删除和禁用&#xff0c;新增的客户等级是可以删除和禁用。

【文末送书】十大排序算法及C++代码实现

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

球幕投影有哪些常见的物理表现形式?

近年来&#xff0c;投影技术不断发展完善&#xff0c;给内容的表达方式带来了突破&#xff0c;使其展示形式不再局限于平面&#xff0c;即使在弧面、球面等异形幕墙上&#xff0c;也能呈现出令人惊叹的视觉画面。其中球幕投影备受关注&#xff0c;它以半球形屏幕将图像投影到球…

SAP ABAP给指定用户增加SAP ALL权限

下面的例子是给指定用户增加SAP ALL的权限ABAP代码&#xff0c;增加指定权限对像的没研究&#xff0c;只能自己看了。这应该是SAP权限的无限破解了吧。 例子中SAP*,是当前系统中有SAP_ALL权限的一个用户&#xff0c;用来参考使用的&#xff0c;根据实际系统用的最大权限用户&a…

webpack快速上手之搭建cesium三维地球环境

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热衷分享有趣实用的文章&#xff0c;希望大家多多支持&#xff0c;一起进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 Cesium介绍 初始化一个Cesium地球 ​编辑 Webpack的使用 Webpac…

SAP权限设计简介

介绍 小技巧 -ERP 权限控制 繁中求简 , 闲聊一下 SAP 复杂权限设计的基本思想。 特别是适合大集团业务的 ERP 系统 , 应该提供一个非常完善的权限控制机制 , 甚至允许将权限控制字段细到字段级别&#xff0c;如果权限控制都做不到这点&#xff0c;估计产品销售就够呛&#x…

一些损失函数的学习

CrossEntropy loss 交叉熵是用来衡量两个概率分布之间的差异性或不相似性的度量交叉熵定义为两个概率分布p和q之间的度量。其中&#xff0c;p通常是真实分布&#xff0c;而q是模型预测的分布 交叉熵还等于信息熵 相对熵 这里&#xff0c;x遍历所有可能的事件&#xff0c;p(x)…

文件编码、转换、乱码问题

文件编码 用来表示文本内容的字符集和字符编码方式&#xff0c;决定了在文本文件中使用的字符集和字符的二进制表示方式。常见的文件编码包括 UTF-8、UTF-16、ASCII、ISO-8859-1 等。选择文件编码时&#xff0c;需要考虑到所支持的字符集范围、编码方式对特定语言的支持程度以…

学了Python不做全职,那么可以靠哪些兼职赚到钱?

如果学了Python不做全职工作&#xff0c;那么可以靠哪些兼职赚到钱&#xff1f; 今天我们就来看看一位有着4年开发经验的老鸟的分析回答&#xff0c;希望对你有所帮助。 emmm… 以我差不多四年的 Python 使用经验来看&#xff0c;大概可以按以下这些路子来赚到钱&#xff0c;…

【reading notes】

文章目录 中文AA 或 AAAAAAAAAAA&#xff0c;BBBBAAAA&#xff0c;BBBB&#xff0c;CCCCAAAA&#xff0c;BBBB&#xff0c;CCCC&#xff0c;DDDDAAAAAAAAAA&#xff0c;BBBBBAAAAA&#xff0c;BBBBB&#xff0c;CCCCC&#xff08;肆&#xff09;AAAAA&#xff0c;BBBBB&#xf…