Linux 磁盘结构,文件系统与inode

news2024/11/17 11:44:33

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
在这里插入图片描述

文章目录

  • 一、关于磁盘
    • ①磁盘
    • ②CHS寻址
    • ⑤磁盘结构的抽象
  • 二、文件系统
    • ①inode与文件的关系
    • ②创建文件,系统做的事
    • ③删除文件,系统做的事
    • ④删除的文件能够恢复吗?
    • ⑤查找文件,系统做的事

一、关于磁盘

磁盘是一个外设(外设即冯诺依曼中承担输入输出角色的设备),而且,磁盘还是计算机中唯一一个机械设备,因为磁盘是外设,同时又是机械设备,就意味着磁盘会非常的慢(相对而言),所以OS一定会有提速的方式

磁盘物理结构:
①磁盘盘片 ②磁头 ③音圈马达 ④伺服系统(也就是一系列的硬件电路) …

当通电之后,随音圈马达的带动下,磁盘盘片(磁盘判断是一摞,有很多面)快速旋转,磁头就会左右摇摆去寻址
在这里插入图片描述
在这里插入图片描述
无论是磁盘还是光盘,最终盘面上会存储数据,计算机只认识二进制,所以说磁盘上本质存储的就是二进制,内存可以用优点和没有来存储,那么磁盘这种,就只能通过极性的方式来读写,也就是说磁头来回进行读写,在盘面特定位置产生放电行为,改变特定位置的正负极性,从而向磁盘写入数据。

①磁盘

在这里插入图片描述
磁盘是由一系列同心圆构成的,数据并不是在任意位置写入,而是写在这些划分好的同心圆上,而中间空着的区域是不进行数据存储的,当然可以把这些同心圆划分的很紧密,而一个同心圆就被称为一个磁道,我们很大可能不会用完一个磁道,所以又将磁道划分为一个个扇区,这一摞磁盘盘面,半径相同的磁道称作柱面,一整个磁盘也就是很多个柱面的集合。

②CHS寻址

在这里插入图片描述

我们要确定数据写在哪一个扇区,那么就要先确定在哪一个磁盘盘面,也就是用磁头来寻找盘面,磁头(Head),然后需要确定在哪一个磁道(Cylinder/Track),然后确定在哪一个扇区(Sector),就知道了在哪一个扇区,通过磁头的寻址,把数据写进去就可以了,所以被称作CHS寻址方式(Cylinder Head Sector)

⑤磁盘结构的抽象

在这里插入图片描述
在这里插入图片描述

可以把磁盘想成一个卷起来的磁带,这一圈一圈的就是磁道,我们可以把磁盘盘面想象成线性结构,那么就可以看做是一个数组,扇区的大小一般是512字节,所以就可以看成是有n个512字节的数组,那么访问一个扇区,只要知道数组下标,就可以找到。

操作系统访问磁盘用的就是LBA地址(Logic Block Adress逻辑块地址),然后驱动将LBA转化成CHS去找到,最终实现CHS寻址到扇区读写数据。

每个扇区的大小一般为512字节,那么每个磁道的半径都不太,他是怎么确保的呢?其实是用磁道的密度来实现的,通过对磁盘内和外的密度不同来达到不同长度相同大小的目的。

二、文件系统

所以我们把磁盘想象成了一个大数组,将数组存储到磁盘在操作系统层面就转化成了将数据存储到数组,对磁盘的管理,也就转化成了对大数组的管理,但是又因为磁盘对应的数组太大,我们又可以拆分成多个小数组,分区管理
对磁盘的管理,就转化成了对每个小分区的管理,又因为机器及其相似,所以我们只需要管理好一个小分区再Ctrl CV即可。

在这里插入图片描述
Block group:块组
Boot Block:启动块
Super Block:包含了整个文件系统的属性信息,因为磁盘可能刮花,所以放在块组当中,如果不存在块组
                         里,正好将Super Block刮花,那么整个分区就全乱了,比如蓝屏修复,就要就是修复Boot
                         Block要么就是从块组中拷贝Super Block,以能正常运行文件系统
