【Linux】文件系统——那就浅聊一下吧

前言

在上一篇文件描述符详解中谈论的都是打开的文件,但是在我们的系统中不仅有打开的文件还有许多未打开的文件,那么这些未打开的文件又该如何理解呢?阅读完本篇文章相信你会得到答案。

如果觉得文章内容对你有所帮助的话,可以给博主一键三连哦!!!

博主水平有限,如果内容有错或者有不足的地方,还望指出,谢谢!!!

背景知识

认识磁盘的结构

磁盘结构主要包括:盘片、磁头、音圈马达主轴马达、控制电机等部分。 

  • 盘片:是磁盘存储数据的核心部件,通常由玻璃或铝制成,并涂有一层磁性材料。这些盘片两面都可以用于数据存储。
  • 磁头:是用于读写磁盘数据的部件,每个盘片上下两面各有一个磁头。磁头悬浮在盘片表面非常微小的距离内,避免与盘片接触。
  • 主轴马达:位于盘片的中心,负责驱动盘片以恒定的速度旋转。

磁盘的存储结构 

在每一个磁盘的盘片上划分了一个个同心圆,这一个个同心圆称为磁道,在磁道上又进一步划分了扇区,磁道是由一个个扇区组成的,所以扇区是磁盘存储数据的基本单位。一般扇区的大小是512字节。

在读写数据时,首先需要将磁头移动到想要读写的扇区所在磁道上,然后通过主轴带动磁盘转动,直到对应的扇区经过磁头,才能完成对扇区的读写操作。

文件系统

磁盘的物理结构是圆形的,可以把上面的磁道抽象成一个拉直以后的一维数组并且这个数组非常的大,而这个扇区将数组划分为了一个个区域(每个扇区能存储一定数量的数据),想要访问一个扇区,只要知道数组的下标即可。

而这一个个扇区内就包含了一个文件系统

Linux ext2文件系统,上图为磁盘为文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,磁盘分区被划分一个个的Block。一个Block的大小是由格式化的时候确定的,并且不可以更改。这样一层一层的划分多个区域就好比一个国家太大了不好管理,那么就需要将一个国家划分为一个个省去管理,但是一个省又太大了,再划分为一个个市去管理,市又划分为一个个县…… 这样划分的目的也就是为了方便管理。

  • Block group:ext2文件系统会根据分区的大小划分为数个Block group。而每个Block group都有着相同的结构组成。
  • Super Block:存放文件系统本身的属性信息。记录的信息主要有:Block和 inode的总量,未使用的Block和inode的数量,一个Block和inode的大小,最进一次挂载的时间,最近一次写入数据的时间,最近检验磁盘的时间等其他文件系统的相关系统,每个Block group中可能都会有Super Block用于在异常情况下对数据进行恢复。Super Block的信息被破坏,可以说整个文件系统就被破坏了。
  • Group Descriptor Table:块组描述符,描述块组属性信息
  • Block Bitmap:用了位图的思想,Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。
  • inode Bitmap:每一个比特位表示一个inode是否空闲可用
  • inode Table:存放文件属性,如文件大小、所有者、最近修改时间等
  • Data blocks:存放文件内容

每个文件都有一个inode的编号,并且每个inode编号都是不一样的,所以inode编号可以用来标识一个唯一的文件。

​ 

我们都知道在一个目录下是可以保存多个文件的,并且一个目录下的文件都必须是不重名的,所以在一个目录下文件具有唯一性,根据Linux下一切皆文件,那么目录也是一个文件,是文件就有自己的inode和data Blocks,只不过目录的data Blocks中存的就是目录下的文件名和inode的映射关系。因为同一个目录下文件唯一,inode的值也是唯一的,所以文件名和inode可以互为key值。

所以我们在Linux下创建一个目录时要有x权限(执行权限),目录要求要有w权限(写权限)才能在目录下创建文件(要将文件名和inode的映射关系写入目录的data blocks中),目录具有r权限(读权限)那么你在使用ls -l命令时才能显示该目录下的文件名和属性(从data Blocks中读取相应的文件信息)。

