前言:

我们前几篇文章讲了缓冲区与重定向的有关概念,这些设计是linux系统的核心机制,对系统性能、资源管理和用户操作灵活性有重要意义。

不涉及一些硬件就不可能让大家清楚地去理解文件系统,所以这篇文章,我将会从计算机组成原理的角度,为大家讲解一下文件系统的构成。

文件被打开了,是存储到内存里的。那么文件没有被打开呢?存储到哪里?

自然是磁盘里。

我们访问一个文件的前提是不是要打开它?那我们访问文件的前提是要找到它,也就是说我们要有对应的路径。

但那么多文件,不只是你一个文件有路径,所有文件都要有路径。众多路径需要被管理起来,所以就出现了文件系统的概念:

磁盘级文件系统与内存级文件系统。

如同我们去取快递一样,快递就好比一个一个的文件,放在菜鸟驿站的快递柜上,我们需要根据快递的编号,找到对应的存放位置,最后取回到我们的宿舍(内存中)。

文件系统又是如何把未打开的文件,在磁盘上管理起来的呢?

我们又如何去理解路径呢?

别着急,我将为大家一一解答。

一、磁盘

像这些机械磁盘,是计算机中唯一一个机械设备。图左是一个机械硬盘,图右是机械硬盘拆开后的样子。

图示为一个服务器,里面嵌入了许多个磁盘,而服务器是计算资源的载体,安装在机柜内 :

图为一个一个的机柜,机房就是存储这些机柜的地方。

不同于我们的其他存储设备,机械磁盘的好处就是容量大,便宜。但它的读取速度就比较慢。

公司里有大量平时用不到的数据,你不可能用其他昂贵的设备来进行存储,自然需要用到机房。


而磁盘是怎么进行存储数据的呢?

我们知道,磁铁是有着南极与北极的,同样的,二进制划分为0,1.

所以,我们就规定南极与北极各自代表0或1。这样,就方便了我们进行二进制数据的存储。

所以我们如何销毁一个磁盘呢?

自然就是对该磁盘进行消磁处理。

一个磁盘的结构如下图所示:

 

 

 我们的机械臂杆上有着多个读写磁头,分别近距离挨着每个盘片的上下两个面。比如上图我们就有着6个读写磁头,以及6个面,二者的数量是相同的。如果我们在读写一个磁头,实际上就是在读写一个磁面。注意,磁头与磁盘之间并没有实际接触,就像是一架飞机贴地1m处飞行一样。

每个面上,存在着包围着中心的,不同大小的环道,我们称之为磁道,而每个磁道上,我们划分了一定区域,每个区域叫做扇区。

有个疑问,我们这上面有不同的扇区,他们的长短是不一样,那么存储大小呢?

在早期的磁盘中,是一样的,但现在的技术已经能做到同质度的存储数据了,也就是说扇区越大,存储的数据越多。

 扇区,是磁盘存储数据的基本单位,通常,一个扇区的大小为512字节。

如果我想修改一个扇区的一个比特位,也要把512字节全部读取到内存才行,所以我们称磁盘为快设备。

磁盘容量=磁头数 × 磁道(柱⾯)数 × 每道扇区数 × 每扇区字节数
这里有个细节:传动臂上的磁头是共进退的(这点⽐较重要,后⾯会说明)

那我们如何定位一个扇区呢?

1、可以先定位磁头(header)
2、确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)
3、定位⼀个扇区(sector)

 

以上3步,被我们称为CHS地址定位法。(但现在大部分已经淘汰了,我们讲这个只是为了帮助大家理解)

⽂件 = 内容+属性 都是数据,⽆⾮就是占据那⼏个扇区的问题!能定位⼀个扇区了,能不能定位多个扇区呢?

 我们可以通过以上的命令查看我们云服务器的磁盘分区

这是一个 50GB的虚拟磁盘(GPT分区表),包含:

  1. 1MB的BIOS引导分区(兼容传统启动)。

  2. 50GB的Linux主分区(实际可用空间)。

 


二、磁带

我们以前也有磁带这种存储设备。

 磁带上⾯可以存储数据,我们可以把磁带“拉直”,形成线性的结构:

那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在⼀起的磁带,那么磁盘的逻辑存储结构,我们也可以类似于:

 

这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA地址定位法。 

 

