[Linux] 层层深入理解文件系统——(3)磁盘组织存储的文件

news2025/2/24 12:31:04

标题:[Linux] 层层深入理解文件系统——(3)磁盘组织组织存储的文件

个人主页@水墨不写bug


目录

一、磁盘中的文件

1)磁盘的物理结构

2)磁盘的CHS寻址法

3)磁盘的空间管理

二、磁盘如何组织存储文件

三、透彻的看待文件系统

 四、文件分区的创建


正文开始:

一、磁盘中的文件

         在之前我们谈论的文件是都是已经被加载到内存中的文件,但是我们需要知道,内存中的文件仅仅只是计算机内部文件的小部分,只有小部分文件会被加载到内存中运行,大部分文件还是会被存储在磁盘中,本文谈论的文件,就是存储在磁盘中的文件。

1)磁盘的物理结构

         计算机只认识二进制,所以我们自然需要一个可以高效存储二进制数据的结构。磁盘就是这样的结构中的一种。常见的磁盘类似于我们小时候见到的光盘,但是磁盘是有多个盘面的,并且每一个盘面都可以读写数据。

        磁盘可以存储二进制数据,本质是磁盘的每一小单元可以表示两种不同的状态,这每一个小单元就是一个一个的带磁性的单位,提前规定好哪一个磁性对应的0,哪一个磁性对应1,就可以实现存储数据了。

        磁盘是一个多个盘面的结构,每个盘面都对应有一个磁头,磁头就是进行数据读写的装置。盘片的两面都可以读写。磁盘本质是一个机械设备,通过马达的转动和磁头的移动来定位扇区,定位磁道。

2)磁盘的CHS寻址法

在磁盘的结构中,有几个概念:

        盘面:就是数据存储在哪一个面;由于每个盘面都有一个对应的磁头,所以盘面在定位中等价于磁头(Header)


        磁道:磁盘的盘面上会一圈一圈的向外扩展出一个一个的磁道,磁道就是一个圆环(圆柱(Cylinder):因为盘面确定后,只需要确定磁道就可以了,也就是只需要确定是哪一个同心圆柱就可以了,所以称为圆柱)。

        扇区(Sector):扇区就是一个磁道上的一部分(扇形与圆环的相交部分),在确定扇区后,磁道就是一个扇环(暂且这样称呼)。

        磁盘读写的单位是扇区 (512字节),对于特殊的磁盘,可能会有更大的读写单位。

        盘面,磁道,扇区的关系:

1盘面 == n磁道 == m扇区

 


        我们想要打开一个文件,就需要确定这个文件的位置,这就需要 

CHS定址法:

        只要依次确定文件位于的盘面,磁道扇区,即可确定这个文件的位置。

         想要理解好CHS定址法的工作原理,我们首先需要了解磁盘的存储结构。

3)磁盘的空间管理

         你小时候一定见过磁带,磁带存储信息,是一条一条的可以被拉直,我们可以把磁盘看成一条线性的空间,也就是把磁盘拉直,那么磁盘就成为了一个长数组。操作系统读取的基本单位是按照扇区的,所以这个数组的每个基本单位就是一个扇区。

        所以文件就是很多个扇区的下标!

        假设一个盘面有1000个扇区,有10个磁道,每个磁道有100个扇区。如果随意给我们一个数组下标,比如3210,我们就可以通过计算,就可以得到这个文件的CHS地址:

        3210/1000 = 3 :表明在下标为3盘面;

        3210%1000 = 210;210/100 = 2;表示在下标为2的磁道;

        210%100 = 10; 表示在下标为10的扇区。

        于是,我们就可得出结论:文件位于  “3盘面 ,2磁道 ,10扇区”


         对于操作系统而言,一次读取512字节太小了,所以一般而言,操作系统未来和磁盘进行交互的时候,读取的基本单位是:4KB (8*sector)

        4KB == 8个连续的扇区

        我们把这8个连续的扇区称为 “块”。

