【Linux系统化学习】深入理解文件系统(Ext2文件系统)

目录

前言

磁盘的物理结构

物理结构

 磁头和盘片工作解析图

盘面区域划分图(俯视盘面图)

扇区的寻址、定位(CHS定位)

磁盘存储的逻辑抽象结构

LBA定址 

文件系统

磁盘分区

EXT2文件系统

组块中的信息介绍

查看inode编号


前言

上两篇文章我们研究的是通过进程将文件加载到内存中打开文件对文件进行一系列的操作;但是在计算机内部不是所有的的文件都被打开,大部分文件是没有被打开的(当前并不需要访问),都在磁盘中进行保存;被进程打开的文件需要管理,没有被进程打开的文件也需要被管理

没有被打开的文件的核心工作通过路径快速定位文件,对磁盘中的文件进行增删查改(CRUD)操作。

对文件的管理工作就包括:

  • 进程打开的文件进行管理
  • 没有被打开的储存在磁盘中文件进行管理

这就是文件系统,文件系统的作用解决文件的存储问题。


磁盘的物理结构

操作系统如何管理磁盘中未打开的文件就要从磁盘的物理结构说起,延申抽象程逻辑结构进行解密。

物理结构

 

 磁头和盘片工作解析图

这里的盘片可以想象成一个双面的光盘,通过磁盘高速转动和磁头震动两面都可以写入数据 。

盘面区域划分图(俯视盘面图)

 

磁盘的每一面都含有若干个划分好的宽度相等的同心圆环,又将每个圆环切割成面积相等的扇形形成扇区,扇区的最小存储单元为512字节。

扇区的寻址、定位(CHS定位)

如果我们想要向一个扇区写入:

  1. 首先要找到那一面,本质就是选择磁头(Head)
  2. 再选择该面上的哪一个磁道(Cylinder/track)
  3. 最后选择该磁道上的一个扇区(Sector)

这就是CHS定位法

当我们找到对应的扇区就可以进行写入,可以向任意一个扇区或者向连续多个扇区写入;当然也可以不指定扇区,直接随机写入。


磁盘存储的逻辑抽象结构

不知道大家小时候有没有玩过磁带,磁带本身是一圈一圈盘起来的上面记录着数据;当我们将磁盘破坏以后,就可以将盘起来的磁带拉成一条线。由原来的圆形结构拉直成现在的线性结构。

通过这个案例我们可以将上面磁盘的每个原型结构盘面抽象成线性结构。所有的面组成一个很长线性结构, 将这个很长的线性结构分成几个面线性结构;再将每个面包含的每条磁道划分成线性结构;最后将每个磁道中包含的扇区分成更小的线性结构。这样我们就将物理磁盘结构抽象成为一个类似与数组的线性结构;对于磁盘的管理就变成了对数组的管理。

LBA定址 

一个扇区的大小为512字节,我们将连续的八块扇区组成一个文件块,大小为4KB。

因此操作系统可以按照扇区为单位进行存储也可以基于文件系统,按照文件块为单位进行数据存储。 

我们对每个文件块从头开始进行编号,对某个文件进行CRUD操作时只需要找到文件对应的编号即可;这样的方式称为:逻辑区块地址(Logical Block Address, LBA)


文件系统

磁盘分区

计算机中存放信息的主要的存储设备就是磁盘,但是磁盘不能直接使用,必须对硬盘进行分割,分割成的一块一块的硬盘区域就是磁盘分区。在传统的磁盘管理中,将一个磁盘分为两大类分区:主分区和拓展分区。主分区是能够安装操作系统,是能够进行计算机启动的分区,这样的分区可以直接格式化,然后安装系统,直接存放文件。

磁盘分区的目的:

  • 有利于管理,系统一般单独放一个区,这样由于系统区只放系统,其他区不会受到系统盘出现磁盘碎片的性能影响。
  • 如果一个分区出现逻辑损坏,仅损坏的分区而不是整个硬盘受影响。
  • 每个分区可以根据不同的需求定制。例如,如果一个分区很少往里写数据,就可以将它加载为只读。如果想要许多小文件,就需要使用有许多节点的文件系统分区。

总结:方便管理和降低安全隐患。

就像我们新买的笔记本电脑进行分盘,C盘是系统文件;D盘安装一些软件或者游戏;E盘放我们的代码或者文件等等。

EXT2文件系统

