文件系统--inode

在这里插入图片描述

文章目录

  • 概述
  • 认识磁盘
    • 了解磁盘的存储结构
    • 对磁盘的存储结构进行逻辑抽象
  • 操作系统对磁盘的使用
    • 宏观认识
    • 细节认识
    • 再谈目录
    • 再谈文件的增删

概述

文件有很多,但是被打开的文件很少,这些没有被打开的文件在磁盘中,这就叫做磁盘文件。每次先打开一个文件,需要先找到这个文件,需要通过文件路劲及文件名先在磁盘中找到这个文件。本篇文章要研究的是磁盘文件,核心问题是如何存取问题。在研究这些问题之前,需要先认识一下硬件–磁盘


认识磁盘

磁盘本质是一个机械设备

在这里插入图片描述

计算机只认识二进制,即0和1,在物理层面上有不同的表现

  • 盘片:可读可写可擦出,一片两面都可以使用
  • 磁头:在磁盘上来回读写,盘片一面一个磁头,磁头和盘片不是挨着的

了解磁盘的存储结构

磁盘是一个机械设备,是一个外设,速度比较慢。

在这里插入图片描述
在这里插入图片描述

磁盘读写的基本单位是扇区,512字节,4KB
1片=n磁道,1磁道=m扇区

这么多扇区,如何找到指定位置的扇区?

  1. 找到指定磁头Header
  2. 磁头移动,找指定的磁道(柱面) Cylinder
  3. 找到指定的扇区(通过磁盘旋转) Sector

上述称为CHS定址法

所谓把文件存储在磁盘,本质是文件在磁盘中占几个扇区

对磁盘的存储结构进行逻辑抽象

为什么需要把磁盘的存储结构进行逻辑抽象?
一方面如果操作系统直接用CHS地址,硬件改了,那么软件也改了,耦合度过高; 另一方面方便实现内核进行磁盘管理。

在块级别上,磁盘被划分为若干个固定大小的块(通常是几KB或几MB)。文件系统会将文件分割成多个块,并将这些块按需存储到磁盘上。每个块都有一个唯一的地址,文件系统通过记录块的地址和文件的元信息(如文件大小、创建时间等)来管理文件的存储和访问。
在这里插入图片描述

最终一个磁盘可以看作是基于扇区的数组,每一个扇区都对应有一个下标来唯一标识。通过这个下标(LBA 逻辑扇区地址),再结合每一面磁道的个数和每一个磁道上扇区的个数就可以定位到该扇区在磁盘上的位置(CHS地址)。

通过逻辑抽象,用户和应用程序可以像操作文件一样操作磁盘上的数据,而不需要了解底层的物理存储细节。文件系统负责将逻辑操作转换为物理操作,并管理数据在磁盘上的存储和检索。这样,文件系统提供了一种方便和可靠的方式来管理和利用磁盘的存储空间。

进一步可得,所谓的文件只需要知道LBA地址,文件=很多个LBA地址(纯硬件)。

操作系统对磁盘的使用

宏观认识

Linux文件系统特点:文件内容和文件属性分开存储
先简单了解一下文件系统:
在这里插入图片描述
在每一个分区内部分组,然后写入文件系统的管理数据

Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的

  • 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节点表:存放文件属性 如 文件大小,所有者,最近修改时间等,一个正常文件一个inode属性
    inode内部不包含文件名,内核层面每一个文件都要有inode_number,我们通过inode号标识一个文件。
    通过ll -li即可查看文件号

在这里插入图片描述
在这里插入图片描述

  • 数据区(Data Blocks):存放文件内容

在这里插入图片描述

细节认识

我们在寻找文件的时候,需要找到inode编号
inode编号是分区为单位整体分配的,一个分区内inode编号不可能重复。两个分区的inode编号可能是重复的,因此inode不能跨分区访问。一个分组使用的inode编号,是在一个范围中;例如,第一个分组时1 ~ 10000,第二个分组是 10001 ~ 20000…
在Super Block和GDT中都会记录start_inode和end_inode,这样就能确定inode在哪一个分组里。

datablocks也是如此

再谈目录

目录=文件属性+文件内容 ,目录也有自己的inode属性

在这里插入图片描述
通过上述可见,目录和文件的属性结构是一致的