有了上面的知识,那么我们就可以来回答一下下面的问题了

创建文件时,系统做了什么?

首先找到一个分区,在分区中找到一个块组(Block group),在块组中的inode Bitmap中找到一个空闲的inode,找到之后将文件的属性写入inode Table中,将Data blocks中的内容清空(因为刚创建的文件内容为空),然后再Block Bitmap中将对应的Data blocks置为1,最后再将文件名和inode编号写入当前目录中,这样就完成了一个文件的创建。

删除文件时,系统做了什么?

根据用户提供的文件名,到目录中的data Blocks中找到对应的文件名和inode的映射关系,知道了inode再到inode Bitmap和Block Bitmap中将对应的比特位由1置为0,然后再到目录的将文件名和inode的映射关系删除,此时就完成了删除文件的操作。 删除文件时不需要将Data blocks清空,只要将次区域标定为无效即可。所以你经常会看到拷贝一个文件要比删除文件花的时间更多。

那么删除的文件也是可以恢复的,只要你还能找到这个文件的inode就能将文件的数据进行恢复(前提是这个inode编号还没有被使用并且inode Bitmap和Block Bitmap中没有被重复占用)。

查看文件时,系统做了什么?

在目录中找到文件名和inode的对应关系,拿到inode之后,通过inode到inode Table中拿到文件的属性,然后再通过Block Bitmap拿到Data blocks中的内容

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

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

相关文章

请编写函数fun,该函数的功能是:移动字符串中的内容,移动的规则如下:把第1到第m个字符,平移到字符串的最后,把第m+l到最后的字符移到字符串的前部。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

PLSQL数据库

