Linux->文件系统磁盘文件管理

news2025/1/18 7:00:05

目录

1 磁盘结构

2 逻辑抽象管理磁盘

2.1 逻辑抽象

 2.2 管理磁盘

2.3 补充知识

3 软硬连接


1 磁盘结构

        本篇的学习需要建立在大家在脑海中有一副磁盘的结构才能进行下去,所以我会以图解的方式为大家简单讲解一下,注:博主对这一部分并不是特别的了解,只能让大家对于磁盘有一个联想的空间。

         上图为我们磁盘的机械结构,根据冯诺依曼体系的分类,这个东西被称为外设,而这个家伙又是外设当中比较慢的哪一种结构,因为它有马达等之类的机械结构,所以我们一般在对磁盘进行操作的时候都会比较慢,但重点不在这里。

        对于我们了解来说,这个结构重要的东西就是中间的那个圆盘和它旁边像是针头一样的东西,他们俩就是我们所知的磁盘和磁针。

        对于它的读取我们有一个很形象的东西可以替代,那就是以前的留声机,和光碟。我以留声机为例,我们只要打开留声机的开关,放上黑胶,留声机就会转动这个黑胶片,如果此时我们将留声机的针头放到黑胶片上,这时,留声机就能够发出声音了。同理,我们的磁盘也是一样的操作,通过磁盘旋转以及磁针读取内容就能实现在磁盘的读取和写入了。

        再具体看我们的上图,上面的磁盘课磁针并不只是一个,而是有多个叠加起来的,并且它们由各自的马达同轴转动,也就能够存更多的数据了。

         单个盘面可以被抽象为上图结构,整个磁盘是由一个一个的小扇区组成。虽然不同磁道的扇区大小并不相同,但是它们的大小都是一模一样的(不绝对,有些盘大小不一样),为512byte。

        然后i每一个扇区都是由很多的小bit位组成,也就能存我们的数据了。

        那么有这么多的扇区,这么多的磁道,这么多的扇面,我们应该如何去查找我们需要的数据呢?难道是依次扫描文件?很明显不是的。

        其实磁盘文件的查询就像是我们到图书馆找一本书一样,他是被规划好的,首先我们得知到我们要找的书的大类是什么?也就是通过磁针去匹配那一块磁盘;然后得知我们的书在哪一个大书架里面,也就是匹配我们对应的磁道;最后找到大书架里的小书架,查找我们对应的书籍,也就是找到扇区去查找我们对应的数据。这样就能实现我们的查找操作,也被我们称为磁头(header)、柱面(cylinder)、扇区(sector)查找方式————CHS

2 逻辑抽象管理磁盘

        通过上面对于磁盘结构的简单讲解,相信大伙对于磁盘也是有了一点点概念了,那么就能开始我们本篇的重点了。

        根据我上面讲解如果OS能够通过CHS去访问磁盘的任意一个位置,那么是否表示OS就是这样做的呢?答案肯定不是,首先以冯诺依曼体系他就跑不过去,磁盘是外设欸,我们的OS只能重内存当中读取内容,那肯定不是;从效率而言也不可能,磁盘的可是一个机械结构,他能跟上我们操作系统的运行速度?别开玩笑了,肯定跟不上啊;从硬件角度理解这也是不科学的,如果OS直接使用了这一个地址,那么一旦硬件发生了改变,那么原本的操作系统也会被改变了,整个文件操作就会被变得乱七八糟;而且一个扇区就只有512字节,但是我们OS每一次进行IO操作就是以4KB为一个基本单位,这两者之间不能直接对应起来。综上OS内部一定不是通过CHS寻址。OS一定还有一套其它的方式,来进行块方式的访问。