查找一个文件,是根据该文件的文件名在系统中找到该文件对应的inode编号。

因此可以解释一下现象:

  1. 一个目录下不能建立同名目录
    文件名的inode互为键值
  2. 查找文件的顺序,先根据文件名找到inode编号,然后根据编号在所在的分区确定范围,确定在某个组里面,然后找对应的inode Bitmap和inode Table,确定是合法的然后找到对应的属性,属性找好了之后,对应的大小等都找到了。
  3. 进入目录需要x权限,目录的r权限本质为是否允许我们读取目录的内容,文件名:inode的映射关系;目录的w权限,新建文件,最后一定要向当前所处的目录中写入文件名和inode映射关系

再谈文件的增删

首先创建文件一定是在一个路径下(目录)进行创建,这个路径就会帮我们定位到一个分区,然后去从第一个分组开始查看当前分组的 GDT 字段,看该分组中 inode 的使用情况,若当前分组中的 inode 还有剩余,接着去读取 inode_Bitmap,获取最近一个未被使用的 inode 编号,然后拿着 inode 编号去 inode_Table 里面找到对应的 inode,将文件的属性信息一填。如果有文件内容,先拿着 inode 编号找到对应的分组,根据写入内容的大小去 Block_Bitmap 中找出对应数量未被使用的块号,然后将这些块号写入到 inode 对应的属性里面,然后拿着块号去 Data blocks 中进行写入。


删除文件只要拿着该文件的 inode 编号,在 inode Table 中找到对应的 indoe,获取到里面的 blocks,即拿到该文件对应的所有块号,然后根据这些块号将 Block Bitmap 中对应的比特位置0(假设 0 表示对应的块未被使用)。最后再根据 inode 编号到 inode Bitmap 中将该 inode 对应的比特位置为0,至此,一个文件就被删除啦。可以发现从头到尾并没有去修改块中的内容,这也是为什么拷贝 4G 的文件很慢,删 4G 的文件很快。所以在理论上,一个被删除的文件,可以根据 inode 将其恢复出来。

在这里插入图片描述

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

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

相关文章

【JavaEE初阶】网络初识|局域网和广域网|交换机和路由器|IP地址|端口号

💡推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击跳转到网站】 关键概念 1.局域网LAN和广域网WAN (1)局域⽹,即Local Area Network&#xff0…

一文扫尽Nas常用Docker软件

NAS(Network Attached Storage,网络附加存储)设备上的Docker软件选择取决于您的具体需求和用途。以下是一些NAS上常用的Docker软件推荐: Docker管理工具: Watchtower:它可以自动更新Docker容器中的镜像&…

浮点型比较大小

浮点数的存储形式 浮点数按照在内存中所占字节数和数值范围,可以分为浮点型,双精度浮点型和长双浮点型数。 代码: printf("lgn:%e \n", pow(exp(1), 100));printf("lgn:%f ", pow(exp(1), 100));输出结果: …

Vue | 自定义组件双向绑定基础用法

Vue | 自定义组件双向绑定基础用法 vue 中,由于单向数据流,常规的父子组件属性更新,需要 在父组件绑定相应属性,再绑定相应事件,事件里去做更新的操作,利用语法糖 可以减少绑定事件的操作。 这里就简单的梳…

ROS | 激光雷达包格式

ros激光雷达包格式: C实现获取雷达数据 : C语言获取雷达数据: Python语言获取雷达数据: python不需要编译,但是需要给它一些权限 chmod x lidar_node.py(当前的文件名字) C实现雷达避障: python…

网络模型-NQA与网络协议联动

一、NQA定义 网络质量分析NQA(Network QualityAnalysis)是一种实时的网络性能探测和统计技术,可以对响应时间、网络抖动、丢包率等网络信息进行统计。NOA能够实时监视网络0oS,在网络发生故障时进行有效的故障诊断和定位。 部署IPv4静态路由与BFD…

SpringBoo+vue3整合讯飞星火3.5通过webscoket实现聊天功能(全网首发)附带展示效果

API版本:Spring Boot 整合讯飞星火3.5通过接口Api接口实现聊天功能(首发)复制粘贴即可使用,后续更新WebSocket实现聊天功能_讯飞星火web聊天-CSDN博客https://blog.csdn.net/qq_53722480/article/details/138865508?csdn_share_t…