由于我们前面说到,传动臂上的磁头是共进退的。

所以,我们可以把每个盘面上,相同半径大小的磁道,组成一个柱面 

所以,磁盘物理上分了很多⾯,但是在我们看来,逻辑上,磁盘整体是由“柱⾯”卷起来的。 

因此,把一个磁道展开,我们可以看做是一个一维数组,随后一个柱面上有多个磁道,我们可以看做柱面为二维的扇区数组。多个柱面盘旋起来形成磁盘,所以磁盘可以看作是扇区的三维数组 

所有,寻址⼀个扇区:先找到哪⼀个柱⾯(Cylinder) ,在确定柱⾯内哪⼀个磁道(其实就是磁头位置,Head),在确定扇区(Sector),所以就有了CHS。
如果我们只给你一个LBA地址1000,那你还需要CHS地址吗?
答案是不必需要了,因为LBA与CHS地址可以进行相互转化,所以操作系统 只需要使⽤LBA就可以了!!
这个转化是谁来做啊??
磁盘自己 来做!固件(硬件电路,伺服系统)!
所以:从此往后,在磁盘使⽤者看来,根本就不关⼼CHS地址,而是直接使用LBA地址,磁盘内部⾃⼰可以进行转换。所以:
从现在开始,磁盘就是⼀个元素为扇区的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使⽤如果要磁盘,就可以⽤⼀个数字访问磁盘扇区了。

 三、块

如果我们进行IO操作,是以扇区512字节为单位,未免就太少了。

所以我们可以把一定数量的扇区,划分为一个块。一个块的数据大小为4kb,也就是八个扇区。

而这些块,我们也可以进行编号,比如说,块1,块2,块3.

所以磁盘就划分为了以块为单位的一维数组。

假如我们磁盘中有500GB的存储空间,我们应该如何进行管理呢?

答案是,我们会把这500GB的空间换划分为一个一个的的分区。

就像是大家电脑上的C盘,E盘,D盘。

 

从linux系统看,我的这个就划分为了2个区域。一个分区挂掉了不会影响其他分区,这一切都是为了磁盘的 灵活性、安全性、性能优化和兼容性。

这也体现了分治的思想。我们只需要管理好一个分区,随后把这个分区的管理方法复制到其他分区进行管理就行了。 

那我们该如何管理好一个分区呢?

这里就要开始引入我们的文件系统的概念了。

 四、EXT2文件系统 

1、分区

我们想要在硬盘上储⽂件,必须先把硬盘格式化为某种格式的⽂件系统,才能存储⽂件。⽂件系统的⽬的就是组织和管理硬盘中的⽂件。在Linux 系统中,最常⻅的是 ext2 系列的⽂件系统。其早期版本为 ext2,后来⼜发展出 ext3 和 ext4。ext3 和 ext4 虽然对 ext2 进⾏了增强,但是其核⼼设计并没有发⽣变化,我们仍是以较老的ext2 作为演示对象。
ext2⽂件系统将整个分区划分成若⼲个同样⼤⼩的块组 (Block Group),如下图所示。只要能管理⼀个分区就能管理所有分区,也就能管理所有磁盘⽂件。
ext2⽂件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组
成。

这里独立于分区外的是Boot Block,通常记录的是启动的相关设置。

启动块的大小是确定的,为1KB,由PC标准规定,⽤来存储磁盘分区信息和启动信息,任何⽂件系统都不能修改启动块。启动块之后才是ext2⽂件系统的开始。

而一个分区内通常会存储以上信息: Data blocks,inode Table ,inode Bitmap等。

2、inode 

我们知道,一个文件=属性+数据

那么一个文件的属性信息,其实也是一种数据,我们把这个属性信息以结构体的方式构建出来。

这个结构体我们就把它叫做inode。(所以inode,是文件属性的集合)

通常来说,一个文件就对应着这一个inode。

一个inode的大小通常为128字节,当然也有256字节的情况,我们在这里不讨论256字节的inode。

操作系统与磁盘进行IO交互时基本单位是4KB,所以一个块就有4kb/128字节个inode。

每个inode都有自己的编号:

我们在ls指令后面跟上-i选项就可以查看每个文件的inode的队友编号:

 前面的920502就是inode编号,而每个文件直接的inode编号互不重复。