2.1 逻辑抽象

        我们知道,磁盘的读取是通过磁盘旋转,然后再由磁针去匹配,这一过程其实很像我们以前的老式录音机的磁带,将整个磁带拉开,这是不是一条线性的直线磁带?我们的磁盘也这样理解,那么磁盘是不是也是一条直线?连续的地址还是连续的,根本不影响他的读取。(这让我想起了以前学高数积分的日子,哈哈)。

        所以既然是一条线性,那我们可以将其看成什么东西?对应我们的代码层面。数组是不是,这不就是一个大数组吗?既然是数组,那么我们不久能够轻松的将其管理起来咯。这一步就是管理操作最重要的先描述、在组织

        我们有多个磁盘,也就有了多个大数组,每一个大数组上面有很多很多的磁道,每一个磁道上面都有很多的小扇区。也就是下图结构:

 

         但是呢,我之前不是说了OS在进行IO操作的时候每一次会有4KB大小的数据嘛,但是这每一个扇区不久只有512byte吗,这岂不是每次读取都是读起来很亏?

        所以这个时候我们就又做了另外一件事情,那就是每八个扇区就构成一个数据块,那么我们下标访问例如arr[0],就能够读取8个扇区的内容,也就能将IO操作的4KB数据读取满。

         也就变成了上图的情况。

        这个时候我们就初步的将磁盘的物理逻辑到线程逻辑的抽象过程,因为数组天然有一个下标,所以想要定位一个扇区,只需要知道它的某一个下标就可以了。并且我们称这样的一个地址为逻辑块地址(logic block address)LBA

        假设我们要找一个扇区,已知数组的下标是6500,每一个扇面有5000数组块,每一个磁道有1000个数据块,请问要找的扇区在哪里?

        这个问题很简单,既然下标是6500,那就表示了我们要找的是第2个磁面,我们就排除了5000个数据块,现在只剩下1500个,每一个磁道有1000个数据块,那么表示我们的数据块在第二个磁道,现在只剩下500个数据块,那么就找到了该扇区在哪里了:第二面第二磁道的第500个数据块。该数据块有8个扇区,我们要的扇区一定在里面。

        上述问题完美的呈现了LBA和CHS的相互转换,也实现了对数组下标的管理到磁盘内存的管理的完美过度,并直接的解除了操作系统和磁盘的耦合关系。

 2.2 管理磁盘

        对于OS来说,磁盘的大小实在是太大了,他不像是内存只有十几个G,他从理论上来说可以是无限大的,只要厂家想或者是项目需要。那么此时就需要一个合理的管理制度,光靠一个下标是无法满足这样的需求的,所以就有了下图:

         既然我们一个500G的磁盘内存管理不过来,那么我分区可以把,我分成5个100G的小磁盘内存,我嫌弃100G也大了,那么我再对这个区域进行划分,分组可以吧。这样这就成功的减少了管理这整个磁盘的消耗。

        为什么能这么做呢?那是因为磁盘其实是一个很单一的东西,它的结构都是一样的,只要我们管理好了一个组,那么等于我们能够管理好所有组,我们管理好了所有组,就能管理好一个区,只要管理好了一个区,等于我们能够管理好所有区,也就表示我们管理好了任意大小的磁盘

        那么接下来就是了解这每一个组内的各个功能块都是干什么用的了。

Boot Block:

        Boot Block其实就是启动块,我们电脑在开机的时候调用的就是这一块的内容,如果没有了这一块的数据,那么我们电脑就不能正常开机了。

Super Blcok:

        超级块,里面存了我们组内的block和inode的总量,未使用的block和inode的数量,一个block和inode的大小,最后一次挂载的时间,最近依次写入数据的时间,最近一次检验磁盘的时间等其它文件系统的相关信息。并且,每一个组都有一个super block,且这些块是相连的,也就是更改一个全部都会被更改。这样做的目的也就是为了保护好数据不被丢失。防止因为一个块的错误导致所有的文件信息不可读取。也就是做好备份。

Group Descriptor Table:

        组内描述符,描述块组属性。一般而言,一个文件内部所有属性的集合有128个字节,一个文件也对应一个Inode,每一个组每一个分区都会有大量的indoe结点,需要有一个区域准们保存该Group内的所有文件的Inode结点。

Data Blocks:

        数据块,也就是我们之前划分这么久的4KB一个的小磁盘块,用于存储数据。

Block Bitmap:

        数据块位图,用于表示我们的某个数据块是否被使用,用0/1表示,并且位图的位置就是数据块所在的下标。

Inode Bitmap:

        结点位图,所谓结点位图就是表示这个文件结点是否被使用,与数据块位图相相似。

Inode Table:

        用于存放我们的Inode结点,每一个结点都是大小为128byte大小的结构体,里面存放了文件的各种属性。

         知道了上述块的作用之后,那么我们应该如何理解一个文件的存储呢?

        假设我们要创建一个新文件:

1. 首先内核要找到一个空闲的Inode结点,将文件的信息写入。

2. 如果这个文件需要三个数据块,那么内核就会找3个空闲数据块,依次写入数据。

3. 根据数据块的使用,内核在Inode上的磁盘分布区记录了上述块列表。

4. 添加文件名到目录,用Inode Num和文件名相互作为关键字查找。

