[Linux]文件系统
[Linux]文件系统
文件系统是操作系统的一部分,负责组织、存储和管理存储在外部设备上的文件和目录,也就是操作系统管理外设中的文件的策略。本文讲解的是Ext2文件系统。Linux操作系统使用的就是Ext系列的文件系统。
文章目录
- [Linux]文件系统
- 了解磁盘结构
- 磁盘的物理结构
- 磁盘存储结构
- 磁盘逻辑结构
- EXT2文件系统的存储方案
- inode的具体应用
- 补充细节
- 软硬链接
- 创建软硬链接
- 软硬链接的区别
- 软硬链接的使用场景
- 文件的三个时间
了解磁盘结构
磁盘的物理结构
磁盘是计算机上的唯一的机械设备,作为外设用于存储大量的数据,磁盘内部的物理结构示意图如下:

- 磁盘(如上图的银色圆盘)-- 由多个盘片组成,每个盘片的每个面都能够存储数据
- 磁头 – 每个盘片的每个面都有一个磁头,磁头能够在对应的盘面中读写数据
磁盘存储数据的原理: 计算机中的数据本质就是0和1的区别,因此磁盘只需要利用磁性来代表数据的0和1。
磁盘存储结构

磁盘的每个盘片的盘面被划分成多个部分:
- 磁道: 磁盘表面被分为许多同心圆,每个同心圆称为一个磁道,每个磁道都有一个编号,最外面的是0磁道。
- 扇区: 每个磁道被划分成若干个扇区,每个扇区的存储容量为512字节,每个扇区都有一个编号。
磁盘以扇区为单位进行数据的存储,一个磁盘文件会占据一个或多个扇区的位置来存储,要想加载磁盘文件到内存中,需要定位到磁盘文件所在的一个或多个扇区。

定位扇区的方法:
- 定位数据所在的是哪一个盘面 – 也就是选择哪一个对应的磁头。
- 定位数据在所在盘面的哪一个的磁道。
- 定位数据在所在磁道中的哪一个扇区。
磁头(Heads)、柱面(Cylinder)(等价于磁道)、扇区(Sector)对应的编号。即可在磁盘上定位所要访问的扇区。这种磁盘数据定位方式叫做 CHS 。
磁盘逻辑结构
磁盘需要抽象成逻辑结构的原因:
- OS是软件,磁盘是硬件,磁盘作为外设是可能被改变的,为了防止由于外设的改变而导致物理结构寻址方式的失败,OS采用逻辑地址,将逻辑与物理的转换交给中间软件层驱动程序,实现OS与外设的解耦
- 磁盘存储的基本单位是512字节,OS为了减少IO次数,提高效率,一次IO操作的基本单位是4KB(可调整大小),OS将一次IO的基本单位看作为块,因此需要一套块级别地址进行访问

磁盘的逻辑结构就类似于拉开的磁带,将一个盘片抽象成被拉开的磁带,一圈磁带就类似于一个磁道。逻辑结构示意图如下:

扇区的大小是512字节,而OS一次IO操作的基本单位是4KB,因此OS将一次IO操作的数据抽象成数据块。逻辑结构示意图如下:

OS将整个磁盘最终抽象成了多个连续的数据块,也就是将物理结构转换成了线性逻辑结构,因此OS能够将磁盘看作是有对应下标的数组结构,每个下标指向的是一个数据块,每一个下标也被称作逻辑块地址,简称LBA。OS将磁盘看作是数组结构后,每次IO操作就是找到数据块的首地址,然后从该地址开始读取对应个数的扇区。
EXT2文件系统的存储方案
OS将磁盘看作是由数组结构组织起来的数据块,由于数据块的数量众多,OS将该数组结构划分成多个分区。逻辑结构示意图如下:

将磁盘进行分区后,OS为了更方便的管理,还将每个分区划分成多个分组。逻辑结构示意图如下:

- 磁盘众多分区中,一般第一个分区存在一个
Boot Block区域,该区域存储着OS的开启相关信息,计算机进行开机操作时,会加载磁盘数据,并使用该区域的数据完成开机操作。
将磁盘划分为若干个分组后,OS将一个分组的管理策略运用到每个分组中,实现对整个磁盘的管理。OS的具体管理策略如下:

