Linux -- 文件系统(文件在磁盘中的存储)
目录
前言:
了解机械磁盘
初始盘片与磁头
盘片是怎么存数据的呢?
详解盘片
如何访问磁盘中的一个扇区呢? -- CHS 定位法
磁盘的逻辑存储
LBA(Logical Block Addressing --- 逻辑块寻址)
如何将 LBA 地址转换为 CHS 地址?
如何管理扇区?
什么是 inode ?
inode 怎么管理文件内容?
什么是数据块?
位图
理解新建/删除文件
理解文件名
前言:
进程运行时会把需要用到的文件从磁盘加载到内存中,那么系统是如何在磁盘中快速找到进程想要的文件的呢?
了解机械磁盘
初始盘片与磁头
从下图中我们可以简单地了解一下机械磁盘:
盘片:文件的数据都存储在盘片中,一个磁盘中不止一块盘片,多个盘片是摞在一起的。当磁盘开始运作时,盘片中间的马达会带动盘片旋转。
磁头: 磁头用于读取盘片中的内容。当磁盘运行时,磁头会旋转到盘片的上方读取盘片的数据。一个盘片有上下两面,两面各有磁头。
当磁盘开始运作时,盘片顺时针(或者逆时针)旋转,磁头绕着轴左右摆动,在盘片中进行寻址,找到想要的位置进行读写。
因为磁头和盘片都是金属做的,两个金属相互摩擦,会把盘片刮花,那么盘片的数据都被刮没了,所以磁头不是紧紧挨着盘片的,而是有一定的距离。除此之外,磁盘内部是无尘的,也是为了防止把盘片刮花!
盘片是怎么存数据的呢?
首先需要明确:计算机在底层硬件层面主要使用二进制数系统进行数据处理和运算,这是因为二进制系统非常适合电子电路的工作方式。二进制只有两个数字:0 和 1,这可以很容易地通过电子信号的两种状态来表示,例如电压的高低、电流的通断等。
但是 0 和 1 只是一种二元状态,盘片中并不是真实地存储着 0 和 1 这两个数字!
盘片可以想象成由无数个磁铁构成,磁铁具有南北极,南北极也是一种二元状态,在盘片上修改数据,实际上也是在修改盘片上磁铁南北极的朝向。
由于磁铁的磁性保持的时间长,所以磁盘可以长时间保存数据,即使断电了数据也不会丢失,因为它们采用的是磁性、电荷捕获或其他物理性质来持久化地存储信息;而内存无论是DRAM还是SRAM,它们都是易失性存储器,它们都需要电力来维持内部电子元件的状态,意味着在断电情况下不能保留信息。所以说磁盘是永久存储介质!
详解盘片
磁道是指磁盘表面用来存储数据的一系列同心圆。每个磁道是磁盘上可以读取或写入数据的一个环形区域。磁盘的每一个面都被划分成许多这样的磁道。
柱面是由所有盘片上的同一半径位置组成的虚拟圆柱体,指在硬盘上多个盘片相同位置的一组同心圆磁道。想象一下,如果你将硬盘垂直切割,并且沿着这个切割面看去,你会看到一组圆形的磁道,这些磁道位于不同盘片的相同径向距离处,这一组磁道就构成了一个柱面。
当提到一个柱面时,实际上指的是该柱面上所有磁头所覆盖的所有磁道。
磁道由多个扇区组成(磁道被划分成多个扇区),每个扇区通常是固定大小的数据块,常见的大小为512字节或4096字节(随着技术的发展,更大容量的硬盘可能会采用更大的扇区)。当硬盘读写头移动到特定磁道上方时,它可以访问该磁道上的所有扇区。
磁道被划分成扇区后,扇区的面积大小可能不一样,但是扇区的内存大小都是一样的!
如何访问磁盘中的一个扇区呢? -- CHS 定位法
每个盘面、磁头都有唯一的编号,在一个盘面里,每一个磁道也有唯一的编号,每一个扇区也有唯一的编号。
如果想访问磁盘中的一个扇区,通过磁头定位,先确定扇区在哪一个磁道(cylinder)上,接着确定要使用哪一个磁头(head)(上面还是下面),最后确认在磁道上的哪个扇区(sector),这种定位方法称为 CHS 定位法。
我们就可以理解,选择哪个磁头,就相当于选择了哪个盘面,磁头的来回摆动是为了定位盘面的磁道,而盘片的旋转是为了寻找磁道上的扇区。
盘片的旋转和磁头的摆动都属于机械运动,机械运动导致磁盘的访问速度是比较慢的,所以需要操作系统把磁盘的数据预加载到内存中,提高效率!
磁盘的逻辑存储
逻辑存储主要涉及文件系统如何管理和访问磁盘上的数据。
LBA(Logical Block Addressing --- 逻辑块寻址)
如果把盘片的所有磁道拉直,磁盘就可以看成非常长的线性空间。
假设有4个盘面(2个盘片),每个盘面有200G,总共800G,每个盘面的基本单元(扇区)为512字节,所以一共有1 677 721 600 个扇区,每一个扇区都有对应的下标,对磁盘的管理,就变成对数组的增删查改。
LBA的主要优点包括:
- 简化了寻址:不需要考虑物理结构如柱面、磁头和扇区。
- 提高了性能:减少了硬件和软件处理复杂寻址逻辑的需求。
- 支持更大的磁盘容量:由于LBA是基于数字的线性地址,它不受传统CHS寻址中柱面数、磁头数和扇区数限制的影响。
如何将 LBA 地址转换为 CHS 地址?
LBA
:逻辑块地址SPT
:每磁道的扇区数(Sectors Per Track)HPC
:每个柱面的磁头数(Heads Per Cylinder)- HPC * SPT : 一个柱面总共有多少个扇区
计算柱面号(C):
C = LBA / ( HPC * SPT )
计算磁头号(H):
H = ( LBA % ( HPC * SPT ))/ SPT
计算扇区号(S):
S = ( LBA % ( HPC * SPT ))% SPT +1
( +1 是因为扇区号是从1开始计数的,而LBA是从0开始计数的。)
如何管理扇区?
假设磁盘中共有 800G,如何管理这 800G 呢?
我们可以对 800G 进行分区,假设分成5个区:100G、100G、150G、150G、300G,假设每个区内部是没有差异的,那么把这 5 个区管理好,不就相当于把 800G 管理好了吗。在我们的电脑中,把磁盘分为 C盘、D盘,就是所说的分区。
同样的道理,假设我们把 100G 进行分组,平均分成 10 组,每组 10G,把这 10G 管理好,100G 也就管理好了。这样把大问题划分成小问题的思想就是分治思想。
那么如何管理好这 10G 呢?
首先,文件 = 内容 + 属性,文件的内容大小是不固定的,但是文件的属性的大小是固定的,Linux 将文件的内容和属性分开存储,inode 可以将文件的内容和属性进行管理!
在每个分组中,都有 Block Bitmap、inode Bitmap、inode Table、Data Blocks。其中,Data Blocks 是用来存储文件的内容。
什么是 inode ?
inode 其实是一个结构体,结构体的内容与文件有关,通常包括:
- 文件类型:表示这是一个普通文件、还是目录、符号链接等。
- 权限:文件的所有者、组和其他用户的读、写、执行权限。
- 所有者ID 和 组ID:标识文件所有者和所属用户组的数字ID。
- 文件大小:以字节为单位的文件大小。
- 时间戳:包括最后访问时间(atime)、最后修改时间(mtime)和状态改变时间(ctime)。
- 指向数据块的指针:这些指针指向实际存储文件数据的数据块。对于小文件,可能直接在inode中存储一些数据;对于大文件,则指向一系列的数据块。
注意文件的 inode 中不包含文件名!!!此外,一个 inode 结构体大小为 128 字节,大小是固定的。
一个文件一个 inode,每个文件都有 inode 编号,inode编号 是在整个分区内唯一有效的数字!所以对文件的管理,就变成了对 inode 的管理。
inode 怎么管理文件内容?
什么是数据块?
每个分组中,都有一个 Data Blocks,也就是数据块。
在EXT2文件系统中,数据块并不是数组。数据块是存储文件内容的最小单位,它们是磁盘上的固定大小的连续空间。EXT2文件系统将磁盘划分为多个相同大小的数据块,每个数据块可以用来存放文件的数据或元数据(如inode信息)。尽管数据块不是数组,但是文件的内容可以通过类似数组的方式来访问。一个数据块只能存放 4KB 大小的数据。
而 inode 定义了数组 block[ 15 ] ,数组中存放着指向数据块的指针,一个数组只能记 15 个数据块的位置,那一个文件最大只有 60KB 吗?
- 数组下标从 0 到 11 是直接映射,指针指向的数据块直接存放文件的内容;
- 下标从 12 到 13 指针指向的数据块存放的是其他数据块的内容,文件的内容存储在这些其他数据块中(一次间接);
- 下标 14 存储的是其他数据块的位置,指针指向的数据块存放的是其他数据块的内容,这些其他数据块中存储的还是其他数据块的内容,此时的数据块的内容为文件的内容(二次间接)。
位图
在Data Blocks 中,有的数据块已经使用了,有的还没有使用, Block Bitmap 可以更快的分辨出哪些已经使用了,哪些还没有使用!
同样的,inode Table 中有的 inode 已经使用了,有的没有,inode Bitmap 的作用和 Block Bitmap 相同!
从下面这张图可以看出,每一个分组都有一张位图,一个分区就会有很多张位图,而 inode编号是在分组中唯一的,那么怎么确定 inode 在哪张位图中呢?
每个分组都会记录自己组的 inode 的起始编号和组内 inode 的个数,假设分组内的起始编号如下:
![]()
假设 inode 编号为 1500,通过比较每个分组的 inode 的起始编号,我们就可以确定 inode 在 Block group 1 中。
根据偏移量 500(500 = 1500 - 1000),就可以在 Block group 1 的位图中查询该文件是否存在。
理解新建/删除文件
新建文件,先查 inode bitmap,找到最小的为 0 的位置,把这个位置改为 1,然后去 inode table 找到对应的位置,把文件的属性填好,把文件的内容填写到数据区中,并把填写的数据区的位置填入到 inode 的block 中。
删除文件,找文件的 inode 编号,把 inode bitmap 改为 0,把 inode 结构体中的 block 数组对应的 block bitmap 改为 0,只是把位图清掉,并不会把inode 和数据区里面的内容清除掉!!
可见,删除文件比新建文件快很多。
理解文件名
作为用户,我们知道的是文件名,并不知道 inode 编号,在不知道文件 inode 编号的情况下,如何找到这个文件呢?
首先我们需要了解目录,目录也是一个文件,文件都有自己的属性+内容,那目录的内容是什么呢?
因为任何一个普通文件,一定在一个目录中,目录的内容是目录中的文件的文件名和 inode 编号之间的映射关系,找文件,只需要找到文件所处的目录,就可以字符串匹配到文件名,进而找到文件名和 inode 的映射关系,找到文件对应的 inode 编号。
目录这个文件的数据块存的就是文件名和 inode 编号之间的映射关系。
新建文件,假设在组 0 里面新建文件,在 inode 位图中找到一个最小的还没有用过的编号,然后把文件的属性都写到对应的 inode 中,有文件内容的话就把文件内容写入到数据块中,然后向上层返回 inode 编号,接着建立文件名和 inode 编号的映射关系,把这个关系写入到文件目录的数据块中。
- 目录没有写权限时,我们没办法在该目录下创建新文件,因为我们新建文件,会修改目录的内容,没有写权限就不能修改目录内容。
- 没有读权限就不能读取inode 和文件名的映射关系。
删除文件,拿着文件名,就可以知道与 inode 的映射关系,找到映射关系,知道 inode 编号后,清掉位图,然后在目录的内容中去掉文件名和 inode 的映射关系,没有目录的写权限也是没办法删除目录下的文件的。
相关文章:

