[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…...
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%的故障是由轴承问题引起的。因此,能够实时监控矿井主通风机轴承状态的系统,…...
第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,今天给大家介绍一下本文主要探讨了人工智能领域所需学习的高等数学知识及其应用场景。文章详细列出了人工智能中涉及的数学公式,涵盖了微积分、线性代数、概率论等多个数学分支。同时,本文深入介绍了这些数学知…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