-
Super Block: 记录该分区文件系统的重要信息,使得操作系统能够正确地使用和管理文件系统。
- Linux系统采用Ext系列的文件系统。
- Super Block在各个分组都可能存在,并且统一更新,是为了防止其损坏后,导致整个文件系统无法使用。
-
Group Descriptor Table: 记录改组的详细属性信息。
-
Block Bitmap: 每个bit表示一个Data Blocks中的数据块是否空闲可用,每个bit对应中的一个Data Blocks中的数据块。
-
inode Bitmap: 每个bit表示一个inode是否空闲可用,每个bit对应inode table中的一个inode。
-
inode Table: 记录该组所有文件的索引节点。
- inode内部的记录的是对应的一个文件的所有属性,由于文件属性的可预见性,一个inode大小为128字节。
- 每一个inode都有自己的inode编号,inode编号也数据对应文件的属性编号。
- inode内部记录了对应文件内容存储的数据块编号。
-
Data blocks: 记录了文件的内容。
- Data blocks区域内部被划分成了若干个大小为4KB的数据块。
- 一个的文件的内容会根据大小使用若干个数据块。
分组中的以上每个区域都可能会使用若干个数据块。
inode的具体应用
-
Linux操作系统是通过文件的inode编号来区分文件的,inode节点中不记录文件名。
-
目录作为文件也有自己的inode节点。
-
目录文件中记录的是该目录下的文件的inode编号和文件名的映射关系。
-
Linux操作系统查询文件的过程:
- 在文件的对应目录下,找到对应文件的inode编号。
- 在对应目录所在的分区下找到对应inode编号所在的分组,结合inode table,找到文件的inode节点。
- 通过inode节点找到对应的数据块。
-
Linux操作系统删除文件的过程:
- 在文件的对应目录下,找到对应文件的inode编号。
- 在对应目录所在的分区下找到对应inode编号所在的分组,结合inode table,找到文件的inode节点。
- 将inode节点中记录的数据块对应在Block Bitmap中的位图置为0。
- 将inode节点对应在inode Bitmap中位图置为0。
-
Linux操作系统添加文件的过程:
- 在要创建文件所在的目录所在的分组中查询inode bitmap,找到未被使用inode。
- 将文件的属性写入新创建的inode。
- 将文件名和inode编号的映射关系追加到所处目录的文件数据块中。
-
Linux操作系统修改文件的过程:
- 在文件的对应目录下,找到对应文件的inode编号。
- 在对应目录所在的分区下找到对应inode编号所在的分组,结合inode table,找到文件的inode节点。如果是空文件会根据写入数据的大小分配相应的数据块,并将数据块对应位图置为1,将数据块信息写入inode。
- 将修改后的数据刷新写入到对应的数据块中。
-
Linux使用
ls指令时带-i选项就可以查看到文件对应的inode编号:

补充细节
文件的恢复
如果文件被误删后,首先要避免文件操作,以防被删除的文件数据被覆盖,然后通过日志记录等技术,找到被删除的文件对应的inode编号将inode编号对应位图置为1,对应数据块置为1,从而完成文件的恢复。
inode编号寻找对应分组的策略
在一个分区中,每个分组所使用的inode编号是有范围的,通过inode编号所在范围能够快速确定inode所在的分组。
分区和分组的完成
在安装操作系统时,会根据用户指定的各分区大小进行分区的设置,然后对会对每个分区进行格式化,格式化就是操作系统向分区写入文件系统管理信息的。
inode记录对应数据块的策略
inode节点中采用数组记录对应数据块,以至于inode节点的大小得以确定,但是如果数组中的一个数据只能对应一个数据块那么,一个inode节点能指向的数据块是有限的,因此inode节点采用三级索引的策略来映射对应的数据块,将该数组划分成三个部分,每个部分采用不同的索引方式。
- 直接索引: 数组记录的数据块编号对应的数据块中就是文件内容。

- 二级索引: 数组记录的编号对应的数据块中记录的是其他数据块的编号,这些被记录在数据块中的数据块编号对应的数据块中存储的是文件内容。

- 三级索引: 数组记录的编号对应的数据块中记录的是其他数据块的编号,这些被记录在数据块中的数据块编号对应的数据块中存储的也是其他数据块的编号并且这些编号指向存储文件内容的数据块。

