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

news2024/11/27 17:02:39

目录

前言

磁盘的物理结构

物理结构

 磁头和盘片工作解析图

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

扇区的寻址、定位(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下文件系统的分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法;个人主页还有很多精彩的内容。您三连的支持就是我前进的动力,感谢大家的支持!!! 

 

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

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

相关文章

AIGC专题:生成式人工智能在能源和材料领域中的新机遇

今天分享的是AIGC系列深度研究报告:《AIGC专题:生成式人工智能在能源和材料领域中的新机遇》。 (报告出品方:McKinsey & Company) 报告共计:11页 来源:人工智能学派 利用人工智能的力量…

Python Flask Web + PyQt 前后端分离的项目—学习成绩可视化分析系统

简介 使用工具: Python,PyQt ,Flask ,MySQL 注:制作重点在网页端,因此网页端的功能更全 WEB界面展示: 系统登录分为管理员,老师,学生3部分 管理员统一管理所有的账号信息以及登录…

jvm、jre、jdk的关系

jvm Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。 jre JRE(Java Runtime Environment) 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,主要包括 Java 虚拟机(JVM)、J…

Servlet验证技术

验证技术 验证是验证用户信息并确定该用户是否有权访问服务器资源的过程。用于验证用户信息的各种验证技术包括: 基本验证基于表单的验证摘要验证客户机整数验证1. 基本验证 网站可能包含两种类型的网站,即受保护和不受保护网页。默认情况下,所有用户都可以访问不受保护或者…

【Java EE初阶十八】网络原理(三)

3. 网络层 网络层要做的事情主要是两方面: 1)、地址管理:制定一系列的规则,通过地址,描述出网络上一个设备的位置; 2)、路由选择:网络环境是比较复杂的,从一个节点到另一个节点之间,存在很…

【7】知识融合

知识融合(也称本体对齐、本体匹配、实体对齐),即合并两个知识图谱(本体),基本的问题都是研究怎样将来自多个来源的关于同一个实体或概念的描述信息融合起来。 需要确认的是: 等价实例:实体的匹配&#xf…

C++ 调用js 脚本

需求: 使用Qt/C 调用js 脚本。Qt 调用lua 脚本性能应该是最快的,但是需要引入第三方库,虽然也不是特别麻烦,但是调用js脚本,确实内置的功能(C 调用lua 脚本-CSDN博客) 步骤: 1&…

redis 值中文显示乱码

问题: 解决办法: exit退出 进入时添加 --raw参数

ChatGPT魔法1: 背后的原理

1. AI的三个阶段 1) 上世纪50~60年代,计算机刚刚产生 2) Machine learning 3) Deep learning, 有神经网络, 最有代表性的是ChatGPT, GPT(Generative Pre-Trained Transformer) 2. 深度神经网络 llya Suts…

小学校园气象站:气象科普与校园安全的新伙伴

【TH-XQ2】近年来,随着气候变化和极端天气的频发,气象科普逐渐受到了社会各界的关注。而在小学校园中,校园气象站设备的引入,不仅为气象科普提供了一个生动的实践平台,同时也为校园安全提供了新的保障。 小学校园气象…

【JavaEE】_线程的状态与转移

目录 1. 线程的状态 1.1 NEW 1.2 RUNNABLE 1.3 BLOCKED 1.4 WAITING 1.5 TIMED_WAITING 1.6 TERMINATED 2. 线程状态的转移 在多线程Thread类相关一文中已经介绍过进程的状态:就绪状态与阻塞状态; 若需详情请查看原文,链接如下&#…

防御第五次------防火墙综合实验

实验要求 1、办公区设备可以通过电信链路和移动链路上网(多对多的NAT、并且需要保留一个公网IP不能用来转换)。 2、分公司的设备可以通过总公司的移动链路和电信链路访问到DMZ区的http服务器 3、分公司内部的客户端可以通过公网地址访问到内部的服务器。

MySQL 学习记录 1

原文:https://blog.iyatt.com/?p12631 1 前言 去年年初报考 3 月的计算机二级(C 语言)【https://blog.iyatt.com/?p9266 】考过了,这次打算报考 3 月的计算机三级(数据库)。数据库这一块,很…

Qt 使用QScintilla 编辑lua 脚本

需求: 利用QScintilla 编辑lua 脚本 步骤: 1,下载 QScintilla Riverbank Computing | Download 2, 打开 src/qscintilla.pro 文件 编译出 dll库 3,工程中引入这个库 注意debug 模式 必须加载debug 版本编译的库&#xff0…

利用R语言绘制相关性热图

数据示例(归一化处理后): install.packages("corrplot") install.packages("ggplot2") install.packages("ggpubr") library(corrplot) install.packages("GGally") library(GGally) library(ggplot…

Linux——信号(2)

在上一张博客我们介绍了Linux中信号的概念和信号是如何产生的,虽然信号 有多种产生方式,但是最终只能由操作系统给对应进程发送特定信号。现在 我将更加规范的介绍Linux中的信号。上一章的遗留问题 我们上一章中在观察信号的默认处理的时候发现终止信号…

UE4 C++联网RPC教程笔记(一)(第1~4集)

UE4 C联网RPC教程笔记(一)(第1~4集) 前言1. 教程介绍与资源2. 自定义 Debug 功能3. Actor 的复制4. 联网状态判断 前言 本系列笔记将会对梁迪老师的《UE4C联网RPC框架开发吃鸡》教程进行个人的知识点梳理与总结,此课程…

软考29-上午题-排序

一、排序的基本概念 1-1、稳定性 稳定性指的是相同的数据所在的位置经过排序后是否发生变化。若是排序后,次序不变,则是稳定的。 1-2、归位 每一趟排序能确定一个元素的最终位置。 1-3、内部排序 排序记录全部存放在内存中进行排序的过程。 1-4、外部…

白话微机:6.解释RTOS以及一些考研面试问题

一. 前言(总结世界观) 很久很久以前,有这样一个世界,这个世界有着现实世界一样的元素:那里的人又有一个别的名字叫做“数据”,人有0有1;人们也有住房,这些住房在这个世界叫做“存储器…

C++-opencv的imread、imshow、waitkey、namedWindow

在C中使用OpenCV时,imread和imshow是两个非常基础且常用的函数,用于读取图像和显示图像。以下是这两个函数的简要说明和如何一起使用它们的示例。 imread函数 imread用于从指定的文件路径读取图像。它将图像读入为cv::Mat对象,这是OpenCV中…