当前位置: 首页 > news >正文

【Linux】深入理解文件系统

系列文章

收录于【Linux】文件系统 专栏

关于文件描述符与文件重定向的相关内容可以移步 文件描述符与重定向操作。

可以到 浅谈文件原理与操作 了解文件操作的系统接口。

想深入理解文件缓冲区还可以看看文件缓冲区


目录

系列文章

磁盘

结构介绍

定位数据

抽象管理

文件系统

分组管理

属性存储

内容存储

深入解析文件操作

如何理解inode

创建和删除文件

文件访问

如何存储大文件


磁盘

🧊以前的文章里,我们只讲了文件在内存中的打开时的状态,而今天便是要讲文件于磁盘中是如何存储的。

🧊相信大家虽然经常在讲磁盘,但是实际上对于磁盘的了解并不多,磁盘又分作机械硬盘与固态硬盘,而我们今天所讲的磁盘是机械硬盘,下面一起先来看看它的基本结构吧。

        

结构介绍

🧊盘片:
磁盘通常由一个或多个盘片组成,这些盘片通常是由金属或玻璃等材料制成的圆形薄片。一个盘片有正反两个面。
🧊磁头:
磁头负责读取和写入数据。每个扇面都有一个磁头,它浮动在盘片表面上方,通过微小的电流在磁盘表面上读写数据。
🧊磁道(柱面):
扇面表面被划分为许多同心圆,每个圆被称为一个磁道。数据被写入或读取时,磁头会在特定磁道上移动。
🧊扇区:
磁道被进一步划分为多个扇区,每个扇区存储一定量的数据。磁盘中存储的基本单元,通常为 512 字节或 4 KB。

🧊总结一下,我们存储的数据就是存在一个个扇区之中,通过磁头来对数据内容进行访问。

定位数据

🧊那我们该如何定义扇区的位置呢?

首先要确定在哪个扇面上(根据磁头),之后确定在哪个磁道(根据半径),最后根据扇区编号定位目标扇区的位置。

🧊因此以后找一个扇区只要

  • 磁道(柱面):  cylinder
  • 磁头:            head
  • 扇区:            sector

🧊而这种定位扇区的方法被称作 CHS 定位法。

抽象管理

🧊而在 OS 内部并不是直接使用 CHS 定位法的。

[原因]:

  • 万一硬件发生变化,则 OS 也要变化,因此 OS 的实现需要与硬件解耦
  • 一个扇区的大小(512B)不足 OS 一次 IO 的最小读取单位(4Kb)。

所以,OS 要有自己的一套地址,来进行块级别的管理。

🧊我们沿着磁道,将磁盘展开将盘面抽象成一个数组。于是,我们定位一个扇区便可定位它的下标,因为 OS 是以 4KB 为单位进行 IO 的,故 OS 读取的数据块要包括 8 个扇区,在 OS 的角度甚至可以不关心扇区。

🧊只需要像计算机常规的访问方式那样: 起始地址 + 偏移量,即获取数据块第一个扇区的地址(下标) + 4KB(块的类型)即能访问的整个数据块。

🧊由此我们便可以通过线性下标定位任何一个块了,而这种 OS 管理磁盘的方式被称为逻辑块地址(LBA)。

🧊从 LBA 出发,我们还能够转化得到扇区的 CHS。

  • C: LBA / 每个面的大小 / 每个磁道的大小
  • H: LBA / 每个面的大小
  • S: LBA % 每个磁道的大小

文件系统

分组管理

🧊学习完上面的知识后,我们知道 OS 通过先描述再组织的方式将磁盘抽象成一个大数组进行管理。

🧊而具体管理的方法,就是我们接下来要讲解的内容了。

由于磁盘抽象成的数组过于庞大,首先第一步就需要将其分作几个区域。每个区域的管理方式都是一样的,因此只要管理好一个区域就相当于管理好整个磁盘了。(类似于 begin 和 end 进行下标的划分)

🧊虽然磁盘已经经历过一次分区,但是每个区的大小依旧十分庞大,我们还需要再进行一次分组

🧊由此管理每个区的任务就简化到了管理每个组只要实现一个组的管理通过复制粘贴就可完成其他组的管理,进而完成整个区的管理,而管理好每个区就相当于管理好了整个盘

🧊在每个区内都会有一个Boot Block,又名为启动块,在开机时会通过它读取 OS 镜像的地址,从而找到操作系统,若是这个区域损坏则会直接影响操作系统的启动

🧊同时,组内还划分了不同的块承担了不同的职责: 

  • Super Block: 存储了文件系统的所有属性信息: 文件系统的类型、整个分组的情况等。
  • Group Descriptor Table: 简称 GDT 又叫做组描述符,内部统计了该组内详细的属性信息,例如: 组内各个块如何划分。
  • Block Bitmap: 块位图,标志数据块是否被使用。
  • inode Bitmap: inode 位图,每个比特位表示 inode 是否可用。
  • inode Table: 专门保存 group 内所有文件的 inode 节点。
  • Data Blocks: 具体的数据块。

