Linux——文件系统

devtools/2025/2/4 9:27:28/

一·、从硬件出发

1)磁盘的主要构成

        通常硬盘是由盘片、主轴、磁头、摇摆臂、马达、永磁铁等部件组成,其中一个硬盘中有多块盘片和多个磁头,堆叠在一起,工作时由盘片旋转和摇摆臂摇摆及逆行寻址从而运作,磁头可以对盘片进行读写操作,磁头和盘片之间不是挨着的,而是存在一个很小的距离,很具制作工艺不同,可能达到微米级或者是纳米级。每一个盘片的双面都可以进行数据读写,每一面对应一个磁头。

2)磁盘查找数据

        在硬盘上,每一个扇面都有对应的一个磁头,每个扇面都被一个个同心圆划分为多个圆环,这些圆环叫做柱面或者磁道、每一个柱面又被多条半径切割为若干个小块,称作扇区,扇区是磁盘IO的基本单位但不一定是系统IO的基本单位,每一个扇区可以存储的数据大小是相同的,所以越中心区密度越大,越往外密度越小。每个磁头、盘面、柱面、扇区都有自己唯一的编号,所以当查找数据的时候只需要磁头编号、柱面编号、扇区编号这三个参数即可,该定位方法叫做CHS定位法。

3)磁盘逻辑结构抽象

        在磁盘层面,由于每一次IO读取的单位是一个扇区,而每一个扇区的大小都是相同的,所以所有盘面上的所有扇区可以抽象为一个数组,每一个单位都是一个扇区,在操作系统启动的时候,可以获取每个盘面上柱面的个数以及柱面上扇区的个数。当获取到了一个需要进行读取的sectorno后,只需要对扇区编号通过以下操作就可以获取CHS参数,再通过CHS定位法找到指定位置。

         在操作系统层面,由于一次IO只读取一个扇区太慢了,所以会将多个连续的扇区绑定在一起,称为数据块,每次IO读取一个数据块,在管理时,只需要指导起始扇区和扇区偏移量就可以找到所需要读取的扇区编号,再交给磁盘进行IO。文件系统对整个磁盘又进行了分区,每个分区又经过了分组划分为不同的组。

二、文件系统对分组的管理

        文件系统管理

        在磁盘分区格式化时,分区就被划分为一个个分组,分组大小确定后不能改变直至下一次格式化,每个分组由SuperBlock、Group Descriptor Table、Block Bitmap、inode Bitmap、inode Table、Data Blocks组成。在文件系统中,由于文件的内容大小不确定,而文件属性的大小是确定的,所以文件的内容和文件属性是分别存储的。每个系统分区都一定挂载在某个文件下面,访问文件时都是通过文件绝对路径进行访问,使用路径匹配就能确定文件所在的分区。

超级块(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是否空闲可用。在创建一个文件时,会自动遍历inode位图,找到第一个未被占用的节点,将其改为已经占用并且记录偏移量,在节点表中找到对应的位置的inode进行属性管理。

i节点表(inode Table):存放文件属性,如文件大小、所有者、最近修改时间、权限、inode编号(在分区中是唯一的)等。

数据区:存放文件内容。

        文件查找逻辑

        在查找文件时,先通过文件inode编号确定在哪个分组当中,通过inode编号-分组起始inode编号得到偏移量,再通过偏移量,在inode Table中查找对应的inode。在inode结构体中,存在一个block数组用于存放文件对应的数据块位置,其大小是15,其中前12个位置直接指向存放数据的数据块,13、14两个位置存放的数据块里面存放存储数据的数据块位置,(即a,b,c...指向数据,a,b,c...存放在d中,13、14指向d)15在13、14的基础上再套一层(即a,b,c,指向数据,a,b,c存放在d中,d存放在e中,15指向e)。

        超级块(Super Block)

        一个文件系统只存在一个Super Block,只存在于个别分组中,并不是每个分组都存在,每个超级块的数据始终保持一致,这样做的原因是为了将数据块进行备份,同时保持较高的效率。超级块存放了每个分组inode编号的范围,记录了分区的容量与使用情况。

        重谈文件的增删查改

        在linux下面,任何文件都一定在某个文件夹下面,文件夹的本质也是一个文件,其内容存放的是目录下面的文件名和inode编号映射关系,在创建文件的时候,在创建inode后,还需要将inode编号和文件名映射关系写入到文件夹的数据区中。

        所以,在文件夹没有写权限的时候,无法在该文件夹下面创建、修改或者是删除文件,而文件夹没有读权限的时候,无法读取文件夹下面的文件信息。在对文件进行增删查改的时候,都需要对所在的文件夹进行修改,以此类推,直至对根目录文件进行修改。

        

        


http://www.ppmy.cn/devtools/155967.html

相关文章

C++ Primer 标准库vector

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

前端表单验证终极指南:HTML5 内置验证 + JavaScript 自定义校验

系列文章目录 01-从零开始学 HTML:构建网页的基本框架与技巧 02-HTML常见文本标签解析:从基础到进阶的全面指南 03-HTML从入门到精通:链接与图像标签全解析 04-HTML 列表标签全解析:无序与有序列表的深度应用 05-HTML表格标签全面…

Python中的函数(下)

函数返回值 返回单个值 函数可以通过 return 语句返回一个值。一旦执行到 return 语句,函数就会停止执行,并将指定的值返回给调用者。例如: 返回多个值 实际上,Python函数只能返回一个值,但可以通过返回一个元组来模…

基于场景图的零样本目标导航

参考论文:SG-Nav:Online 3D Scene Graph Prompting for LLM-based Zero-shot Object Navigation 0 前言 基于现成的视觉基础模型VFMs和大语言模型LLM构建了无需任何训练的零样本物体巡航框架SG-Nav。 通过VLMs将机器人对场景的观测构建为在线的3D场景图…

C++ Lambda 表达式的本质及原理分析

目录 1.引言 2.Lambda 的本质 3.Lambda 的捕获机制的本质 4.捕获方式的实现与底层原理 5.默认捕获的实现原理 6.捕获 this 的机制 7.捕获的限制与注意事项 8.总结 1.引言 C 中的 Lambda 表达式是一种匿名函数,最早在 C11 引入,用于简化函数对象的…

深入解析 posix_spawn():高效的进程创建方式(中英双语)

深入解析 posix_spawn():高效的进程创建方式 1. 引言 在 Unix/Linux 系统中,传统的进程创建方式主要依赖 fork() 和 exec() 组合。但 fork() 在某些情况下可能存在性能瓶颈,特别是当父进程占用大量内存时,fork() 仍然需要复制整…

计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战

前一篇文章,Tensor 基本操作5 device 管理,使用 GPU 设备 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started PyTorch 计算图和 Autograd 微积分之于机器学习Computational Graphs 计算图Autograd…

线程互斥同步

前言: 简单回顾一下上文所学,上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么,总结一句话,就是tid是用户视角下所认为的概念,因为在Linux系统中,从来没有线程这一说法,…