Linux中的文件系统和软硬连接

news2025/7/27 5:49:23

磁盘的访问方式

  1. CHS(柱面,磁头,扇区) 法(磁盘硬件查找):

  1. 确定柱面(C)
    磁头臂移动到对应的柱面位置。例如,柱面号为 5,则磁头移动到第 5 个磁道组
  2. 选择磁头(H)
    激活对应的磁头(即选择具体的盘面)。例如,磁头号为 0 表示第一个盘面
  3. 定位扇区(S)
    等待磁盘旋转,直到目标扇区转到磁头下方。例如,扇区号为 3 表示读取当前磁道的第 3 个扇区

操作系统拿到 CHS 地址之后,会将其转换成 LBA 地址,一般而言,操作系统和硬盘交互时,基本单位为 4KB,也就是 8 个连续的扇区,作为一个块,后续操作系统只需要提供块号,然后磁盘自动向后数 8 个就可以访问到一整个块了,如:提供的块号为 2,通过 2*8 得到第一个这个块的第一个扇区为 16,然后自动向后数 8 个这个就是整个块了

  1. LBA 法(操作系统抽象后):LBA=(C×Hmax+HSmax+(S−1)
  • Hmax:每个柱面的最大磁头数
  • SmaxSmax:每个磁道的最大扇区数
  • 扇区号 S 需减 1(因 LBA 从 0 开始,而 CHS 扇区从 1 开始)

对磁盘的管理就变成了对 LBA 地址的管理,然后通过将硬盘整个硬盘分成很多个分区进行更好的管理

文件系统是系统底层对文件进行管理的

常见文件系统:ext4 exfat fat32

VFS 虚拟文件系统是文件系统的抽象层,隐藏了底层文件系统的实现,用于对外提供接口用于文件管理,在操作系统中通常以一个内核软件层的形式存在,它位于操作系统内核和底层文件系统之间

磁盘文件系统

在硬盘中会存在多个分区,这些分区内部又被分成了多个组,每个分组内部都会有超级块、分区描述符、块位图、inode 表、inode 位图、数据块

在每个分区的内部分组,然后写入文件系统的管理数据的过程叫做格式化

bootblock

磁盘中用于引导操作系统加载和启动最小指令集或代码,同时也可能包含了磁盘分区表和磁盘状态信息

MBR 中通常只有一个 Boot Block 位于整个磁盘的开始部分,而不是每个分区都有,而在 GPT 中每个分区都有类似于 boot block 这样用于引导分区内容的分区引导记录(PBR),但 PBR 和传统的 boot block 有一定区别

超级块

超级块是存储对应整个分区的文件系统相关情况,它包含了文件系统的全局信息,记录的信息主要有:block 和 inode 的总量,未使用的 block 和 inode 的数量,一个 block 和 inode 的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。并不是所有块组都有超级块,由于超级块是全局性的,因此可以不用每个分区都设置超级块,通常为了确保数据的可靠性,会在文件系统的多个位置进行备份。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了,整个分区就挂掉了

数据块

用于存放文件数据,文件的数据被打散分布在磁盘上,类似一个数组,数组里面可以直接存放数据,也可以存放指向下一个数组的指针,用来间接存储文件

GDT 块组描述符

描述的是一整个块组的具体属性,如块组起始位置、大小、包含的块数等,块组描述符还描述了块组内部的布局,包括inode表、数据块和空闲块的分布

块位图

用于记录数据块中哪些被占用,哪些没有

在申请空间时,文件系统先对位图进行检查,若有剩余空间,则将这些空间标记为已分配,一旦位图更新,文件系统将会实际将这些空间分配,最后文件系统把这些文件的头指针返回给请求者

inode 位图

记录 inode 中哪些被占用,哪些没有

分配 inode 位图的过程:

  • 扫描inode位图,查找一个空闲的位(即值为0的位)
  • 将找到的空闲位标记为已使用(即将该位设置为1)
  • 将新文件的元数据信息写入对应的inode中
  • 文件删除时先将元数据和 inode 位图的关联断开,然后将 inode 的相应位置标记为空闲

inode 表

用于存放文件的属性,如所有者,文件大小,修改时间等,inode 中不仅保存着文件的属性,还有一个 datablock 数组,数组中保存着文件占据了哪些块,数据块中也不仅仅只是数据,还有可能是指向实际数据位置的指针,或者指针的指针等,通过建立多级指针来间接映射来管理更大的空间,从而可以建立更大的文件。但是这种方式降低了磁盘的寻址效率

inode 内部并没有文件名,在内核层面,每个文件都有一个 inode number,通过这个来标识文件,可以通过 ls -i 命令来查看文件的 inode 号

inode 编号是以分区为单位的,而不是以分组为单位的,因为 inode 在分区内部不能重复,但是在另一个分区内可能会有与该分区重复的 inode,因此inode 不能跨分区访问

有多少文件就有多少个 inode,通常在 Linux 中 inode 大小为 128 字节或 256 字节

inode 表中有许多 inode 块,一个块大小通常为 4kb,一个块中有 4*1024/128=32 个 inode

查找文件 inode 的过程

当用户或程序请求访问一个文件时,文件系统会首先查找该文件所在的目录

目录本身也是一个文件,它包含了文件名和对应inode编号的映射关系(称为目录项)

文件系统会读取包含目标文件名的目录项,一旦找到与文件名匹配的目录项,文件系统就可以从中提取出inode编号

有了inode编号后,文件系统会使用这个编号和inode表的大小来计算inode在inode表中的位置

因此,当目录的 R 权限被取消后,由于无法读取到目录的文件属性和内容,也就无法获得对应的 inode,因此也就无法进行访问,当目录的 W 权限被取消后,由于无法向目录写入文件名和 inode 的映射关系,也就无法创建文件了

通过 inode 查找文件的过程

每一个分组都会有对应的 inode 范围,查找文件时,首先确定在哪个分区,然后通过 inode 的编号来确定文件是在哪个分组中的,再通过分组内的 inode 表找到具体的 inode,这样就找到了文件

目录

目录也是一个文件,也有自己的文件属性和文件内容,因此也会有 inode,目录的文件内容为文件名和 inode 编号的映射关系,目录本质上是一个存储文件名与文件元数据(如存储位置、大小、权限等)映射关系的数据库,inode 和文件名互为键值,彼此间能够找到对方,如果出现同名文件,就会导致两条相同的键(文件名)对应不同的值(inode 号)

可以通过目录来知道在哪个分区下的原因

当完成分区并且创建好文件系统后,此时由于并没有将其挂载到任何目录,因此操作系统无法访问,所以需要将其挂载到某一个目录中,此时访问该目录也就是在访问该分区了

进程的获得完整的文件路径是通过 CWD 获取的,CWD 存放在 task_struct 中

创建一个新文件的过程

  1. 存储属性
    内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中
  2. 存储数据
    该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据
    复制到300,下一块复制到500,以此类推
  3. 记录分配情况
    文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表
  4. 添加文件名到目录

当通过文件名访问文件时,系统先通过目录找到对应的 inode 号,再通过 inode 读取文件数据,如果存在同名文件,就会出现不确定到达访问哪个文件的 inode 的情况

删除文件的过程

通过文件名找到对应的 inode,然后找到 inode 在 inode bitmap 中的位置,将这个位置标记为空,然后遍历 inode table 中的映射关系,在 块位图中依次标记为空,这样就将一个文件删除了

软、硬链接

软链接

相当于生成一个快捷方式,是一个独立的文件,因为有自己独立的 inode,文件里面包含着目标文件所对应的路径字符串,软链接被删除后不会影响目标文件,但是删除目标文件后软链接就会失效

硬链接

就是一个文件名和 inode 的映射关系,建立硬链接,就是在指定目录下,添加一个新的文件名和 inode number 的映射关系

硬链接没有自己独立的 inode,用的 inode 是目标文件的

硬链接就是两个文件共享同一个数据块,可以认为是同一个文件的不同副本,但这些副本共享同一个空间,只要还存在一个硬链接的文件,文件内容就不会丢失

由于硬链接的两个文件共享一个 inode,因此当修改任意一个文件的权限时,其他文件也会跟着被修改

硬连接数:

有多少文件名字符通过 inode 指向目标文件,硬连接数就是多少

硬链接的作用:
  • 硬链接可以构建 Linux 的相对文件结构,从而能够使用...来进行路径定位
  • 通过硬链接来备份文件

当前目录中即使没有文件,但也会有一个 ... ,其中 . 代表当前目录,使用的 inode 和当前目录相同,因此目录会有两个硬链接数,当在该目录中创建一个新的目录时,新创建的目录中 .. 会指向上一个目录的 inode,因此上一个目录的 inode 还会增加 1,变为 3

任何目录刚新建的时候引用计数一定是 2,因此一个目录内的目录数量引用计数-2

Linux 中不允许给目录建立硬链接,防止形成路径环绕

一般用硬链接来进行文件备份,节省空间

打开的文件和内核、内存有关,没有被打开的文件和硬盘、文件系统有关,当要修改文件时,首先会找到 inode,然后将 inode 和 task_struct 关联起来,然后获取文件的块号,从指定的分区分组中拿到数据块,将其加载到文件的内核缓冲区中,这样通过内核的方式将文件拷贝到用户缓冲区要修改文件时,将写入的数据写入语言的缓冲区,然后通过文件描述符将内容写入文件的内核缓冲区,最终将修改的内容写回 inode,如果内容少了,则释放空间,否则申请空间

文本写入和二进制写入:

  • 文本写入:会把数据转换为文本字符串,并且按照特定的字符编码(像 UTF8、ASCII)来存储,语言通过将输入的数据转换成字符,存放在语言的缓冲区中,最后打印出来
  • 二进制写入:直接存储数据的原始字节,不会进行编码转换

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring AI:Java开发者的AI开发新利器

目录 一、引言 二、Spring AI 是什么 三、核心功能与特性 3.1 统一的 API 抽象 3.2 丰富的模型支持 3.3 低代码集成 3.4 结构化数据输出 3.5 流式数据响应 四、应用场景 4.1 智能客服系统 4.2 图像识别应用 4.3 数据分析与预测 五、快速上手 5.1 环境搭建 5.2 创…

Spring Cloud Sleuth与Zipkin深度整合指南:微服务链路追踪实战

上篇文章简单介绍了SpringCloud系列熔断器:Sentinel的搭建及基本用法,今天继续讲解下SpringCloud的微服务链路追踪:Zipkin的使用!在分享之前继续回顾下本次SpringCloud的专题要讲的内容: 前置知识说明 在开始本教程前…

spring-ai 集成 mcp 之投机取巧

主旨 这篇文章主旨就一点,罗列spring-ai对mcp集成导致出现的一系列问题 分析 由于mcp未问世之前,就早就已经有了工具调用,源码如下: public interface ToolCallback {/*** Definition used by the AI model to determine when a…

大语言模型的完整训练周期从0到1的体系化拆解

以下部分内容参考了AI。 要真正理解大语言模型(LLM)的创生过程,我们需要将其拆解为一个完整的生命周期,每个阶段的关键技术相互关联,共同支撑最终模型的涌现能力。以下是体系化的训练流程框架: 阶段一&am…

历年北京邮电大学保研上机真题

2025北京邮电大学保研上机真题 2024北京邮电大学保研上机真题 2023北京邮电大学保研上机真题 在线测评链接:https://pgcode.cn/problem?classification1 32位二进制串加法 题目描述 输入一个32位的二进制01串,输出这个数1和3后的32位二进制串。 输入…

《仿盒马》app开发技术分享-- 定位获取(端云一体)

开发准备 上一节我们实现了地址管理页面的数据查询和展示,接下来我们要实现的功能是地址添加相关的,我们想实现的功能是地图选点,那么在地图选点之前我们要做的就是先获取用户当前的定位。获取定位后我们拿到经纬度和其他信息,然…

黑马点评--基于Redis实现共享session登录

集群的session共享问题分析 session共享问题:多台Tomcat无法共享session存储空间,当请求切换到不同Tomcat服务时,原来存储在一台Tomcat服务中的数据,在其他Tomcat中是看不到的,这就导致了导致数据丢失的问题。 虽然系…

Mujoco 学习系列(二)基础功能与xml使用

这篇文章是 Mujoco 学习系列第二篇,主要介绍一些基础功能与 xmI 使用,重点在于如何编写与读懂 xml 文件。 运行这篇博客前请先确保正确安装 Mujoco 并通过了基本功能与GUI的验证,即至少完整下面这个博客的 第二章节 内容: Mujoc…

比特授权云外壳加密支持Android 15!

在信息化时代,多数软件供应商需要适配安卓系统,以扩大市场、满足用户需求并提升竞争力。APK作为Android应用的安装包,包含代码、资源、配置文件等运行所需组件,用于在设备端分发和安装应用。企业在分发软件时,需要通过…

uniapp使用sse连接后端,接收后端推过来的消息(app不支持!!)

小白终成大白 文章目录 小白终成大白前言一、什么是SSE呢?和websocket的异同点有什么?相同点不同点 二、直接上实现代码总结 前言 一般的请求就是前端发 后端回复 你一下我一下 如果需要有什么实时性的 后端可以主动告诉前端的技术 我首先会想到 webso…

历年复旦大学保研上机真题

2025复旦大学保研上机真题 2024复旦大学保研上机真题 2023复旦大学保研上机真题 在线测评链接:https://pgcode.cn/problem?classification1 最大公共子串 题目描述 输入 3 个子串,输出这 3 个子串的最大公共子串。 输入格式 输入包含 3 个子串&…

黑马点评-实现安全秒杀优惠券(使并发一人一单,防止并发超卖)

一.实现优惠券秒杀 1.最原始代码&#xff1a; Service public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderService {Resourceprivate ISeckillVoucherService seckillVoucherService;Resourcepriv…

解决论文中字体未嵌入的问题

文章总览&#xff1a;YuanDaiMa2048博客文章总览 解决论文中字体未嵌入的问题 问题描述解决方案&#xff1a;使用 Adobe PDF 打印机嵌入字体&#xff08;WPS版&#xff09;步骤一&#xff1a;打开 PDF 文件步骤二&#xff1a;选择打印到 Adobe PDF步骤三&#xff1a;修改 Adobe…

leetcode 131. Palindrome Partitioning

目录 一、题目描述 二、方法1、回溯法每次暴力判断回文子串 三、方法2、动态规划回溯法 一、题目描述 分割回文子串 131. Palindrome Partitioning 二、方法1、回溯法每次暴力判断回文子串 class Solution {vector<vector<string>> res;vector<string>…

审计报告附注救星!实现Word表格纵向求和+横向计算及其对应的智能校验

在审计工作中&#xff0c;Word附注通常包含很多表格。为了确保附注数字的准确性&#xff0c;我们需要对这些表格进行数字逻辑校验&#xff0c;主要包含两个维度&#xff1a;在纵向上验证合计项金额是否正确&#xff1b;在横向上检查“年末金额年初金额本期增加-本期减少”的勾稽…

人工智能数学基础实验(四):最大似然估计的-AI 模型训练与参数优化

一、实验目的 理解最大似然估计&#xff08;MLE&#xff09;原理&#xff1a;掌握通过最大化数据出现概率估计模型参数的核心思想。实现 MLE 与 AI 模型结合&#xff1a;使用 MLE 手动估计朴素贝叶斯模型参数&#xff0c;并与 Scikit-learn 内置模型对比&#xff0c;深入理解参…

告别延迟!Ethernetip转modbustcp网关在熔炼车间监控的极速时代

熔炼车间热火朝天&#xff0c;巨大的热风炉发出隆隆的轰鸣声&#xff0c;我作为一名技术操控工&#xff0c;正密切关注着监控系统上跳动的各项参数。这套基于EtherNET/ip的监控系统&#xff0c;是我们车间数字化改造的核心&#xff0c;它将原本分散的控制单元整合在一起&#x…

Visual Studio Code插件离线安装指南:从市场获取并手动部署

Visual Studio Code插件离线安装指南&#xff1a;从市场获取并手动部署 一、场景背景二、操作步骤详解步骤1&#xff1a;访问官方插件市场步骤2&#xff1a;定位目标版本步骤3&#xff1a;提取关键参数步骤4&#xff1a;构造下载链接步骤5&#xff1a;下载与安装 三、注意事项 …

计算机视觉---YOLOv1

YOLOv1深度解析&#xff1a;单阶段目标检测的开山之作 一、YOLOv1概述 提出背景&#xff1a; 2016年由Joseph Redmon等人提出&#xff0c;全称"You Only Look Once"&#xff0c;首次将目标检测视为回归问题&#xff0c;开创单阶段&#xff08;One-Stage&#xff09…

爬虫核心概念与工作原理详解

爬虫核心概念与工作原理详解 1. 什么是网络爬虫&#xff1f; 网络爬虫&#xff08;Web Crawler&#xff09;是一种按照特定规则自动抓取互联网信息的程序或脚本&#xff0c;本质是模拟人类浏览器行为&#xff0c;通过HTTP请求获取网页数据并解析处理。 形象比喻&#xff1a;如…