Group Descriptor Table 块组描述符表,存储的是块组的相关属性,比如有多少个块组,还有哪些块组
                          空着,然后该块组中有多少个inode,多少个block,还剩下多少inode,多少block等等
Block Bitmap:块的位图,比如有10000+个数据块,那么Block Bitmap就应具有10000+个比特位,比特位
                           和特定的Block是一一对应的,比如该比特位为1,就代表该Block正在被使用
inode Bitmap:inode的位图,功能和Block Bitmap类似
inode Table:inode表,一般而言inode是一个大小为128字节的空间,它里面保存的是对应文件的属性,这
                        个表中就是该块组内,所有文件的inode集合。(inode就是一块空间,存的文件属性)
Data blocks:文件=文件内容+属性,Linux在存储的时候,将内容和属性分开存储,Data blocks保存的都
                        是特定文件的内容,Data blocks就是多个4KB块大小的集合

我们只要把这些信息管理好,那就就能够让一个文件的信息可追溯,可管理,我们将块组分割成上面的内容,并且写入相关的管理数据,每一个块组都这样做,整个分区就被写入了文件系统信息,整个过程就叫做格式化,重装系统的时候,就会让用户分区,格式化,格式化就是在磁盘写入文件系统(进行划分)

虽然磁盘的基本单位是扇区(512字节),但是操作系统(文件系统模块)和磁盘进行IO的基本单位是4KB,就算就想读1字节的数据,一次IO也要取出4KB,所以也称磁盘为块设备

操作系统与磁盘的IO为什么不以512字节为基础单位呢?
①因为512太小,一般要做数据拷贝的时候,都会超过512字节,此时就会导致多次IO,浪费时间,降低效率
②如果磁盘和操作系统使用一样的大小,万一磁盘扇区的基础单位变小,那文件模块与磁盘的一次IO要不要该呢?(修改源码),所以要对硬件和软件(OS)进行解耦,彼此用彼此的规定

一个文件一般只有一个inode结点(因为用128字节的inode就可以存下文件的属性,一个文件一般有多个blocks,因为blocks存的是文件的内容,只要文件内容大于4K,因为一个block块就是4K,那么就需要多个block来存储。)

那么如何确定哪个block属于哪一个文件呢?
是通过找到inode tables,用inode编号去找到该文件对应的inode属性集合,而在一个inode里,如下所示

在这里插入图片描述
在inode中,保存了对应block的块号,通过响应的映射关系,就能依次找到文件内容,那么此时文件的属性和内容就都拿到了,然后一般是划分了某个区域有固定大小的inode和block,比如在Group Descriptor Table中可以找到,所以使用了哪个inode或者块,就可以更改inode bitmap和block bitmap的对于比特位

①inode与文件的关系

Linux下一切皆文件,目录也是文件,他也有自己的inode和Data Blocks,不过目录的Data Blocks里面存的就是目录下的 文件名 和 对应inode编号 的映射关系,文件名和inode编号互为Key值,文件系统既可以用inode编号作为key,也可以用文件名作为key去查找

找到inode编号是要依托于文件系统的,因为在目录的block当中,保存了某一个文件的映射,所以,因为我们找的时候是用文件名来找的vim test/test.cc,然后找到映射到的inode,给操作系统去文件系统当中找到我们对应的文件的inode以及blocks。

②创建文件,系统做的事

创建文件,系统根据文件系统,找到这个目录对应的分区,然后再找到对应的块组,然后确定保存这个文件的块,也就是blocks,然后将inode Bitmap和block Bitmap做已存在修改,将新建文件的属性写进inode,在inode中建立文件的内容也就是data blocks的映射,最后系统返回一个inode编号,然后在目录的block块中,存储该文件的文件名和inode编号的映射。

③删除文件,系统做的事

首先通过目录的blocks找到对应文件名的inode编号,然后系统通过文件系统找到对应分区,块组,然后通过inode编号去inode table中找到inode属性集合,然后去将inode属性集合里面对应的Blocks的Block Bitmap中进行不存在修改(不用去删数据什么的,下一次再使用这个块,直接覆盖即可),然后inode Bitmap也做不存在修改,然后再从目录的data blocks中将文件名和inode编号映射关系删掉即可。