2.3 补充知识

        对于OS来说,它找文件只是凭借inode num,那么文件名又是什么?他岂不是没意义?话不能这么说,文件名至少还有一个作用————给我们看的,我们总不能拿着一堆数字去看这个这个文件吧,可太难受。

        还记得吗,linux下一切皆文件,那么目录算不算文件?算当然算,它也有它自己的inode num,这时肯定的,问题是他这个文件用来存什么?其实这个问题我们只需要好好想想目录里面有什么就能想到了,目录下面无非就是文件或则另外一个目录嘛,那么存的数据就一定是这些文件的某些相关内容,而这个内容就是文件名和inode num对应的映射关系,这两个互相为Key值,都能找到相应的文件

         那么也就表示我们在访问一个文件的时候,我们是在特定目录下访问的,只要在当前目录下,就能够找到某个文件的inode编号,所以OS在加载数据进入内存的操作就是通过通过inode num逐渐向下查找,直到找到需要的文件,然后加载到OS,最后显示到显示器当中。

        然后呢,Inode和数据块一定是由某些联系的,它的练习就是如下伪代码:

struct inode

{
        int inode number;

        int ref _count;

        mode_t mode;

        int uid;

        int gid;

        int size;

        data;

        ......

        int datablock[NUM]

}

        上代码中我加黑的部分就是inode和数据块之间的联系,这个数组存的数据就是数据块的下标,根据我们的需要,可以存无线大的数据。为什么?这个下标不是有限的吗?哪里会让你一个文件开这么大的空间,那我就得说一个很牛的二级索引和三级索引了,二级索引指向一个数据块,这个数据块不存其他数据,只存其它数据块的下标,那么就能够扩大存储数据的大小,三级索引呢?三级索引全部存二级索引,二级全部存一级索引,那这个数据可能存太大了,基本上是无限了。

        当然,从上面的各个解释上来看,inode和数据块好像是独立的。那么有没有可能inode用完了,或则是数据块用完了的情况?当然有,但是如何避免呢?没有办法,有了这种情况就等死吧。博主没有开玩笑,只要有了这种情况要么换一个磁盘,那么给他再买一个磁盘扩容。

3 软硬连接

        在linux下通过ls -i命令可以得到文件的inode num和inode结构体内部的ref,也就是该文件被几个文件指向。

         当我们有了一个test.txt文件,通过软连接 ln -s test.txt 新文件名就能构成一个软连接,软连接是重新开辟一个新的文件,我们从inode num可以看出来。

        通过ln test.txt 新文件名就能构成硬连接,硬连接没有重新搞一个文件出来,因为他与源文件的inode num一样,并且ref增加变为了2,唯一做的事情就是在目录的数据块的映射表当中添加了一个新的映射关系。


        以上就是博主对本节的全部理解了,希望能够帮助到大家。 

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

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

相关文章

深度学习实战——卷积神经网络/CNN实践(LeNet、Resnet)

忆如完整项目/代码详见github:https://github.com/yiru1225(转载标明出处 勿白嫖 star for projects thanks) 系列文章目录 本系列博客重点在深度学习相关实践(有问题欢迎在评论区讨论指出,或直接私信联系我&#xf…

详细介绍别人电脑访问到自己电脑运行的项目

文章目录 让别人远程访问你的代码网站项目或临时演示你的项目给客户的方式详解 引言一、创建一个你想要别人访问的项目二、明确你想要将这个网站或者项目存放的地方 终端分类服务器设备WEB服务器三、部署我们的网页 本地部署流程进入浏览器输入网址访问获取本机的IP地址&#…

多模态特征融合:图像、语音、文本如何转为特征向量并进行分类

多模态特征融合前言输入层,数据集转为特征向量图像语音什么是时域信号,什么是频域信号语音信号转换 - 1.傅立叶变换语音信号转换 - 2.梅尔频率倒谱系数文本词袋模型词嵌入模型输出层,多模态模型合并前言 学习多模态的话题可以从深度学习的分…

API接口安全—webservice、Swagger、WEBpack

API接口安全—webservice、Swagger、WEBpack1. API接口介绍1.1. 常用的API接口类1.1.1. API接口分类1.1.1.1. 类库型API1.1.1.2. 操作系统型API1.1.1.3. 远程应用型API1.1.1.4. WEB应用型API1.1.1.5. 总结1.1.2. API接口类型1.1.2.1. HTTP类接口1.1.2.2. RPC类接口1.1.2.3. web…

NLP与ChatGPT的碰撞:大模型和小模型联合发力

ChatGPT真的太火了!作为NLP的终结者,ChatGPT又会与NLP发生怎么样的碰撞?大模型可以替代小模型吗?NLP又将何去何从?今天给大家推荐一本好书:《基于NLP的内容理解》! 文章目录一、背景二、书籍介绍…

