【Linux】————磁盘与文件系统

作者主页: 作者主页
本篇博客专栏:Linux
创作时间 :2024年10月17日


一、磁盘的物理结构
磁盘的物理结构如图所示:

其中具体的物理存储结构如下:

磁盘中存储的基本单位为扇区,一个扇区的大小一般为512字节或者4kb,这里我们暂且认为是512字节。一般的磁盘,一个扇区都是512字节,同半径所有的扇区构成了一圈磁道。
所以我们要读取指定文件数据的时候,要首先根据确定是哪一个盘面,其次再去确定是哪一个磁道,最后根据扇区的编号去定位扇区即可。其中通过磁头、柱面(磁道)、扇区确来定位扇区的方法叫做CHS定位法。
一个普通文件包括属性 + 内容,本质上都是数据,占据一个或多个扇区,我们既然能够用 CHS 定位任意一个扇区,就能定位任意多个扇区,从而将文件从硬件角度读取或者写入。
二、磁盘逻辑抽象
我们已经知道如果OS可以得知CHS的地址,就能够访问任意一个扇区。但是由于OS是软件,磁盘是硬件,为了防止硬件发生迭代变化OS也要跟着变化,就要做好OS与硬件的解耦工作,因此OS内部使用的不是CHS的地址。
为了减少进行IO操作的频率,OS与外设进行IO操作的基本单位大小是4KB(可以调整)。就算只需要修改一个字节的数据,也需要把这个数据所在的4KB大小的数据都加载进内存,修改好后再统一写回磁盘,因此我们把磁盘称为块设备。OS需要有一套新的地址来进行块级别的访问。
把磁盘磁道看作一个连续的空间结构:
扇区就相当于连续的数组,此时定位一个扇区就只需要一个数组下标了。由于OS是以4KB为单位进行IO的,所以一个OS级别的文件块要包括8个扇区。OS不关心扇区的概念,计算机常规的访问地址是通过 起始地址 + 偏移量 的方式进行的,因此OS访问数据块时,只需要知道数据块的起始地址 + 4KB 就可以了,把数据块看作一种类型。
所以块的地址本质就是数组的一个下标N,以后就可以采用下标N的方式定位任意一个块了。这种寻址方式被称为 LBA ,即逻辑块地址。
获得 LBA 地址后,通过简单的数学计算就可以转换成磁盘的 CHS 地址。假如已知 LBA = 6500 ,磁盘一个磁面的大小为 5000 ,一个磁道的大小为 1000 。则其对应的地址是第 2 个磁面,第 6 个磁道,第 500 个扇区。
从此之后,对于磁盘的管理就被抽象成了对一个大数组的管理。
三、文件系统
由于磁盘很大,为了更加方便的管理,OS对磁盘块进行了分区。分区后再对每一个磁盘区域进行分组。具体结构如下:

在OS对磁盘进行分区时,会在最开始的位置设置一个 Boot Block ,这段区域里面主要保存与OS相关的内容,比如分区表、镜像地址等等。一般而言这个分区存在于 0 号盘面的 0 号磁道的 1 号扇区。当用户开机时,OS会加载磁盘的驱动,读取磁盘的分区表,再从特定分区的开始位置读取到OS所在的地址,并加载OS,此时OS才算真正运行起来。
在之后是OS对每一个分区进行分组形成的诸多 Block group,即块组 。 每一个 Block group 都有上图所示的 6 块区域。
1、Super Block
Super Block保存的是文件系统的所有的属性信息,包括文件系统的类型、整个分组的情况。记录的信息主要有:block和inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最后一次写入数据的时间,最近一次写入磁盘的时间等其他文件系统的相关信息。
2、Group Descriptor Table
GDT 为组描述符,保存该组内的详细统计等属性信息。比如本组内从哪里到哪里是哪部分内容,本组被使用了多少等等。
3、inode Table
一般而言,我们把文件内部所有属性的集合叫做inode节点,一般大小为128字节。一个文件会有一个inode,一个分组内会有大量的文件,也有大量的inode节点,所以在组内会有一个专门的区域来保护这些inode节点,这个区域就叫做inode Table,也叫 inode 表。
在分组内部,每个inode表都有自己的inode编号,inode编号本身也属于对应文件的属性,Linux查找一个文件的时候,也是通过inode编号来查找的。
一个inode对应一个文件,该文件的inode属性和该文件对应的数据块是有映射关系的。
4、Data Blocks
文件的内容是变化的,用数据块来进行保存。所以要保存一个有效文件的内容,就需要 n 个数据块。如果有多个文件就需要多个数据块。这些数据块所在的区域就是 Data Blocks 。一个数据块的默认大小是 4KB 。
Linux查找一个文件,首先找到该文件的inode。在inode结构体内部有一个 int blocks[NUM] 数组,数组内记录了存储该文件内容的数据块的地址。一个分组中,百分之95以上的内容都是 Data Blocks 。
当操作系统要加载一个文件时,只加载该文件的 inode 节点。而 inode 节点中包含该文件内容数据块的映射关系,想要访问哪部分内容,就根据映射关系把哪一部分内容加载到内存中。
5、inode Bitmap
inode Bitmap 是一个位图结构,每个bit表示一个 inode 是否空闲可用。
6、Block Bitmap
Block Bitmap 是一个位图结构,记录着 Data Block 中哪个数据块已经被占用,哪个数据块没
有被占用。
四、Linux下文件系统
在Linux中,使用 ls 指定加上 -i 命令选项,就可以观察到文件的 inode :

1、inode与文件名
Linux系统只认inode值,且inode属性中不会包含文件名,因为文件名只是提供给用户看的
任何一个文件一定存在于目录中,目录其实也是一个文件,也有自己的inode值和对应的数据块,目录的数据库块里保存的是该目录的文件名和inode值对应的映射关系,而且在目录内,文件名与inode编号互为key值
inode number 在一个分区内唯一有效,不能跨分区使用。根据 inode number 可以确定该文件在当前分区的哪一个分组。
2、文件的增删查改
2.1、查看文件内容
当用户访问一个目标文件的内容时,一定是在特定目录下访问的,具体流程如下:
- 先要在当前目录下找到目标文件的 inode number 。
- 一个目录也是文件,也隶属于一个分区,在该分区中通过目标文件的 inode number 找到分组,在该组的 inode Table 区域找到目标文件的 inode 。
- 通过目标文件的 inode 与对应 Data blocks 的映射关系,找到该文件的数据块,加载到OS,最后显示在显示器上。
2.2、删除文件
当用户删除一个目标文件时,具体流程如下:
- 在当前目录下,根据文件名找到目标文件的 inode number 。
- 根据 inode number 找到目标文件的 inode ,结合与对应 Data blocks 的映射关系,把 block bitmap 对应的比特位设置为 0 。
- 根据 inode number 把 inode bitmap 对应的比特位设置为 0 。
2.3、创建文件
当用户创建一个目标文件时,一定是在一个目录下创建的。具体流程如下:
- OS在目录所处的分组里扫描 inode bitmap ,找到空余的位置并设置为 1 ,获得 inode number 。
- 把该文件创建出来后的默认属性填充到对应的 inode 中。
- 在当前所处的目录文件的 Data blocks 里追加一条新的文件名与 inode number 的映射关系。
2.4、补充内容
上面的内容包括分区、分组、填写系统属性等等,这些工作都是OS做的。分区完成之后,为了让分区能够正常使用,需要对分区做格式化操作,即OS向分区写入文件系统的管理属性信息,并做区域划分工作。如果区域划分之前已经做好了,那么格式化操作把位图结构清空,把属性字段设置为初始状态就可以了。
文件系统给 inode 与 Data blocks 建立映射关系通过数组来完成,由于 Data blocks 很大,为了能够映射的过来,数组采用了直接索引、二级索引、三级索引的方式来完成映射,因为不是重点内容,仅作了解,不作讲解。
文件系统中,有可能出现 inode 没用完,Data blocks 用完了。或者 inode 用完了,但是 Data blocks 还有剩余的情况。比如只建立一个文件,然后不断地往这一个文件中塞入数据,消耗 Data blocks。或者不断地建立空文件,消耗 inode 。这种问题目前是没有办法解决避免的。
五、软硬链接
1、软链接
建立软链接指令:ln -s [目标文件] [软链接文件名称]