另外,因为inode和block的大小是固定的,所以有可能看到磁盘某个区域还有空间,但是创建文件失败,就是因为划分给别人的空间没用完

④删除的文件能够恢复吗?

恢复的原理就是再找到原来的那个文件的inode编号(可以在删除日志当中找到),然后通过inode编号找到分区,块组,将inode Bitmap和Block Bitmap恢复,然后通过inode table找到inode属性,再找到data blocks,就可以恢复了。但是前提是该文件所属的这些块都没有被覆盖,所以当把重要的文件误删了之后,最好的做法就是不要动,交给专业的人来恢复文件

⑤查找文件,系统做的事

ls的时候,在目录,下找到data,将文件名全部打印出来,就完
在这里插入图片描述

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

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

相关文章

如何升级展锐RM500U模组的5GCPE固件

本文镜像:https://blog.csdn.net/weixin_45326556/article/details/128236605 如何升级展锐RM500U模组的5GCPE固件1. 准备工作2. 安装5GCPE串口驱动3. 升级固件3.1 选择固件3.2 选择串口号3.3 下载固件3.4 下载固件意外情况4. 重新启动5.参考文献1. 准备工作 从网盘…

智慧旅游景区Web3D可视化GIS综合运营平台

建设背景 2014年8月,《国务院关于促进旅游业改革发展的若干意见》。 2015年年初,原国家旅游局发布《关于促进智慧旅游发展的指导意见》。 2021年12月,国务院印发《“十四五”旅游业发展规划》。 在国家和有关部门的引导和支持下&#xff…

卡塔尔世界杯-诸神黄昏

世界杯 世界杯概述:国际足联世界杯(FIFA World Cup)简称“世界杯”,是世界上最高荣誉、最高规格、最高竞技水平、最高知名度的足球比赛,与奥运会并称为全球体育两大最顶级赛事,影响力和转播覆盖率超过奥运会的全球最大…

openGauss数据库安装(2.0.0企业版安装)

目录1. 准备环境2. 预安装3. 正式安装4. 启动并登录数据前言此次数据库的系统安装环境仍然是openEuler20.03LTS,openGauss安装版本是2.0.0版本,相对于极简版安装,确实多了一些工具,例如gs_om工具,极简版安装是没有的,企…

前后端传参

1、路径传参 前端传一个参数:123 后端接收一个参数:123 // /{}是必须写的,id是自定义的// PathVariable 这个注解也是必须写的,否则接不到参数GetMapping("/{id}")//使用什么类型去接收id的值,要看你后端需要…

损失函数是如何设计出来的

损失函数是如何设计出来的? 可以直接观看b站优质博主的视频,该博主讲的也是非常通透。劝大家直接去看视频,我这只是做一个学习笔记。 https://www.bilibili.com/video/BV1Y64y1Q7hi/?spm_id_from333.788&vd_sourcee13ed5ec556f20f3f3c2…

Medical Image Segmentation Review:The Success of U-Net

目录 医学图像分割综述:UNet的成功 1.摘要与介绍 2.分类 2.1.2D Unet 2.2 3D UNet 3.UNet扩展 3.1对于跳跃连接的增强与改进 3.1.1--增加跳跃连接数量 3.1.2--对跳跃连接过程中的特征进行处理 3.1.3--编码器和解码器特征图的组合 3.2--主干网络的改进与增…

【Lilishop商城】No3-2.模块详细设计,系统设置(系统配置、行政区划、物流公司、滑块验证码图片、敏感词过滤)的详细设计

仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在: 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑,其中重点包括接口类、业务类,具体的结合源代码…

【JavaWeb开发-Servlet】day04-学生成绩管理系统-环境搭建与展示页面