🧊其中,Super Block 在每个分组都存在,且统一更新,是为了防止万一其发生损坏导致整个分区都无法使用,因此做了多个备份。

属性存储

🧊我们常说,在文件 = 内容 + 属性,在 Linux 中内容和属性是被分开存储的。

一般而言,一个文件内部所有属性的集合就是 inode 节点(128字节),同时一个文件对应一个 inode

🧊在一个分区中便会有大量的文件,因此就会又大量的 inode,由此需要将 group 中所有的 inode 管理起来,即 inode Table。

其中每个 inode 都有自己对应的编号,也属于对应文件的属性 id。我们可以通过 ls -i 查看文件的 inode 编号。

ls -i     //查看文件的inode编号

🧊在之后的访问中,OS 也是根据 inode 编号来进行文件查找或读取内容。

内容存储

🧊存完属性后,那考虑的便是如何存储文件内容。我们通过数据块来保存文件内容,所以一个有效文件保存内容至少需要 1 个数据块

🧊而数据块在 Data Block 中,那么我们该如何定位文件对应的数据块呢?

🧊其实,在 inode 内部便会存入当前文件对应数据块的索引,之后在 Data Block 中定位即可。可以如此近似理解。

struct inode
{int number;...//其他文件属性int datablocks[NUM]; 
};

深入解析文件操作

如何理解inode

🧊Linux 系统中只识别 inode 编号,文件的 inode 中并不存在文件名,文件名提供给用户使用的。我们又该如何理解这层关系呢?

🧊创建一个目录文件后,我们可以观察到目录文件也有自己的 inode 编号,那目录中都存了什么数据呢?

🧊实际上,目录的数据块里保存的就是该目录下文件名文件 inode 编号对应的映射关系,二者互为key值。

🧊因此,任何一个文件都应该在一个目录内部。

🧊同时,inode 可以用于确定分组,inode number 在一个分区中唯一有效,不能跨分区。(分组的起始位置 + 位图的位置)

创建和删除文件

  • 当我们创建一个文件时,首先OS 会在 inode Bitmap 找一个未被使用的 inode 编号分配给当前 inode,填入相关信息后置于 inode Table 中。
  • 再根据inode中的属性和 Block Bitmap 的情况分配对应的数据块,并填入 inode 中的索引表中。
  • 最后再更改目录中的内容,将文件名与该文件 inode 关联起来。

🧊删除文件的话只需要修改两个 bitmap 即可,将空间空闲出来,下次便会直接覆盖写入。

🧊同样电脑文件中的删除操作也并不是直接将文件删除,也是调整空间的状态,因此只要这块空间还没有被写入数据,便能够进行恢复。

文件访问

🧊当我们访问文件时:

  • 首先在当前目录下,找到输入文件名对应的 inode 编号。
  • 一个目录一定隶属于一个分区,结合编号在该分区中找到对应分组,在该分组的 inode table 中找到文件的 inode。
  • 通过 inode 与对应的 Data Block 关联起来,于是便找到了相关数据,进而根据命令进行其他操作。

如何存储大文件

🧊若是直接使用 inode 内部的数组直接索引 Data Block 中的内容,假设一个数组可以存 NUM 个内容,是否意味着我们最大只能存 NUM * 4KB 大小的文件呢?

🧊答案是否定的,我们可以使指向的数据块里的内容并非直接的数据,而是其他数据块的编号,由此拓宽文件的存储大小。

🧊这种索引方式称为二级索引

🧊若使用二级索引还是不足以构建出文件,那可以继续套娃,使用三级索引,在数据块中存储二级索引。这样只要磁盘空间允许,便可以构建出足够大的文件。


🧊好了,今天 文件系统 的相关内容到这里就结束了,如果这篇文章对你有用的话还请留下你的三连加关注。

相关文章:

【Linux】深入理解文件系统

系列文章 收录于【Linux】文件系统 专栏 关于文件描述符与文件重定向的相关内容可以移步 文件描述符与重定向操作。 可以到 浅谈文件原理与操作 了解文件操作的系统接口。 想深入理解文件缓冲区还可以看看文件缓冲区。 目录 系列文章 磁盘 结构介绍 定位数据 抽象管理…...

12.9 专用指令

目录 状态寄存器传送指令 读CPSR 写CPSR 软中断指令 协处理器指令 协处理器数据运算指令 协处理器存储器访问指令 协处理器寄存器传送指令 伪指令 空指令 LDR 指令 伪指令 状态寄存器传送指令 专门用来读写CPSR寄存器的指令 读CPSR MRS R1,CPSR R1 CPSR 写CP…...

Jvm对象回收算法-JVM(九)

上篇文章介绍了jvm运行时候对象进入老年代的场景,以及如何避免频繁fullGC。 Jvm参数设置-JVM(八) 老年代分配担保机制 这个机制的目的是为了提升效率,在minorGC之前,会有三次判断,之后再次minorGC速度会…...

SpringCloud Alibaba微服务分布式架构组件演变