上面我们对一个磁盘进行了分区;假设我们现在有一个500GB的磁盘分为四个区大小分别为100GB、100GB、100GB、200GB,这四个分区的文件存储机制都是一样的,现在我们之研究一个区即可。上面我们提到八个扇区组成一个文件块,那么一个分区就含有数量很多的块,对这些小内存块一一很难管理。但是我们可以将这一块组织起来形成一个块组,对这些形成的块组进行管理。

组块中的信息介绍

Block(块):磁盘中最小存储单元是扇区(1扇区=512Bytes),而文件系统的最小存储单元是Block(一般地,1Block = 4KB = 8 扇区)。在 Ext2 文件系统中,磁盘的整个空间是以块为单位被管理的,块也是被分配来存储数据的最小单位,一个文件即使只有 1 字节,也会至少占用一个存储块。类似于内存中使用地址标记每个字节,文件系统用存储块的块号来标记每个存储块。

Boot Block(引导块):每个磁盘分区的开头 1024 字节大小都预留为分区的启动扇区,存放引导程序和数据,所以又叫引导块。引导块在第一个 Block,即 Block 0 中存放,但是未必占满这个 Block,原因是 Block 的大小可能大于 1024 字节。

inode Table(i结点表):存放文件的属性,如:文件大小、权限、所有者、ACM时间、inode编号、Date blocks中占据的内存块编号。

Data blocks(数据区):磁盘中最小存储单元是扇区(1扇区=512Bytes),而文件系统的最小存储单元是Block(一般地,1Block = 4KB = 8 扇区)。在 Ext2 文件系统中,磁盘的整个空间是以块为单位被管理的,块也是被分配来存储数据的最小单位,一个文件即使只有 1 字节,也会至少占用一个存储块。类似于内存中使用地址标记每个字节,文件系统用存储块的块号来标记每个存储块。

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

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

GDT(Group Descriptor Table/块组描述符):描述块组属性信息,用来描述每个 group 的开始与结束位置的 block 号码,以及说明每个块(superblock、bitmap、inodemap、datablock) 分别介于哪一个 block 号码之间

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

注:超级块并不是每个块组都含有的而是每个分区中的某几个块组含有,当一个超级块失效时含有超级块的块组会将数据进行拷贝。

查看inode编号

ls - l  - i

一般情况下,一个文件一个inode,基本上inode每个文件都要在整个分区具有唯一性;Linux内核中识别文件和文件名没有关系只和inode有关系。因此文件名和inode具有映射关系。

总结:

  • 内容和属性都是数据,并且内容和属性分开存储;内容存储在block中,属性存储在inode中
  • 用户只使用文件名,内核使用inode;文件名和inode具有映射关系
  • 新建文件只需要在inode位图中寻找一个空闲的inode,并且根据块位图分配相应的块;并将相应的块的编号和文件的各种属性填入inode即可。
  • 删除一个文件只需要修改文件inode对应的inode位图即可。
  • 目录也是文件,目录内部直接保存着此目录中所有文件和每个文件的inode的映射关系。
  • 文件名不属于文件属性。

今天对Linux下文件系统的分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法;个人主页还有很多精彩的内容。您三连的支持就是我前进的动力,感谢大家的支持!!! 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营|二叉树总结

二叉树的定义: struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(int val):val(val),left(nullptr),right(nullptr){}TreeNode(int val,TreeNode* left,TreeNode* right):val(val),left(left),…

【Linux】软件包管理器 yum | vim编辑器