值得注意的是,在linux中,文件名这个属性并不保存在inode中。

inode table对应这个组里的所有文件属性集。如果我们有一万个文件,inode table中会要占用多少块呢?

:10000*128/4/1024个

既然文件的属性已经被保存起来了,那么文件的内容呢?

答案是保存在Data Blocks中,所以我们可以知道,在linux下,文件的属性与内容是分开存储的

 在inode结构中,还有一个数组:int blocks[NUM],用于存储文件数据块的地址。这个数组直接决定了如何找到文件的实际内容。

blocks[NUM]存储的是文件内容所在的 磁盘块号,通过这些号码可以在磁盘上定位文件的具体数据。


由于时间的原因,本篇文章就暂时写到这里,后面的内容,我会在下一篇文章中为大家详细介绍inode等信息。

结语:

文件系统上怎么知道一个一共有多少inode,还有多少inode没使用这些信息的呢?

下一篇文章再来谈文件系统的块号如何理解,inode的值是怎么来?为什么找文件只需要通过inode就行了这些内容。

本篇文章介绍了大量概念,希望同学们能够进行一定程度的记忆。

如果有任何疑问与指正,欢迎评论区或者私信留言!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89833.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89833.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/89833.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中,stream的filter和list的removeIf筛选速度比较

在 Java 里,Stream 的filter和 List 的removeIf筛选效率要依据具体情形来判断。 1. 操作本质有别 Stream 的 filter: 它是一种中间操作,不会立刻执行,而是把筛选条件记录下来。只有遇到终端操作时,才会开始处理元素。…

Python(28)Python循环语句指南:从语法糖到CPython字节码的底层探秘

目录 引言一、推导式家族全解析1.1 基础语法对比1.2 性能对比测试 二、CPython实现揭秘2.1 字节码层面的秘密2.2 临时变量机制 三、高级特性实现3.1 嵌套推导式优化3.2 条件表达式处理 四、性能优化指南4.1 内存使用对比4.2 执行时间优化技巧 五、最佳实践建议六、总结&#x1…

深度分析:Microsoft .NET Framework System.Random 的 C++ 复刻实现

深度分析:Microsoft .NET Framework Random 的 C 复刻实现 核心原理与算法结构 本实现基于 Knuth 减随机数生成器(Subtractive Random Number Generator),是 .NET Framework 中 System.Random 的精确复刻。其核心特点包括&#x…

[论文阅读] 人工智能 | 在非CUDA硬件上运行几何学习:基于Intel Gaudi-v2 HPU的PyTorch框架移植实践

在非CUDA硬件上运行几何学习:基于Intel Gaudi-v2 HPU的PyTorch框架移植实践 论文标题:PyTorch-based Geometric Learning with Non-CUDA Processing Units: Experiences from Intel Gaudi-v2 HPUs arXiv:2507.01031 (cross-list from cs.LG) PyTorch-ba…

Python-多线程-threading

1 需求 2 接口 3 示例 4 参考资料 Python treading 模块 | 菜鸟教程

2025年- H91-Lc199-- 62.不同路径(多维动态规划)--Java版

1.题目描述 2.思路 dp含义:代表到当前位置的路径数 递推公式:dp[i][j]dp[i-1][j]dp[i][j-1] dp数组初始化,我们要确保第一行和第一列是有值的. dp数组的遍历顺序:我们需要从左往右遍历,从上往下遍历。并且把第一行和第…

char 不是 Java 中的 2 字节(16 位)吗? 为什么用 UTF-8 编码写入时,一个中文要占 3 个字节?

char 不是 Java 中的 2 字节(16 位)吗? 为什么用 UTF-8 编码写入时,一个中文要占 3 个字节? ✅ 一、Java 中的 char 是什么? Java 的 char 是一个 固定大小的 2 字节(16 位)类型&am…

【Elasticsearch】检索排序 分页

检索排序 & 分页 1.测试数据准备2.排序功能2.1 简单字段排序2.2 多字段排序2.3 日期排序 3.分页功能3.1 基础分页3.2 深度分页(不推荐大数据量使用)3.3 使用 search_after 进行高效分页 4.综合示例:高亮排序分页5.实践建议 1.测试数据准备…

Delta、Jackknife、Bootstrap