所以,文件是由很多个块构成的!!!

        于是,对操作系统而言,读取数据就可以以块为基本单位了。 我们只要知道一个块地址,以及整个磁盘的总大小,那么有多少个块,每一个块的块号,如何从块地址(逻辑区块地址Logical Block Address, LBA)转化到CHS地址全都知道了!!


二、磁盘如何组织存储文件

         磁盘一般比较内存比较大(800GB/1TB等)如果直接管理不容易。所以磁盘需要进行分区。

        我们的PC的C、D、E盘都是一个硬盘分区后产生的一个个分区。

        这样一来,只要能管理好一个分区,就一定能管理好整个磁盘,因为管理方法是可以直接照搬的。

        对于一个分区的管理,操作系统还是采用分组的方法:在一个分区内部分组,然后就只需要管理好一个组,就可以管理好一个分区,自然就可以管理好一整个磁盘了。

对于一个分区,需要先写入文件系统的管理资源,才能在磁盘中进行文件管理。这个过程称为“格式化”。

        对于一个分区内部,不是直接划分为一个个的分组,而是有一定的组织逻辑的:

        接下来,分别介绍这些区域的作用;

        我们知道:文件 = 内容 + 属性

        Data blocks就是存储文件的内容的位置;而inode table是存储文件属性的位置。

        inode是一个大小确定的结构体,里面存储文件的属性信息,比如有文件的大小,文件的权限,文件的创建者,文件的ACM时间(修改、保存、访问)等。(需要注意:indoe内部不包含文件名称)

        一般而言,inode有一个固定的大小 比如128字节,所以无论是怎么样的文件都可以用inode存储文件的属性信息。

        接下来介绍上面的区域的作用:

        Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。

        超级块(Super Block):存放文件系统本身的结构信息。

        记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了

        GDT,Group Descriptor Table:块组描述符,描述块组属性信息。

        块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。

        inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。

        i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等。

        数据区:存放文件内容。(占有大部分空间)

 

         到这里,我们对文件系统的有了基本的理解。那么如何理解文件的增删查改呢?

