当前位置: 首页 > news >正文

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

标题:[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的原因。


完·~

未经作者同意禁止转载

相关文章:

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

标题:[Linux] 层层深入理解文件系统——(3)磁盘组织组织存储的文件 个人主页水墨不写bug 目录 一、磁盘中的文件 1)磁盘的物理结构 2)磁盘的CHS寻址法 3)磁盘的空间管理 二、磁盘如何组织存储文件 三…...

Apache Cordova学习计划

Apache Cordova(之前称为 PhoneGap): 1. PhoneGap的起源:2008年8月,PhoneGap在旧金山的iPhoneDevCamp上首次亮相,由Nitobe公司开发,目的是“为跨越Web技术和iPhone之间的鸿沟牵线搭桥”。 2. Ph…...

Unity学习日志-API

Untiy基本API 角度旋转自转相对于某一个轴 转多少度相对于某一个点转练习 角度 this.transform.rotation(四元数)界面上的xyz(相对于世界坐标) this.transform.eulerAngles;相对于父对象 this.transform.localEulerAngles;设置角度和设置位置一样,不能单独设置xz…...

Java基础常见面试题总结(上)

基础概念与常识 Java 语言有哪些特点? 简单易学(语法简单,上手容易);面向对象(封装,继承,多态);平台无关性( Java 虚拟机实现平台无关性)&…...

4 -《本地部署开源大模型》在Ubuntu 22.04系统下部署运行ChatGLM3-6B模型

在Ubuntu 22.04系统下部署运行ChatGLM3-6B模型 大模型部署整体来看并不复杂,且官方一般都会提供标准的模型部署流程,但很多人在部署过程中会遇到各种各样的问题,很难成功部署,主要是因为这个过程会涉及非常多依赖库的安装和更新及…...

本地如何使用Pycharm连接远程服务器调试torchrun

pycharm 远程连接服务器并且debug, 支持torch.distributed.launch debug_pycharm远程debug-CSDN博客 上面这个博客写的真的非常好,记录一下,需要注意该博主的主机为mac 本人可调试版本为: 可直接运行版本为:...

Visual Studio 2022常用快捷键

1. 基本编辑快捷键 Ctrl X:剪切选中内容Ctrl C:复制选中内容Ctrl V:粘贴内容Ctrl Z:撤销Ctrl Y:重做Ctrl Shift L:删除当前行Ctrl K, Ctrl C:注释选中的代码Ctrl K, Ctrl U&#xf…...

mysql innodb 引擎如何直接复制数据库文件?

mysql innodb 引擎如何直接复制数据库文件?介绍如下: 1、首先找到数据库文件所在位置 一般可以看my.conf/my.ini配置的文件的“datadir” 看示例: “MAMP”在Macos下的数据库文件位置: /Library/Application Support/appsolu…...

python中的global和nonlocal关键字以及闭包和模块

global i 这样的用法在于 Python 中,但需要在一个函数内部使用,以便将变量 i 声明为全局变量。让我们来详细讲解一下它的用法。 什么是全局变量? 全局变量是指在函数外部定义的变量,可以在任何函数中访问和修改。如果你需要在函数…...

LabVIEW风机滚动轴承监测系统

矿井主通风机作为矿井中最重要的通风设备,一旦出现故障,不仅会影响矿井内的空气质量,还可能引发安全事故。研究表明,通风机中约30%的故障是由轴承问题引起的。因此,能够实时监控矿井主通风机轴承状态的系统&#xff0c…...

第1节 什么是鸿蒙系统

鸿蒙系统(HarmonyOS)是华为公司发布的一款基于微内核的面向全场景的分布式操作系统。以下是对它的具体介绍: 1. 核心特点: • 分布式能力:这是鸿蒙系统的核心优势之一。它能够将多种不同类型的智能终端设备连接起来&a…...

CentOS 7 将 YUM 源更改为国内镜像源

在 CentOS 7 中,将 YUM 源更改为国内的阿里云镜像源可以提高软件包的下载速度。以下是具体的步骤: 1. 备份原有 YUM 源配置 首先,建议你备份当前的 YUM 源配置,以防后续需要恢复: sudo cp -r /etc/yum.repos.d /etc…...

python调用dircmp进行文件夹比较

不同电脑上的同一部署文件,由于更新频率不相同导致两边内容有差异,需要比较两边的文件夹及文件差异。之前写过批量修改文件名的Python代码,因此优先想用python处理。   百度“python 文件夹对比”,不少文章都是自己实现的文件夹…...

微信小程序 - 供应链系统设计

文章目录 一、系统概述二、系统架构设计三、系统安全设计四、系统性能优化五、系统部署与维护 在当今数字化时代,供应链管理对于企业的高效运营至关重要。微信小程序作为一种便捷的移动应用形式,为供应链系统的开发提供了新的机遇。本文将从系统架构设计…...

嵌入式学习-IO进程-Day03

嵌入式学习-IO进程-Day03 IO进程 获取文件属性(stat) 库 库的概念 库的分类 静态库的制作 动态库的制作 进程 进程和程序的区别 进程的特点 进程三段 进程的类型 进程的运行状态 进程状态转换图(重点) 进程的函数接口 创建进程for…...

docker安装elasticsearch和ik分词器

目录 ElasticSearch 了解ElasticSearch ELK技术栈 ​编辑 ElasticSearch与lucene的关系 总结 倒排索引 正向索引 倒排索引 正向和倒排 elasticSearch特定的一些概念 文档和字段 索引和映射 mysql与elasticsearch对比 安装elasticSeacher并部署单例es 创建网络 加…...

|智能门票|008_django基于Python的智能门票设计与实现2024_i16z2v70

目录 系统展示 设计步骤 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…...

QFramework v1.0 使用指南 更新篇:20240919. 新增 BindableDictionary

增加了三个比较常用的屏幕过渡:FadeIn,FadeOut,FadeInOut。 示例代码如下: using UnityEngine;namespace QFramework.Example {public class ScreenTransitionsExample : MonoBehaviour{private void OnGUI(){IMGUIHelper.SetDesignResolut…...

vue实现文件预览和文件上传、下载、预览——多图、模型、dwg图纸、文档(word、excel、ppt、pdf)

整体思路(模型特殊不考虑,别人封装不具备参考性) 图片上传采用单独的组件,其他三种类型采用一个上传组件(仅仅文件格式不同)文件上传采用前端直接上传阿里云的方式图片预览使用elementUI自带的image预览dw…...

探讨人工智能领域所需学习的高等数学知识及其应用场景,涵盖了微积分、线性代数、概率论等多个数学分支。

大家好,我是微学AI,今天给大家介绍一下本文主要探讨了人工智能领域所需学习的高等数学知识及其应用场景。文章详细列出了人工智能中涉及的数学公式,涵盖了微积分、线性代数、概率论等多个数学分支。同时,本文深入介绍了这些数学知…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

Spring Boot面试题精选汇总

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

大数据学习(132)-HIve数据分析

​​​​🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言&#x1f4…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

网站指纹识别

网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

日常一水C

多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...