QTextEdit将多个字符作为一个整体,不可单独修改

考虑一个问题,QTextEdit如何实现类似微信和QQ聊天输入框中的“xxx”效果,其内容作为一个整体,以突出颜色显示,并且不可以单独编辑修改,只能整体删除修改。 突出颜色显示有很多方式可以实现,例如 通过setT…

【回忆版】数据科学思维与大数据智能分析 2024考试

填空(18分)18个 1.对数变换对大数值的范围进行压缩,对小数值的范围进行扩展 2.提取出大量高频率项与低频率项相关联的虚假模式,即交叉支持(cross-support)模式 3.信息论中() 4.几种…

vivado 设计连接性

设计连接性 IP集成商提供设计师协助,帮助您完成连接过程 设计。图3显示了MHS的一个示例,图4显示了设计帮助 可在IP集成商中获得 地址映射 在XPS中,无论主机访问从机IP,每个从机都有相同的地址。IP integrator为基于master的寻址提…

Fitting Parameterized Three-Dimensional Models to Images

摘要 基于模型的识别和运动跟踪依赖于解决投影和模型参数,使其最佳适应匹配的2D图像特征的3D模型的能力。本文将当前的参数求解方法扩展到处理具有任意曲面和任意数量的内部参数(表示关节、可变尺寸或表面变形)的对象。开发了数值稳定化方法…

games 101 作业4

games 101 作业4 题目题解作业答案 题目 Bzier 曲线是一种用于计算机图形学的参数曲线。在本次作业中,你需要实 现 de Casteljau 算法来绘制由 4 个控制点表示的 Bzier 曲线 (当你正确实现该 算法时,你可以支持绘制由更多点来控制的 Bzier 曲线)。 你需…

鸿蒙ArkUI-X平台差异化:【运行态差异化(@ohos.deviceInfo)】

平台差异化 简介 跨平台使用场景是一套ArkTS代码运行在多个终端设备上,如Android、iOS、OpenHarmony(含基于OpenHarmony发行的商业版,如HarmonyOS Next)。当不同平台业务逻辑不同,或使用了不支持跨平台的API&#xf…

python纯脚本搬砖DNF之深度学习,工作室适用

声明: 本文章仅作学习交流使用,对产生的任何影响,本人概不负责. 转载请注明出处:https://editor.csdn.net/md?articleId103674748 主要功能 脚本已初步完成,可以上机实战了 1.搬砖研究所、海伯伦(持续更新中) 2.自…

【知识拓展】LocalTunnel-高性价比的内网穿透工具(2)

前言 上一篇通过ngrok进行内网穿透,有几个问题: ①需要注册,而且注册需要科学上网,相对麻烦 ②安装配置相对麻烦,authtoekn有限制 上述相对,指的是在非生产环境中做一个简单内网穿透,相对于…

C++系列-C/C++内存管理方式

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” C/C内存分布 在这篇文章开始之前,我们先以一道题目来进行引入: int glovalvar 1; static int staticGlovalvar 1; void Test() {static int staticva…

内网安全--域渗透准备知识

目录 知识点: 0x01 0x02 0x03 系列点: Linux主机信息收集 windows主机信息收集 知识点: 0、域产生原因 1、内网域的区别 2、如何判断在域内 3、域内常见信息收集 4、域内自动化工具收集 -局域网&工作组&域环境区别 -域…

Liunx系统中修改文件的创建时间以及访问时间

在Linux系统中,可以使用touch命令来修改文件的时间戳。以下是一些常用的touch命令选项: (其实在MacOS中也适用) 修改访问时间(Access Time)和修改时间(Modification Time)&#xf…

百亿级流量红包系统,如何做架构?(字节面试真题)

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的架构类/设计类的场景题: 1.如何设计高并发红包系统 &#xff0…

在没有dubbo-admin情况下如何判断zk中注册的dubbo服务是否注册成功

通常我们都是通过dubbo-admin来查看dubbo服务是否注册成功,那么如果没有部署dubbo-admind的情况下,我们如何来判断dubbo服务是否注册成功: 一、首先我们进入到zookeeper bin目录下使用以下指令连接到zk: ./zkCli.sh -server ip:port ip&…