文章目录 1、SpringCloud版本对应1.1 技术选型依据1.2 cloud组件演变: 2、Eureka2.1 Eureka Server : 提供服务注册服务2.2 EurekaClient : 通过注册中心进行访问2.3 Eureka自我保护 3、Eureka、Zookeeper、Consul三个注册中心的异同点3.1 CP…...

【Linux】初步理解操作系统和进程概念

一.认识操作系统 操作系统是一款纯正的 “搞管理” 的文件。 那操作系统为什么要管理文件? “管理” 又是什么? 它是怎么管理的? 为什么? 1.操作系统帮助用户,管理好底层的软硬件资源; 2.为了给用户提供一个…...

TypeScript 中的字面量类型和联合类型特性

字面量类型和联合类型是 TypeScript 中常用的类型特性。 1. 字面量类型: 字面量类型是指具体的值作为类型。例如,字符串字面量类型可以通过给定的字符串字面量来限制变量的取值范围。 let status: "success" | "error"; // status…...

react+jest+enzyme配置及编写前端单元测试UT

文章目录 安装及配置enzyme渲染测试技巧一、常见测试二、触发ant design组件三、使用redux组件四、使用路由的组件五、mock接口网络请求六、mock不需要的子组件 安装及配置 安装相关库: 首先,使用npm或yarn安装所需的库。 npm install --save-dev jest…...

自学网络安全(黑客)

一、为什么选择网络安全? 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。 未来3-5年,是安全行业的黄金发展期,提前踏入…...

【unity小技巧】委托(Delegate)的基础使用和介绍

文章目录 一、前言1. 什么是委托?2. 使用委托的优点 二、举例说明1. 例12. 例2 三、案例四、泛型委托Action和Func1. Action委托2. Func委托 五、参考六、完结 一、前言 1. 什么是委托? 在Unity中,委托(Delegate)是一…...

【MySQL必知必会】第24章 使用游标(学习笔记)

游标 游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句检索出来的结果集游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改只能用于存储过程,不…...

rosbag回放指定话题外的其他话题的方法

假设要回放file.bag包中除/tf话题外的所有话题 方法一 将原本/tf话题转发到另一个“黑洞话题”去,这样/tf话题就没输出了 rosbag play file.bag /tf:/tf_dev_null方法二 使用filter选项,重新生产一个新的不含/tf话题的包 rosbag filter file.bag fi…...

6.2.1 网络基本服务---域名解析系统DNS

6.2.1 网络基本服务—域名解析系统DNS 因特网是需要提供一些最基本的服务的,今天我们就来讨论一下这些基本的服务。 域名系统(DNS)远程登录(Telnet)文件传输协议(FTP)动态主机配置协议&#x…...

通用文字识别OCR 之实现自动化办公

摘要 随着技术的发展,通用文字识别(OCR)已经成为现代办公环境中不可或缺的工具之一。OCR技术可以将印刷或手写文本转换为可编辑或可搜索的数字文本,极大地提高了办公效率并实现了自动化办公。本文将深入探讨OCR技术在实现自动化办…...

Spring Boot 有哪些特点?

目录 一、自动配置 二、嵌入式 Tomcat Web 服务器 三、入门 POM 四、Actuator执行器 API 五、SpringBoot初始化器 一、自动配置 Spring Boot的自动配置是Spring Boot框架提供的一种功能,它可以根据用程序的依赖和配置信息,自动配置一些常见的功能模…...

10个图像处理的Python库

在这篇文章中,我们将整理计算机视觉项目中常用的Python库,如果你想进入计算机视觉领域,可以先了解下本文介绍的库,这会对你的工作很有帮助。 1、PIL/Pillow Pillow是一个通用且用户友好的Python库,提供了丰富的函数集…...

项目里不引入外网链接的解决方法

在写轮播的时候,引入了这个外网的资源是不对的 解决方法: 去外网上把文件下载下来,放在src文件夹下即可 在下面路径下引入下载的文件即可...

Java的jdk配置成功,但是输入java -version等,命令行没有任何反应

问题:现在有很多学生出现这种情况, Java的jdk配置成功,但是输入java -version等,命令行没有任何反应 Java下载后,手动配置环境变量,并且配置好,但是在命令行中无论输入java的什么都没有反应 问…...

MySQL select查询练习

一、创表并插入数据 创表: CREATE TABLE worker (部门号 int NOT NULL,职工号 int NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10) NOT NULL DEFAULT 群众,姓名 varchar(20) NOT NULL,出生日期 date NOT NULL,性别 char(1) DEFAU…...

Github 标星 60K,不愧是阿里巴巴内部出厂的“Java 核心面试神技”

前言 作为一个 Java 程序员,你平时总是陷在业务开发里,每天噼里啪啦忙敲着代码,上到系统开发,下到 Bug 修改,你感觉自己无所不能。然而偶尔的一次聚会,你听说和自己一起出道的同学早已经年薪 50 万&#x…...

git 使用教程

git 使用手册 参考链接: https://blog.csdn.net/wanjun_007/article/details/126770712 git给远程仓库添加分支并上传文件 注意:git init 是建一个自己的本地仓 0 : 先git clone master 分支 1. 先pull master分支 2. git checkout -b &q…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...