【原创】AIGC之ChatGPT工作原理

AIGC是什么 AIGC - AI Generated Content (AI生成内容),对应我们的过去的主要是 UGC(User Generated Content)和 PGC(Professional user Generated Content)。 AIGC就是说所有输出内容是通过AI机…

2023年3月的10篇论文推荐

三月有很多的重大产品发布,包括刚刚发布的GPT4,还有Meta刚发布就被泄露的LLaMA,midjourney V5,还有ChatGPT的API(非常便宜)等等。 但是本文整理的是本月应该阅读的10篇论文,将包括多模态语言模…

Linux中shell内外命令讲解(下)

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…

MySQL数据库:联合查询、子句查询、合并查询

一、联合查询 1.概念 简单理解就是将多张表合并到一起,然后进行数据查询,所有也叫多表联查。 如何将两张表合并到一起? 取两张表的笛卡儿积:将表1中的数据逐条与表2中的数据进行合并,最终形成的新的临时表&#xff0…

py征途4之无效思路

事件回顾: 近期班里组织了一个跑团,使用的是keep跑团助手(小程序)。每个人都有一个昵称,要对“每日跑量”进行统计,以明确到底有哪些人跑了步,哪些人没跑步。 为了解决这个问题,从3月…

springboot登录校验[JWT]

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:后端专栏 📧如果文章知识点有错误的地方,…

Spring Transaction 源码解读

Spring Transaction 规范的maven坐标如下&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>...</version></dependency>该包提供了spring事务规范和默认的jta(ja…

【SSM】SSM整合步骤和流程细化

整合SSM参考文献一、SSM整合前概述1. 各个框架在三层架构模式中所担任的角色2. 两个IOC容器的创建1&#xff09;整合时Spring中IOC容器的创建时间2&#xff09;Spring提供的监听器&#xff08;ContextLoaderListener&#xff09;二、SSM整合步骤参考文献 卤蛋的SSM整合完整流程…

华为nat配置实验:内网能够访问外网,内网服务器80端口映射出去

一 需求分析1.1 需求公司A在北京&#xff0c;公司B在上海&#xff0c;本次实验仅仅模拟局域网内出口路由器的配置&#xff0c;公司A业务流量较大&#xff0c;并且预算有限。公司B模拟外网的一个小型局域网&#xff0c;要求公司B的主机能够访问公司A的web服务器。1.2 分析采用na…

Linux中滴计划任务

计划任务计划任务计划任务分类at命令load averagecrontab命令配置文件通常包含三个部分cron服务配置文件cron服务的日志文件时间数值的特殊表示方法应用实例案例anacron服务计划任务 计划任务&#xff08;Cron Job&#xff09;是指在预定的时间自动执行一些指定的任务或脚本。…

Pytorch使用预训练好的卷积神经网络进行推理预测

本小节将会介绍如何利用已经预训练好的卷积神经网络模型对一张图像进行预测&#xff0c;并且通过可视化的方法&#xff0c;查看模型是如何得到其预测结果的。 我们直接看一个实例&#xff0c;利用已经预训练好的VGG16卷积神经网络对一张图像获取一些特定层的输出&#xff0c;并…

通过python理解光的偏振

文章目录基本原理椭圆偏振光基本原理 光是横波&#xff0c;可以写成E⃗A⃗cos(ωt−k⃗r⃗)\vec E \vec{A}cos(\omega t-\vec k\vec r)EAcos(ωt−kr)&#xff0c;振动方向与传播方向垂直&#xff0c;而在三维空间中&#xff0c;与光线垂直的乃是法平面。换言之&#xff0c;光…

【Minecraft开服】Windows搭建我的世界MC服务器「公网远程联机」

文章目录1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址9. 使用固定公网地址远程联机简单…

【计算机网络-网络层】IPv4 和 IPv6

文章目录第一部分&#xff1a;IPv4&#xff08;IP 协议版本 4&#xff09;1 IP 数据报1.1 IP 数据报格式1.2 相关例题2 分类编址&#xff08;两级结构&#xff0c;网络号定长&#xff09;2.1 IP 地址的表示方法2.2 IP 分类编址2.3 IP 地址的特殊用途3 无分类编址 CIDR&#xff…

PyTorch 之 神经网络 Mnist 分类任务

文章目录一、Mnist 分类任务简介二、Mnist 数据集的读取三、 Mnist 分类任务实现1. 标签和简单网络架构2. 具体代码实现四、使用 TensorDataset 和 DataLoader 简化本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 一、Mnist 分类任…