目录 什么是PLSQL数据库 PL数据库的实现方法 PL数据库的基本语法 1.作用 2.语法 3.赋值输出 4.引用 5.异常处理 6.if 判断 7.loop循环 8.while循环 9.for循环 10.游标 11.参数游标 12.索引 13.分区表 什么是PLSQL数据库 PL/SQL(Procedure Language/…

Ansible 指定受控端使用Python的版本

最近在装Ansible,有一台受控端Ubuntu16的服务器,安装了Python2.7.12和Pyhon3.5。当用Ansible连接它时,显示使用的是Python3.5。最后看文档,发现Ansible可以在hosts的文件中指定受控服上运行的Python。 现象 受控端 查看Python版…

STM32 ADC转换器

一、ADC简介 ADC(Analog-Digital Converter,模拟-数字转换器),可以将引脚上连续变化的模拟量转换为内存中存储的数字量,建立模拟电路到数字电路的桥梁 模拟量:时间和幅值均连续的信号,例如&…

IDC首份中国数据安全市场图谱发布,天空卫士实力入选多个版块

IDC于近日发布了《Market Glance:中国数据安全市场图谱,2024》(Doc# CHC51544524,2024年3月)报告,展示了中国数据安全市场的构成和格局,遴选出不同细分市场领域的主要技术服务供应商&#xff0c…

大模型-入门小知识

大模型是什么 大量参数(上亿)深度学习模型 人工只能包含机器学习,深度学习,深度学习包括大模型 单个神经元的计算模型: 大模型是怎么训练的 之前是算法(神经网络)----> 训练(门槛降低&…

工业设备管理平台

在这个数字化、智能化的新时代,工业设备管理平台正成为推动工业转型升级的重要力量。在众多平台中,HiWoo Cloud以其卓越的性能、稳定的服务和创新的理念,赢得了广大用户的青睐。今天,就让我们一起走进HiWoo Cloud的世界&#xff0…

python与上位机开发day02

1.常见运算符 1.1 赋值运算符 赋值运算符主要用来对变量进行赋值,包括如下这些: 运算符描述赋值加等于-减等于*乘等于/除等于//整除等于%模等于**幂等于 实例如下: a 10 a 5 # 等价于 a a5 a *2 # 等价于 a a*21.2 比较运算符 比较运算符主要用来比较两个数据的大小…

20240423给飞凌的OK3588-C开发板适配OV13855【绿屏】查找问题

20240423给飞凌的OK3588-C开发板适配OV13855【绿屏】查找问题 2024/4/23 19:43 修改2个部分: 1、DTS中CAM1由ISP0处理修改为ISP1处理。【感觉修改为ISP1之后就不出错了,难道ISP0有问题?】 2、ov13855.c修改为 荣品的RK3588开发板提供的SDK An…

1212332

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码

C#开发的全套成熟的LIS系统源码JavaScriptSQLserver 2012区域云LIS系统源码 医院云LIS系统是一套成熟的实验室信息管理系统,目前已在多家三级级医院应用,并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标…

抽象工厂模式设计实验

【实验内容】 楚锋软件公司欲开发一套界面皮肤库,可以对 Java 桌面软件进行界面美化。为了保护版权,该皮肤库源代码不打算公开,而只向用户提供已打包为 jar 文件的 class 字节码文件。用户在使用时可以通过菜单来选择皮肤,不同的…

骨传导耳机哪个牌子好?5款年度精品骨传导耳机推荐

在骨传导耳机最开始出现的时候,相信很多人都只关心骨传导耳机的外观颜值和特殊的传声方式,但当你真正用过一段时间后,对骨传导耳机有了更加深入的了解后就会关注到骨传导耳机的使用体验、音质表现、蓝牙性能等具体功能,而随着骨传…

【Flutter】多语言方案二:GetX 版

介绍 多语言方案:GetX版,需要手动自定义字符串引用常量,优点不需要自己管理状态。 目录 介绍运行效果一、安装 GetX二、使用1.语言配置 在lib/core下创建一个language文件夹,文件夹下创建一个local.dart文件2.language文件夹下创…

防反接、防过压、缓启动电路相关

一、防反接电路 电源正确接入时 电流从 VIN 端流向负载,经由 Q3(NMOS) 通向地(GND)。在上电瞬间,由于 MOS 管的体二极管效应,地回路通过体二极管接通。接下来,由于 Vgs(门源电压)大于 Vgsth(门限电压)&…

负载均衡器

服务端负载均衡器 在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如F5),也有软件的(比如Nginx,openResty) 如Nginx ,通过Nginx进行负载均衡,先发送请求…

AAAI-24 | EarnHFT:针对高频交易的分层强化学习(RL)框架 附代码实现

AAAI-24 | EarnHFT:针对高频交易的分层强化学习(RL)框架 摘要(Abstract):高频交易(HFT)使用计算机算法在短时间内(例如秒级)做出交易决策,在加密货币市场(例如比特币)中…

ctfshow web入门 SQl注入 web185--web190

web185 这道题还有另外一个脚本就是用concat的拼接达到有数字的目的 concat(truetrue) 2 concat(true) 1 concat(true, true) 11 然后上脚本(Y4tacker这个师傅的) # Author:Y4tacker import requestsurl "http://341e93e1-a1e7-446a-b7fc-75beb…

Pytest精通指南(27)钩子函数-多重校验(pytest-assume)

文章目录 前言应用场景插件安装注意事项参数分析assert断言示例assume断言示例 前言 pytest-assume是pytest的一个扩展插件,它提供了一种新的断言方式,即**“assume”**。 与常规的assert语句不同,当使用assume进行断言时,即使某个…

【Android12】Bugreport实现原理

Bugreport实现原理 Bugreport Bugreport介绍 Android Bugreport是一个用于记录和收集 Android设备上系统信息、日志和调试信息的工具。 系统发生某些问题时,可以通过bugreport把系统当前时刻点(运行BugRepot的时刻)的系统相关的状态和信息…