创建一个新文件主要有一下4个操作:

        1. 存储属性

        内核先找到一个空闲的i节点(这里是263449)。内核把文件信息记录到其中。

        2. 存储数据

        该文件需要存储在三个磁盘块,内核找到了三个空闲块:200,500,900。将内核缓冲区的第一块数据复制到200,下一块复制到500,以此类推。

        3. 记录分配情况

        文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。

        4. 添加文件名到目录

        一个目录的内容本质是文件名与inode的对应关系。

        新的文件名abc。linux如何在当前的目录中记录这个文件?

        内核将入口(263449,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。


三、透彻的看待文件系统

         当我们想要找到指定的文件,那么一定需要先找到文件所在的目录,接下来才可以打开这个目录,根据目录的内容(文件名与inode的对应关系),给出文件名称(对用户而言,是通过文件名来进行文件管理的),找到文件对应的inode。得到了文件的inode,就可以对文件进行任何操作了。

        但是这里有一个前提条件:找到文件所在的目录!

        文件所在的目录如何找到?

        由于目录也是文件,所以上面的过程会被重复进行,于是会发现这就是一个递归的过程。直到最终找到根目录,根目录的inode是已经规定好的,所以不需要再找。

        上面的这个过程称为逆向的路径解析。这也就解释了为什么在Linux中对文件操作:无论是C/C++的文件操作,还是系统调用,都需要带上路径的原因!!

        由于这个过程使用非常频繁,所以Linux会对这个路径系统进行缓存,目的为了提高效率。

 四、文件分区的创建

        我们可以手动创建一个分区,具体指令不是本文的重点,所以不再列出。重要的是inode是在一个分区内部才是有效的。但是分区有多个,操作系统是如何区分不同的分区呢,因为只有区分了分区,操作系统才可以根据我们提供的文件名,进一步转化为inode,来查找我们需要的文件。

        操作系统如何区分不同的分区?

        分区在创建之后,需要格式化,最重要的是需要把这个分区挂载到一个目录中。挂载的这一操作就决定了这个分区的位置信息:一串字符串。我们如果有很多个分区,需要把分区挂载到不同的目录下。

        我当时在哪个目录里,我就在哪个分区下!

         这就解释了Linux可以区分不同分区的inode的原因。


完·~

未经作者同意禁止转载

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

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

相关文章

止步阿里一面。。。

时间过的真快,转眼间国庆已经过去一周了,又到了新的一周,继续分享最新的面经。 今天分享的是粉丝在阿里巴巴的一面,考察了数据库、redis、kafka、ES和项目,数据库和redis不用多说,项目必用面试必考&#x…

【隐私计算篇】替换半同态使用全同态加速计算联邦机器学习算法的实证分析

1. 背景介绍 联邦学习(Federated Learning,FL)是隐私计算中常见的一种技术范式,其本质是一种面向可信数据流通的分布式机器学习框架,允许多个参与方在不共享其本地数据的前提下,协同训练机器学习模型。与传…

Python | Leetcode Python题解之第479题最大回文数乘积

题目: 题解: class Solution:def largestPalindrome(self, n: int) -> int:if n 1:return 9upper 10 ** n - 1for left in range(upper, upper // 10, -1): # 枚举回文数的左半部分p, x left, leftwhile x:p p * 10 x % 10 # 翻转左半部分到其…

【C语言刷力扣】1748.唯一元素的和

题目: 法一 解题思路: 由于 nums.length 小于100,新建数组 num[101],用来遍历存放 nums[i]出现的次数。 int sumOfUnique(int* nums, int numsSize) {int result 0;int num[101] {0}; // memset(num, 0, sizof(num));for (int…

写一个菜谱网站,数据库应该怎么设计?AI回答我动手!

大部分问题使用chatglm4-9b进行回答,总体效果不错,大家可以来试试。关于如何使用ChatGLM4-9b模型,可以参考:在启智AI平台实践ChatGLM4-9B聊天机器人MindSpore-CSDN博客 设计数据库 问题 写一个菜谱网站,数据库应该怎…

mongodb-7.0.14分片副本集超详细部署

mongodb介绍: 是最常用的nosql数据库,在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb(分片副本)集群。 环境准备 系统系统 BC 21.10 三台服务器:192.168.123.247/248/249 安装包&#xff1a…

STM32L010F4 最小系统设计

画一个 STM32L010F4 的测试板子...... by 矜辰所致前言 最近需要用到一个新的 MCU: STM32L010F4 ,上次测试的 VL53L0X 需要移植到这个芯片上,网上一搜 STM32L010F4,都是介绍资料,没有最小系统,使用说明等。…

element plus的el-select分页

摘要&#xff1a; el-select的数据比较多的时候&#xff0c;必须要分页&#xff0c;处理方案有全部数据回来&#xff0c;或者添加搜索功能&#xff0c;但是就有个问题就是编辑的时候回显问题&#xff0c;必须要保证select的数据有对应的id与name匹配回显&#xff01; <el-fo…

Pytest基于fixture的参数化及解决乱码问题

我们知道&#xff0c;Pytest是Python技术栈下进行自动化测试的主流测试框架。支持灵活的测试发现、执行策略&#xff0c;强大的Fixture夹具和丰富的插件支持。 除了通过pytest的parametrize标签进行参数化外&#xff0c;我们通过fixture的param参数也可以比较方便地实现参数化…

Android从上帝视角来看PackageManagerService

戳蓝字“牛晓伟”关注我哦&#xff01; 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章&#xff0c;技术文章也可以有温度。 前言 阅读该篇之前&#xff0c;建议先阅读下面的系列文章&#xff1a; Android深入理解包管理–PackageManagerService和它的“小伙伴…

SPI

Flash-W25Q64 -- 这一章的重点是重点是知道标准SPI通信&#xff0c;地址会算&#xff0c;FLASH时序要会看 目录 Flash-W25Q64 回顾 FLASH SPI简介 单片机&#xff08;32&#xff09;上的SPI W25Q64 模块之间应该怎么通信呢&#xff1f;-- 看时序图 代码编写 更改代码…

Vue Data UI——Vue 3 数据可视化组件库

文章目录 1、Vue Data UI2、核心特点2.1.Vue 3 的深度集成2.2 丰富的可视化组件2.3 灵活的定制性2.4 易于集成2.5 文件导出功能2.6 多主题支持3、如何在项目中使用 Vue Data UI?3.1 安装 Vue Data UI3.2 全局注册组件3.3 局部引入组件3.4 使用通用组件3.5 TypeScript 集成4、总…

城市交通系统优化策略:透视拥堵之困,探索流畅之道

在快速城市化的今天&#xff0c;交通拥堵已成为众多大中型城市的“城市病”&#xff0c;严重影响居民生活质量、经济运行效率及环境质量。本文旨在深度剖析城市交通拥堵的根源&#xff0c;并提出一系列行之有效的优化策略&#xff0c;旨在构建更加顺畅、高效、绿色的城市交通系…

R语言实现logistic回归曲线绘制

方式一&#xff1a;编制函数 x<-rnorm(10000)#设置随机种子 #编写绘图函数代码快 f <- function(x){y 1/(1 exp(-x))plot(x,y)}#sigmoid函数 f(x)​ 方式二&#xff1a;Sigmoid函数代码 x<-rnorm(10000)#设置随机种子 #编写绘图函数代码块 #y<-1/(1exp(-x)) y&…

【NOIP1997 普及组第一题】棋盘问题

题目背景 NOIP1997 普及组第一题 题目描述 设有一个NM 方格的棋盘 (1≤N≤100,1≤M≤100) 求出该棋盘中包含有多少个正方形、多少个长方形&#xff08;不包括正方形&#xff09;。 例如&#xff1a;当 N2,M3时&#xff1a; 正方形的个数有 8 个&#xff1a;即边长为 1 的正…

北斗短报文平板终端|军用三防平板|国产加固平板|防爆工业平板

在当今数字化浪潮的推动下&#xff0c;各行各业对智能终端设备的需求日益多样化与专业化&#xff0c;特别是在工业领域&#xff0c;一款集通信、定位、导航及耐用性于一身的设备显得尤为重要。北斗三代短报文工业平板电脑正是应此需求而生&#xff0c;它不仅是一款普通的平板电…

睿赛德科技正式推出RT-Thread开源 4+服务,助力企业用户发展

RT-Thread始于2006 年&#xff0c;是100%由中国开发者编写的开源嵌入式操作系统。经过10多年的发展&#xff0c;已经成为国内最流行的嵌入式操作系统&#xff0c;广泛应用于工业、 电力、轨道交通、智慧城市、智能家居、穿戴、车载、甚至航空航天等领域。 RT-Thread的成功基于对…

基金好书入门阅读笔记《基金作战笔记:从投基新手到配置高手的进阶之路》笔记3

公募基金的分类方式按投资范围分 80%以上资产投资于股票的&#xff0c;叫股票基金&#xff1b;80%以上资产投资于债券的&#xff0c;叫债券基金&#xff1b;80% 以上资产投资于其他基金的&#xff0c;叫FOF; 80%以上资产投资于货币市场的&#xff0c;叫货币基金&#xff1b;以上…

【AI绘画】Midjourney进阶:中心点构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;中心点构图中心点构图的特点使用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 【AI绘画】Midj…

freertos的任务管理

任务函数 任务被实现为C函数。它们唯一特别的地方是它们的原型&#xff0c;它必须返回void并接受void指针参数。以下是函数原型。 void ATaskFunction( void *pvParameters );每个任务本身都是一个小程序。它有一个入口点&#xff0c;通常会在无限循环中永远运行&#xff0c;…