用班级平均身高的案例,展示 ​Delta、Jackknife、Bootstrap​ 的完整计算过程。 ​0. 数据准备​ ​原始数据(4个学生的身高)​​: 真实均值(目标统计量)​​: ​1. Delta 方法(公式…

企业智脑技术架构设计:紧贴企业场景规划面向未来的发展趋势与实现路径

摘要 本文深入探讨了企业智脑技术架构的设计理念与发展趋势,分析了当前企业智能化转型的技术需求与挑战,提出了一个面向未来的企业智脑技术架构设计方案。文章从底层技术支撑、核心能力构建、应用场景适配、安全合规保障以及未来发展路径五个维度展开论…

新手向:Python方向讲解

从NASA火星任务到TikTok推荐算法,从自动化脚本到量子计算,Python用import antigravity重新定义了编程边界 一、设计哲学:优雅明确的编程禅学 Python之禅(import this): 优美胜于丑陋(Beautifu…

Chrome谷歌浏览器插件ModHeader,修改请求头,开发神器

文章目录一、介绍与下载二、使用一、介绍与下载 ModHeader顾名思义就是让我们可以自定义HTTP请求头或者是重写响应头,包括新增请求头/响应头或者覆盖Chrome浏览器设置的请求头的默认值,同时还可以根据URL Pattern来只对特定网站生效。 有条件的同学可以…

SEW:无监督预训练在语音识别中的性能-效率权衡

摘要 本文研究了自动语音识别(ASR)中预训练模型的性能-效率权衡问题。我们聚焦于 wav2vec 2.0,并形式化了多种影响模型性能和效率的架构设计。基于所有观察结果,我们提出了 SEW(Squeezed and Efficient Wav2vec&#…

linux系统部署express+vue项目

一、准备阶段: 1、安装linux上所需要的环境:npm nodejs nginx pm2 //安装 npm(Node 包管理器) sudo apt install npm//判断是否安装成功 npm -v//安装 Node.js(可以根据需要选择版本) sudo apt inst…

PixiJS教程(004):点击事件交互

1.6 事件交互实现要求:点击宝剑,修改宝剑的颜色。1️⃣实现代码: // 为精灵添加交互事件 sprite.interactive true; sprite.on(click, () > {// 点击精灵时,改变精灵的颜色sprite.tint Math.random() * 0xFFFFFF; });说明&am…

创客匠人助力家庭教育IP破局:从0到1打造创始人个人品牌全攻略

一、IP定位:细分赛道的精准锚定与用户画像构建 在家庭教育8000亿市场规模的竞争中,创始人IP的差异化定位成为破局关键。创客匠人通过“标签化定位”工具,帮助教育者锁定垂直领域,如亲子沟通、青春期教育等细分赛道。以景丽霞老师…

使用坚果云扩容Zotero同步空间的简单快捷方法

本文介绍基于坚果云的WebDAV协议,用于文献管理软件Zotero的文件同步,从而实现Zotero存储空间扩容的方法。 在之前的文章Zotero文献管理软件入门使用方法:软件下载、文献导入、引文插入(https://blog.csdn.net/zhebushibiaoshifu/a…

Java启动脚本

Java启动脚本 编写代码,然后打包 Java-1.0-SNAPSHOT.jar public class test {public static void main(String[] args) {System.out.println("Hello IDEA");} }编写运行脚本 #!/bin/sh WORKDIR$(cd $(dirname $0); pwd) cd $WORKDIRexport JAVA_OPTS"…

VSCode使用ssh远程连接阿里云

1. 终端选择 Windows使用PowerShell Ubuntu和Mac使用Terminal 2. 设置ssh 2.1. 第一台电脑 生成密钥 ssh-keygen -o -t rsa -b 4096 -C "emailexample.com" 按三次回车 查看密钥 cat ~/.ssh/id_rsa.pub 拷贝密钥,粘贴到服务器的密钥框中 2.2. 第…

XLSR-Wav2Vec2:用于语音识别的无监督跨语言表示学习

摘要 本文提出了 XLSR,该方法通过从多种语言的原始语音波形中预训练单个模型,以学习跨语言的语音表示。我们基于 wav2vec 2.0 构建模型,该方法通过对掩蔽后的潜在语音表示解决对比任务进行训练,并联合学习在多种语言之间共享的潜…