1、项目名称:学生成绩管理系统 2、技术要求:Java、Servlet、JSP、HTML5、JavaScript、Css 3、编译环境:JDK1.8、eclipse2022、TomCat9.0 4、基本功能:增、删、改、查、分页、登录、注册 目录 一、创建项目 (1&#x…

自动化测试平台(一):前期准备和后端服务搭建

一、前言 本专栏会基于djangoreact,并结合这些年自己构建多个自动化测试平台的经验,从0开始,一步一步教会你实现一个完备的商用级自动化测试平台,真正意义上能够降本增效创造价值的平台。 二、前期准备 安装mysql,版…

用Virtuoso和Abstract完成gds2lef

需要用到的工具有virtuoso和abstract。 数模混合的项目通常需要模拟完成模块设计,把接去数字的pin打上label(text),数字的floorplan才能正式开始。 如果只需要简单的数字PR boundary和pin点位置,那么只使用virtuoso就…

MySQL分区详解

目录 一、定义 1.1 概述 1.2 分区的优势 二、分区的类型 2.1 检查MySQL是否支持分区 2.2 类型 2.3 分区的其他操作 一、定义 1.1 概述 数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写…

基于jsp+java+ssm考研指导平台-计算机毕业设计

项目介绍 本考研学习类的网站,采用了ssm框架技术和mysql数据库进行网站设计研发,系统具有前台展示,后台管理的设计模式,是一款典型的计算机毕业设计学习资料。前台主要展示了考研相关的资讯,方便用户在线注册并且留言…

【Windows逆向】【Qt】资源解析

▒ 目录 ▒🛫 导读需求开发环境1️⃣ 分析思路思路获取资源路径的方法2️⃣ c正向编码编码使用流程不使用Qt方式获取思路3️⃣ frida方式获取Origin平台资源win32 - 定位目标资源win32 - 查找API含义win32 - 查找《符号》构造frida本地函数win32 - 全部代码win64 - …

【ESP32+freeRTOS学习笔记-(一)freeRTOS介绍】

目录FreeRTOS基本情况FreeRTOS的特色发行版的目录结构与文件说明原生程序的下载与目录结构FreeRTOS的主要文件说明头文件说明关于FreeRTOSConfig.h的说明主要的数据类型说明重要数据类型 -- TickType_t重要数据类型 -- BaseType_t一些默认的规则变量名的规则函数的命名规则宏的…

你在网络上发布的内容真的归你所有吗?有Web3.0和元宇宙的未来是什么样的?

欢迎来到Hubbleverse 🌍 关注我们 关注宇宙新鲜事 📌 预计阅读时长:9分钟 本文仅代表作者个人观点,不代表平台意见,不构成投资建议。 你认为你在微博、抖音等社交媒体上发布的内容是属于你的吗?事实并非…

Dashed lines generator for 3dMax 虚线生成器插件使用教程

Dashed lines generator虚线生成器是一个3DMAX建模工具,可以通过简单的步骤自动生成所有类型的虚线:它可以用于模拟交通标志标准;使用“蒙皮修改器SKIN MODIFIER”选项,可以非常容易地操纵创建的虚线,更改其位置和方向…

关于Pytorch模型检查点大小和参数量的一些观察

目录 背景和需求 一、模型的参数量统计 二、模型检查点大小查看 三、检查点大小和模型参数量之间的关系 总结 背景和需求 一个Pytorch模型的大小可以从两个方面来衡量:检查点大小和模型的参数量。现在我从两个方面都拿到了具体数值,想要验证它们两个是否…

数据开源 | Magic Data开源DMS驾驶员行为数据集

由于近几年人工智能、芯片技术的发展,自动驾驶被资本市场越炒越热。目前大部分车企正在朝着完全自动驾驶努力,大部分已经落地的无人驾驶技术仍然是L2与L3级。同时,汽车行业也逐渐在汽车上集成了辅助自动驾驶和智能助手等功能,让驾…

C语言结构体详解

邀请加入嵌入式社区,您可以在上面发布问题,博客链接,公众号分享,行业消息,招聘信息等。 目录 结构体有什么用? 结构体声明 正常的结构体声明 匿名结构体 匿名结构体只有在创建的时候可以建立变量 两个…