Linux -- 文件系统(文件在磁盘中的存储)
目录 前言: 了解机械磁盘 初始盘片与磁头 盘片是怎么存数据的呢? 详解盘片 如何访问磁盘中的一个扇区呢? -- CHS 定位法 磁盘的逻辑存储 LBA(Logical Block Addressing --- 逻辑块寻址) 如何将 LBA 地址转换为…...
微服务(Microservices),服务网格(Service Mesh)以及无服务器运算Serverless简单介绍
文章目录 什么是微服务?一、定义与特点二、优势三、组件与架构四、应用场景五、挑战与解决方案什么是服务网格?一、定义与特点二、核心组件三、主要功能四、实现工具五、应用场景六、优势与挑战什么是Serverless?一、定义与特点二、主要领域三、优势四、应用场景五、挑战三者…...

【AIGC】AI时代的数据安全:使用ChatGPT时的自查要点
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯法律法规背景中华人民共和国保守秘密法中华人民共和国网络安全法中华人民共和国个人信息保护法遵守法律法规的重要性 💯ChatGPT的数据使用特点ChatGPT数据安全…...
什么是区块链桥?
什么是区块链桥? 区块链桥是一种实现资产从一个区块链转移至另一个区块链的工具,它解决了区块链技术中不同网络之间缺乏互操作性的问题。区块链桥通过创建代表另一区块链资产的合成衍生品,使得原本互不兼容的区块链资产能够相互连接和转移。…...
机器学习框架
机器学习框架 机器学习框架是用于开发和部署机器学习模型的软件工具。它们提供了一组API和工具,帮助开发人员在各种计算设备上构建、训练和部署机器学习模型。以下是几个常见的机器学习框架: 1.TensorFlow: TensorFlow是一个开源的人工智能…...