使用 code-soft 链接了code。code-soft 是一个链接文件。
观察到 code-soft 与 code.c的 inode number 不同,这说明软链接是一个独立的链接文件。有自己的 inode number,必有自己的inode属性和内容。软链接的内容是自己所指向的文件的路径。可以让用户快速的找到目标文件。
软链接的具体用法是:如果一个目标文件的路径非常深,我们每次访问目标文件都要写一遍很长的路径,效率不高。此时就可以使用软链接在工作目录制作一个软链接文件,以方便访问目标文件。类似 Windows 系统中的快捷方式。
2、硬链接
建立硬链接指令:ln [目标文件] [软链接文件名称]
具体操作如下:
使用 code-hard 链接了code.c。 code-hard 是一个普通文件。
观察到 code-hard 与code.c的 inode number 相同,这说明硬链接与原文件是同一个文件,硬链接只是建立了新的文件名与老的inode number的映射关系,只修改了当前目录的内容。
code-hard 与 code.c 的硬链接数都变成了 2 。意思是此时有两种方法可以找到该文件,分别对应两个文件名。硬链接数,本质是一种引用计数。
现在我们使用指令 unlink 来删除硬链接:

此时文件的硬链接数又变成了 1
接下来我们再创建一个目录文件,观察硬链接数:

可以看到目录文件的默认硬连接数是 2 。这是因为目录文件天生拥有两个硬链接,一个是它本身的名字,另一个是在该目录内部的 " . " 符号。如果目录文件的内部还有目录文件,那么该目录文件的硬链接数就变成了 3 :本身的名字、该目录内部的 " . " 符号、该目录内部的目录内的 " .. " 符号:
Linux中不允许对目录进行硬链接
3、为什么要有硬链接
一、文件备份与冗余
- 提供额外的文件访问路径:创建硬链接后,多个文件名可以指向同一个文件的 inode(索引节点)。这意味着可以通过不同的路径名来访问同一个文件内容。如果一个路径名被意外删除或损坏,仍然可以通过其他硬链接路径访问文件,起到了一种备份的作用。
- 增加文件的可靠性:在一些关键应用场景中,通过创建硬链接可以确保文件在多个位置都能被访问,降低了因单个文件名丢失或损坏而导致数据丢失的风险。
二、文件管理与组织
- 方便文件共享:多个用户或程序可以通过不同的硬链接路径同时访问同一个文件,无需复制文件内容,节省了磁盘空间和时间。例如,在一个团队项目中,不同的成员可以通过各自的工作目录中的硬链接来访问共享的文件,实现文件的协同操作。
- 简化文件结构:可以使用硬链接来组织文件系统,使得相关的文件可以通过多个路径进行访问。这对于一些复杂的文件系统结构或需要灵活访问文件的情况非常有用。
三、与传统文件系统的兼容性
- 与旧有系统和工具的兼容性:许多传统的文件系统工具和应用程序都能够理解和处理硬链接。这使得在从旧系统迁移到 Linux 或在不同的文件系统环境中工作时,能够继续使用熟悉的文件管理方式。
- 稳定性和可靠性:硬链接的实现基于文件系统的底层结构,相对稳定可靠。不像某些高级文件系统特性可能会在不同的操作系统版本或文件系统实现中存在差异,硬链接在大多数情况下都能提供一致的行为。
六、动静态库
动静态库的本质就是可执行程序的"半成品"。
一段代码生成一个可执行程序需要以下的四个步骤:
- 预处理:完成头文件的展开,去掉注释,宏替换,条件编译等,最终形成xx.i文件
- 编译:完成语法分析,词法分析,语义分析,符号汇总,检查无误后将代码编译成汇编指令,最终形成xx.s文件
- 汇编:将汇编指令转换成二进制文件,xx.o文件
- 链接:将生成的各个.o文件进行链接,最终形成可执行程序
详细内容在下一篇文章中……
最后:
十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:
1.一个冷知识:
屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。
2.你不用变得很外向,内向挺好的,但需要你发言的时候,一定要勇敢。
正所谓:君子可内敛不可懦弱,面不公可起而论之。
3.成年人的世界,只筛选,不教育。
4.自律不是6点起床,7点准时学习,而是不管别人怎么说怎么看,你也会坚持去做,绝不打乱自己的节奏,是一种自我的恒心。
5.你开始炫耀自己,往往都是灾难的开始,就像老子在《道德经》里写到:光而不耀,静水流深。
最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)
愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!
相关文章:
【Linux】————磁盘与文件系统
作者主页: 作者主页 本篇博客专栏:Linux 创作时间 :2024年10月17日 一、磁盘的物理结构 磁盘的物理结构如图所示: 其中具体的物理存储结构如下: 磁盘中存储的基本单位为扇区,一个扇区的大小一般为512字…...
平衡控制——直立环——速度环
目录 平衡控制原理 平衡控制模型 平衡控制中基于模型设计与自动代码生成技术 速度环应用原理 速度控制模型 平衡控制原理 下图是一个单摆模型,对其进行受力分析如图。 在重力作用下,单摆受到和角度成正比,运动方向相反的回复力。而且在空气中运动的单摆,由于受…...
面试简要介绍hashMap
jdk8之前,hashmap采用的数据结构是数组链表,jdk8之后采用的数据结构是数组链表/红黑树。hashmap的数据以键值对的形式存在,如果两个元素的hash值相同,就会发生hash冲突,被放到同一个链表上--->如何解决hash冲突---&…...
HTTPS如何实现加密以及SSL/TSL加密的详细过程
通过将服务器从 HTTP 提升到 HTTPS 加密,数据在客户端和服务器之间的传输过程中的确得到了安全保护。以下是这种实现加密的机制以及客户端需要做的事情的详细说明。 为什么这样就实现了加密 SSL/TLS 协议: HTTPS 使用 SSL(安全套接层&#x…...
Golang | Leetcode Golang题解之第516题最长回文子序列
题目: 题解: func longestPalindromeSubseq(s string) int {n : len(s)dp : make([][]int, n)for i : range dp {dp[i] make([]int, n)}for i : n - 1; i > 0; i-- {dp[i][i] 1for j : i 1; j < n; j {if s[i] s[j] {dp[i][j] dp[i1][j-1] …...
(done) 什么 RPC 协议? remote procedure call 远程调用协议
来源:https://www.bilibili.com/video/BV1Qv4y127B4/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 可以理解为,调用远程服务器上的一个方法/函数/服务的方式,同时隐藏网络细节 一个 python3 …...
PCL 基于Ransac提取误匹配点对
目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 基于RANSAC的误匹配点对提出函数 2.1.2 点云可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、…...
光速写作 2.0.5 | 专注AI写作,海量素材库
光速写作是一款专为解决写作难题设计的应用。它具有以下功能:- 「AI写作」:帮助分析题目、整理写作思路,合成作文,写出好文章。- 「作文批改」:拍照上传作文后,进行全文点评和分句点评,并进行全…...
【已解决,含泪总结】非root权限在服务器上配置python和torch环境,代码最终成功训练(一)
配置Python环境 没有root权限服务器上有多个python环境但没有自己想要的怎么办 之前跑别的实验的时候改过指定的python3.7版本,但是居然我过了一段时间之后,再次打开,python版本居然又回到2.7(服务器/usr/下的默认python版本&am…...
公安基础知识-通哥
公安机关办理行政案件能力 考点一 治安案件追溯失效 6个月 派出所只有警告和500块以下罚款 公安是行政机关 1、治安小事、刑事案件大事 2、殴打他人-轻伤-(刑事案件)、轻微伤(治安案件) 3、《治安处罚法》《刑法》 4、只能构…...
Python画图|极坐标下的散点图动态输出
【1】引言 前序已经学习过散点图输出和极坐标图输出,文章链接包括但不限于下述部分: python画散点图|scatter()函数小试牛刀(入门级教程)_python ax.scatter-CSDN博客 python画图|极坐标中画散点图_极坐标上的散点图-CSDN博客 …...
揭开MySQL并发中的“死锁”之谜:从原理到解决方案的深度解析
目录 1. 环境准备:创建“账户”和“标记”表1.1 创建 dl_account_t 表1.2 创建 dl_mark_t 表 2. 死锁详解2.1 死锁情景一:相反加锁顺序导致的死锁2.2 死锁情景二:唯一索引冲突引发的死锁 3. 事务隔离级别与锁机制4. 预防与解决死锁的方法4.1 …...
【论文阅读】Reliable, Adaptable, and Attributable Language Models with Retrieval
文章目录 OverviewCurrent Retrieval-Augmented LMsArchitectureTraining Limitations & Future Work Overview Parametic language models的缺点: 事实性错误的普遍存在验证的难度(可溯源性差)难以在有顾虑的情况下排除某些序列适应调整…...
A-Frame负责人Diego Marcos分享WebXR与开源AI的未来
一、引言 在最近的一次播客访谈中,《虚拟现实之声》的主持人Kent Bye与A-Frame的创始人Diego Marcos展开了一场关于WebXR技术及其未来发展潜力的对话。Diego不仅是A-Frame的创始人,同时也是WebXR规范的原创者之一。本次访谈不仅回顾了WebXR的发展历程,还探讨了开源AI技术在…...
【STM32-HAL库】火焰传感器(STM32F407ZGT6)(附带工程下载链接)
一、TEMT6000光照强度传感器 火焰传感器是一种能够检测火焰的传感器,它通过检测空气中的特定波长的光线来检测火焰的存在,并输出一个信号来通知系统发生了火灾 工作原理 火焰传感器的工作原理基于光学检测技术。当火焰燃烧时,会产生一些特…...
git merge没有生成合并提交
有时候本地使用gitmerge命令的时候会发现,合并后的log里边并没有一次merge branch的log,而是把合并分支上的所有commit log都带过来。 这是因为当执行合并操作时,如果目标分支的提交历史是源分支的直接延续(即,目标分支…...
算法题总结(十九)——图论
图论 DFS框架 void dfs(参数) { if (终止条件) {存放结果;return; }for (选择:本节点所连接的其他节点) {处理节点;dfs(图,选择的节点); // 递归回溯,撤销处理结果 } }深搜三部曲 确认递归函数,参数确认终止条件处理目前搜索节…...
android studio编译错误提示无法下载仓库
一、调整方法之一 buildscript {repositories {google()jcenter()//maven { url https://maven.aliyun.com/repository/google }//maven { url https://maven.aliyun.com/repository/central }}dependencies {// classpath "com.android.tools.build:gradle:4.1.1"c…...
基于SpringBoot的时装购物系统【源码】+【论文】
时装购物系统是一个基于Springboot框架开发的Web应用系统,数据库使用的是MySQL。该系统充分考虑了代码的可读性、实用性、扩展性和通用性,页面设计简洁、操作方便,易于后期维护。系统分为管理员和用户两大角色,前台页面提供了商品…...
自动化结账测试:使用 Playwright确保电商支付流程的无缝体验【nodejs]
使用 Playwright 掌握端到端结账测试 在电商领域,结账流程是用户体验中至关重要的一环。确保这一流程的稳定性和可靠性对于维护客户满意度和转化率至关重要。在本文中,我们将探讨如何使用 Playwright 进行端到端的结账测试,确保您的结账系统…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