inode映射的存在的问题
EXT2存储方案存在一个分组,数据块用完、inode没用完或者inode用完、数据块没用完的问题并且如果出现这种情况是无法解决的。
软硬链接
创建软硬链接
- 创建软链接: 在Linux系统下
ln -s 被链接的文件名 软链接名字指令能够创建软连接。

- 创建硬链接: 在Linux系统下
ln 被链接的文件名 硬链接名字指令能够创建硬连接。

软硬链接的区别
-
软链接:
- 软链接有自己的inode编号,是一个独立的文件
- 软链接中存储的是链接文件的路径信息

-
硬链接:
- 硬链接和链接的文件共用同一个inode编号,硬链接和链接文件使用同一个inode
- 硬链接创建的本质是在目录下添加一组inode编号和文件名的映射,并且在对应的inode中的引用计数进行+1操作
- 当inode中引用计数为0代表该文件没有文件名和其inode编号映射,将删除该文件

软硬链接的使用场景
- 软链接适用于某一文件所在路径比较繁琐,可以不用进入路径或打出路径就可以访问文件,功能类似于Windows系统中的快捷方式。

- 硬链接使得Linux系统能够使用相对路径进行操作。

实际上每个目录中的.就是一个硬链接,链接是当前目录,.硬链接实现了以相对路径访问当前目录文件的功能。

在目录下创建一个新目录后,Linux系统会为新目录创建一个..硬链接,链接的就是上级目录,..硬链接实现了以相对路径访问上级目录文件的功能。
可以看出一个目录的硬链接数(目录中的..) = 目录下的目录数量 + 2(目录本身和目录中的.):

注意: 用户不能给目录创建硬链接,避免出现路径环路问题,系统自己维护目录硬链接。
文件的三个时间
- Access 最后访问时间
- Modify 文件内容最后修改时间
- Change 属性最后修改时间
stat 文件名查看文件信息,其中就有文件的这三个时间:

访问文件时 ,Access时间就会进行更新:

注意: 在最新的Linux版本中,为了节省IO操作造成的时间浪费,如果只是单纯的查看数据不一定会立刻修改Access时间。
修改文件内容时 ,Modify和Change时间都会进行更新:

修改文件属性时 ,Change时间会进行更新:

相关文章:
[Linux]文件系统
[Linux]文件系统 文件系统是操作系统的一部分,负责组织、存储和管理存储在外部设备上的文件和目录,也就是操作系统管理外设中的文件的策略。本文讲解的是Ext2文件系统。Linux操作系统使用的就是Ext系列的文件系统。 文章目录 [Linux]文件系统了解磁盘结构…...
常见面试题记录
记录下java的常见面试题 文章目录 记录如下 记录如下 记录如下 hashmap原理lock原理synchronized锁优化过程线程状态以及创建方式线程池(执行过程,参数,淘汰策略)jvm(gc优化和OOM)volatile(可见…...
Android 系统源码目录frameworks/base/packages和packages/apps下的APP区别
概要 在 Android Open Source Project (AOSP) 源代码中,frameworks/base/packages 和 packages/apps 目录都包含 Android 系统中的应用程序,但它们在性质和用途上有一些区别: 1,frameworks/base/packages frameworks/base 目录…...
2023年数维杯数学建模A题河流-地下水系统水体污染研求解全过程文档及程序
2023年数维杯数学建模 A题 河流-地下水系统水体污染研 原题再现: 河流对地下水有着直接地影响,当河流补给地下水时,河流一旦被污染,容易导致地下水以及紧依河流分布的傍河水源地将受到不同程度的污染,这将严重影响工…...
Java测试(10)--- selenium
1.定位一组元素 (1)如何打开本地的HTML页面 拼成一个URL :file: /// 文件的绝对路径 import os os.path.abspath(文件的绝对路径) (2)先定位出同一类元素(tag name,name&…...
【文末送书】Matlab科学计算
欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…...
ElementUI浅尝辄止30:PageHeader 页头
如果页面的路径比较简单,推荐使用页头组件而非面包屑组件。 1.如何使用? <el-page-header back"goBack" content"详情页面"> </el-page-header><script>export default {methods: {goBack() {console.log(go bac…...
[Qt]基础数据类型和信号槽
文章目录 1. Qt基本结构1.1 Qt本有项目1.1.1 项目文件(.pro)1.1.2 main.cpp1.1.3 mainwindow.ui1.1.4 mainwindow.h1.1.5 mainwindow.cpp 1.2 Qt中的窗口类1.2.1基础窗口类1.2.2 窗口的显示 1.3 内存回收 2. Qt中的基础数据类型2.1 基础类型2.2 log输出2…...
UIStackView入门使用两个问题
项目中横向一排元素,竖向一排元素,可以使用UIStackView。UIStackView的原理不做介绍,这里主要讲两个初次使用容易出现的两个问题。 首先创建一个stackview -(UIStackView*)titleStackView{if(_titleStackView nil){_titleStackView [UISta…...
【Sentinel】Sentinel与gateway的限流算法
文章目录 1、Sentinel与Hystrix的区别2、限流算法3、限流算法对比4、Sentinel限流与Gateway限流 1、Sentinel与Hystrix的区别 线程隔离有两种方式实现: 线程池隔离(Hystrix默认采用)信号量隔离(Sentinel默认采用) 服…...
python实现对excel表中的某列数据进行排序
如下需要对webCms中的B列数据进行升序排序,且不能影响到其他列、工作表中的数据和格式。 import pandas as pd import openpyxl from openpyxl.utils.dataframe import dataframe_to_rows# 读取 Excel 文件 file_path 1.xlsx sheet_name webCms# 读取 Excel 文件并…...
CMS指纹识别
一.什么是指纹识别 常见cms系统 通过关键特征,识别出目标的CMS系统,服务器,开发语言,操作系统,CDN,WAF的类别版本等等 1.识别对象 1.CMS信息:比如Discuz,织梦,帝国CMS࿰…...
STL- 常用算法
概述: 算法主要是由头文件<algorithm> <functional> <numeric>组成。 <algorithm>是所有STL头文件中最大的一个,范围涉及到比较、 交换、查找、遍历操作、复制、修改等等 <numeric>体积很小,只包括几个在序列上面进行简…...
苹果铃声怎么设置?3招教你设置个性化铃声!
苹果手机因其颜值、性能与生态吸引了一大批粉丝用户。在拿到新手机后,大家第一时间就是给手机设置好听的铃声。那么,苹果铃声怎么设置呢?手机铃声能设置成自己喜欢的歌曲吗?当然可以了!本文将给大家介绍3种轻松设置苹果…...
LRTimelapse 6 for Mac(延时摄影视频制作软件)
LRTimelapse 是一款适用于macOS 系统的延时摄影视频制作软件,可以帮助用户创建高质量的延时摄影视频。该软件提供了直观的界面和丰富的功能,支持多种时间轴摄影工具和文件格式,并具有高度的可定制性和扩展性。 LRTimelapse 的主要特点如下&am…...
数据结构和算法(4):栈与队列
栈 ADT 及实现 栈(stack)是存放数据对象的一种特殊容器,其中的数据元素按线性的逻辑次序排列,故也可定义首、末元素。 尽管栈结构也支持对象的插入和删除操作,但其操作的范围仅限于栈的某一特定端。 也就是说…...
pdf怎么转换成dwg格式?简单转换方法分享
当我们需要在CAD中编辑PDF文件中的向量图形时,将PDF转换成DWG格式是一个非常好的选择。因为PDF是一种非常流行的文档格式,很多时候我们会接收到PDF文件,但是PDF文件中的向量图形无法直接在CAD中编辑。而将PDF转换成DWG格式后,就可…...
uniapp使用H5实现预览pdf文件
下载后把压缩包解压到自己的项目的static文件夹下的pdf文件下,如图 新建一个文件名为filePreview.vue <template><view><web-view :src"allUrl"></web-view></view> </template><script>export default {dat…...
Studio 3T for MongoDB的介绍及语法简单介绍
用法介绍 Studio 3T是一款用于MongoDB数据库管理和开发的图形化工具,它提供了许多功能来简化MongoDB的操作和开发过程。以下是一些常见的Studio 3T用法: 连接到MongoDB服务器: 打开Studio 3T并创建一个新连接配置。输入MongoDB服务器的主机名…...
MySQL数据库——存储引擎(1)-MySQL体系结构、存储引擎简介
目录 MySQL体系结构 连接层 服务层 引擎层 存储层 存储引擎简介 概念 语句 演示 下面开始学习进阶篇的第一个内容——存储引擎 分为四点学习: MySQL体系结构存储引擎简介存储引擎特点存储引擎选择 MySQL体系结构 连接层 最上层是一些客户端和链接服务&am…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