金三银四:20道前端手写面试题
文章目录 一、前言二、题目1. 防抖节流解读 2.一个正则题3. 不使用a标签,如何实现a标签的功能4. 不使用循环API 来删除数组中指定位置的元素(如:删除第三位) 写越多越好5. 深拷贝解读 6. 手写call bind applycall 解读apply 解读 …...
RAC被修改权限及相关问题
RDBMS : 19.19 修改RAC权限及相关问题 修改RAC权限,参考文档: How to check and fix file permissions on Grid Infrastructure environment (Doc ID 1931142.1) Script to capture and restore file permission in a directory (for eg. O…...

Golang | Leetcode Golang题解之第441题排列硬币
题目: 题解: func arrangeCoins(n int) int {return sort.Search(n, func(k int) bool { k; return k*(k1) > 2*n }) }...

数学建模--什么是数学建模?数学建模应该怎么准备?
前言 这是去年底学数学建模老哥的建模课程笔记;未来本人将陆陆续续的更新数学建模相关的一些基础算法,大家可以持续关注一下;提示:数学建模只有实战才能提升,光学算法没有啥意义,也很难学的很懂。 文章目录…...

Java项目实战II基于Java+Spring Boot+MySQL的智能物流管理系统(源码+数据库+文档)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 随着电商行业的蓬勃发展,物流行业迎来了前所未有的机遇与挑战。面对日益增长的订单量和复…...

【数据分享】2000—2023年我国省市县三级逐月植被覆盖度(FVC)数值(Shp/Excel格式)
之前我们分享过2000—2023年我国250米分辨率逐月植被覆盖度(FVC)栅格数据(可查看之前的文章获悉详情),该数据来源于高吉喜等学者在国家青藏高原科学数据中心平台上分享的数据,合成方式采用月最大值合成&…...

《Linux从小白到高手》理论篇(十一):Linux的系统环境管理
值此国庆佳节,深宅家中,闲来无事,就多写几篇博文。本篇详细深入介绍Linux的系统环境管理。 环境变量 linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容。如果每…...

Qt/C++开源控件 自定义雷达控件
使用Qt框架创建一个简单的雷达图,包含动态扫描、目标点生成、刻度和方向标识。代码实现使用C编写,适合用作学习和扩展的基础。 1. 头文件与基本设置 #include "RadarWidget.h" #include <QPainter> #include <QPen> #include &…...
什么是IDE(集成开发环境)?
集成开发环境(IDE)详解 在软件开发的世界中,集成开发环境(IDE,Integrated Development Environment)扮演着至关重要的角色。它是一个综合性的软件应用程序,旨在为软件开发者提供一整套的、易于使用的工具集,以便他们能够更高效地编写、调试、测试和部署代码。简而言之…...

【Linux】用虚拟机配置Ubuntu 24.04.1 LTS环境
目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件,大家自己去下啊! 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机,然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…...
MacOS升级Ruby版本详解:步骤、挑战与解决方案
MacOS升级Ruby版本详解:步骤、挑战与解决方案 在MacOS上升级Ruby版本是一个涉及多个步骤和考虑因素的过程。Ruby作为一种广泛使用的编程语言,其新版本通常会引入一系列改进,包括性能优化、安全修复和新特性。因此,升级Ruby版本不…...

Log4j的配置与使用详解
Log4j的配置与使用详解 Log4j介绍 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,我们可以控制每条日志的输出格式;只需要通过一个配置文件就可以灵活的配置,…...
docker 的目录有那些,分别存放什么东西
Docker 的目录结构和文件存放位置取决于你所使用的操作系统和Docker的版本。以下是一些常见的目录和它们通常存放的内容: 通用目录 /var/lib/docker (Linux) 这是Docker在Linux系统上的主要数据目录。存放了镜像、容器、数据卷、网络等的元数据和状态信息。具体结构…...
开源模型应用落地-模型微调-语料采集-数据格式化(四)
一、前言 在自然语言处理(NLP)的快速发展中,语料采集作为基础性的步骤显得尤为重要。它不仅为机器学习模型提供了所需的训练数据,还直接影响模型的性能和泛化能力。随着数据驱动技术的不断进步,如何有效并高效地收集、清洗和整理丰富多样的语料,已成为研究者和工程师们亟…...

C语言+单片机
今天内容有点水哈哈(忙着练焊铁技术了嘻嘻) C语言 简单学习了while语言以及其与for语言的区别和适用方法 .循环结构: 初始化语句条件判断句条件控制句 for语句 for(int1;i<100;i){执行条件} for (int i 1; i < 100; i) {printf(&quo…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...