前言: 软件包管理器 yum和vim编辑器讲解 文章目录 软件包管理器 yum编辑器-vim四种模式普通模式批量化注释和批量化去注释末行模式临时文件 软件包管理器 yum yum(Yellowdog Updater, Modified)是一个在基于 RPM(管理软件包的格式和工具集合&…

Smart Link和Monitor Link简介

定义 Smart Link,又叫做备份链路。一个Smart Link由两个接口组成,其中一个接口作为另一个的备份。Smart Link常用于双上行组网,提供可靠高效的备份和快速的切换机制。 Monitor Link是一种接口联动方案,它通过监控设备的上行接口…

Facebook Horizon:探索虚拟现实中的社交空间

随着科技的不断进步,虚拟现实(VR)技术正成为社交互动和娱乐体验的新前沿。在这个数字时代,Facebook作为全球最大的社交媒体平台之一,正在引领虚拟社交的新时代,其推出的虚拟社交平台Facebook Horizon成为了…

手持三防平板丨国产化加固平板丨国产三防平板发展的意义是什么?

随着现代科技的快速发展,平板电脑在我们的生活中扮演着越来越重要的角色。然而,传统的平板电脑只能在普通的环境中使用,而无法在恶劣的环境中使用,例如在高海拔、高温、高湿度、沙漠等环境中,传统平板电脑往往会出现故…

自定义Linux登录自动提示语

设置提示语的方式 在Linux系统中,可以通过修改几个特定的文件来实现在用户登录时自动弹出提示语。以下是几个常用的方法: 1. 修改/etc/issue文件: 这个文件用于显示本地登录前的提示信息 sudo vi /etc/issue在项目合作的时候,…

Zoho Desk ‘24|了解客戶支持系統所有新的內容

Zoho Desk 是一款在線客戶工單管理系統,它的核心是以“客戶”爲宗旨,幫助企業從多種渠道爲客戶提供優質的售後服務支持,持續提升客戶滿意度和忠誠度。我們很榮幸地推出Zoho Desk 24,本篇文章我們將會介紹它的新功能以及更新地部分&#xff0c…

Shiro-11-web 介绍

配置 将Shiro集成到任何web应用程序的最简单方法是在web.xml中配置一个Servlet ContextListener和过滤器,该Servlet了解如何读取Shiro的INI配置。 INI配置格式本身的大部分是在配置页面的INI部分中定义的,但是我们将在这里介绍一些额外的特定于web的部…

linux基础学习(10):基本权限与相关命令

1.基本权限 用ls -l查看当前目录文件时,可以看到文件的基本权限 其由10位组成,其中: 第1位:代表文件类型。 - d lbc普通文件目录文件软链接文件块设备文件,也就是硬盘等存储设备的文件字符设备文件,是鼠…

嵌入式day24

开课复工啦~ 冲冲冲! 文件IO: read函数和write函数: 📚 write 接口有三个参数: fd:文件描述符buf:要写入的缓冲区的起始地址(如果是字符串,那么就是字符串的起始地址&…

前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十二章 常用工具函数 (Utils配置)

前言 在项目开发中,我们经常会使用一些工具函数,也经常会用到例如loadsh等工具库,但是这些工具库的体积往往比较大,如果项目本身已经引入了这些工具库,那么我们就没有必要再引入一次,所以我们需要自己封装…

基于JAVA+SpringBoot+Vue的前后端分离的电影院售票管理运营平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 该系统研究背景聚焦于…

【日常聊聊】深度学习进度

🍎个人博客:个人主页 🏆个人专栏:日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 方向一:深度学习的基本原理和算法 方向二:深度学习的应用实例 方向三:深度学习的挑战和未…

vue3项目引入本地js文件,实现一个音频播放按钮

目前有一个需求就是在网页上放置一个音乐控制按钮,并且是在vue3项目里面。于是小白的我遇到了2个问题,第一个问题是如何实现没有进度条的播放按钮,这个网上有现成的代码,可以通过js代码切换不同的图片或者是别的样式,并…

【c语言】c语言转义字符详解

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:c语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

【千帆平台】使用千帆大模型平台创建自定义模型调用API,贺岁灵感模型,文本对话

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《千帆平台》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和…

html的表单标签(上):form标签和input标签

表单标签 表单是让用户输入信息的重要途径。 用表单标签来完成与服务器的一次交互,比如你登录QQ账号时的场景。 表单分成两个部分: 表单域:包含表单元素的区域,用form标签来表示。表单控件:输入框,提交按…

黑马程序员-瑞吉外卖day9

菜品分类下拉列表 CategoryController里面写 /*** 根据条件查询分类数据** param category* return*/GetMapping("/list")ApiOperation("菜品分类目录")public R<List<Category>> list(Category category) {List<Category> list cate…

改进Rust与C++的互操作性,谷歌向 Rust 基金会捐赠100万美元

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 标题&#xff1a;谷歌向 Rust 基金会捐赠 100 万美元&#xff0c;致力于提升 Rust 与 C…

【plt.pie绘制饼图】:从入门到精通,只需一篇文章!【Matplotlib可视化】

【&#x1f4ca;plt.pie绘制饼图】&#xff1a;从入门到精通&#xff0c;只需一篇文章&#xff01;【Matplotlib可视化】&#xff01; 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f3a8; 一、饼图初探&#xff1a;基本概念与用途&#x1f4a…