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

磁盘的访问方式

  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.pswp.cn/web/81231.shtml

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

相关文章

whisper相关的开源项目 (asr)

基于 Whisper(OpenAI 的开源语音识别模型)的开源项目有很多,涵盖了不同应用场景和优化方向。以下是一些值得关注的项目: 1. 核心工具 & 增强版 Whisper OpenAI Whisper 由 OpenAI 开源的通用语音识别模型,支持多语…

深入解析Spring Boot与JUnit 5集成测试的最佳实践

深入解析Spring Boot与JUnit 5集成测试的最佳实践 引言 在现代软件开发中,单元测试和集成测试是确保代码质量的重要手段。Spring Boot作为当前最流行的Java Web框架之一,提供了丰富的测试支持。而JUnit 5作为最新的JUnit版本,引入了许多新特…

gitlab占用内存 优化

优化 GitLab 配置 GitLab 的配置文件可以对内存使用进行优化。 以下是一些优化配置的方法: 1.1 调整 Unicorn(或 Puma)配置 GitLab 使用 Unicorn(旧版)或 Puma(新版本)作为其 Web 服务器。可以…

视觉语言模型(Vision-Language Model, VLM)的简单介绍

目录 1. 起源与历史 2. 核心技术与原理 3. 优势 4. 应用领域 5. 技术难点与挑战 6. 学习方法与路径 7. 未来发展方向 8. 总结 1. 起源与历史 起源: 视觉语言模型(VLM)的起源可以追溯到多模态机器学习的研究。早期的计算机视觉&#…

关于PHP的详细介绍,结合其核心特点、应用场景及2025年的技术发展趋势,以清晰的结构呈现:

一、PHP的核心特点 动态脚本语言 语法灵活:支持过程式与面向对象编程,类似C/Java的语法结构,但动态类型特性更接近Python。即时编译:PHP 8.x的JIT(Just-In-Time)编译器显著提升性能,尤其在数学…

MCP、MCPHub、A2A、AG-UI概述

MCP Model Context Protocol,模型上下文协议,Anthropic于2024年开源的标准协议,旨在统一AI模型与数据源的交互方式,提升数据访问的便捷性和可靠性,提供标准化的工具调用、资源管理和提示词功能。 MCP的基本定义&…

[学习]浅谈C++异常处理(代码示例)

浅谈C异常处理 文章目录 浅谈C异常处理一、异常处理基础1.异常的概念与作用2.C异常处理机制(try、catch、throw)3.基本语法示例 二、标准异常类1.常见标准异常类:2.自定义异常类的实现 三、异常安全与最佳实践1. RAII(资源获取即初…

PHP学习笔记(十)

extends 一个类可以在声明中用extends关键字继承另一个类的方法和属性。PHP不支持多重继承,一个类只能继承一个基类。 被继承的方法和属性可以通过同样的名字重新声明被覆盖,但是如果父类定义或者常量时是使用类final,则不可被覆盖&#xff…

rt-linux里的泛rtmutex锁的调用链整体分析

一、背景 linux系统里有非常多的锁种类,除了spinlock,mutex,rwlock,rwsem,还有rcu及顺序锁,这里面还有不少锁变种,比如spinlock的带bh或者irq字样的lock/unlock,还有nmi里可以用的顺…

LLM多平台统一调用系统-LiteLLM概述

概述 在当今快速发展的AI领域,大语言模型(LLM)已成为技术创新的核心驱动力。然而,随着市场上涌现出越来越多的LLM提供商(如OpenAI、Anthropic、Google Gemini、AWS Bedrock等),开发者面临着一个日益复杂的问题&#x…

C#实现MCP Client 与 LLM 连接,抓取网页内容功能!

该专栏优先在飞书发布,欢迎收藏关注! https://www.feishu.cn/community/article?id7507084665509904403 前面的课程,我们已经用C#实现了,自己的MCP Client。 下面我们一起来实现,MCP Client与LLM 对接。 一、添加依…

并发编程(6)

指令重排序 指令重排序是指在程序执行过程中,为了提高性能,编译器或处理器会对指令的执行顺序进行重新排列。 指令重排序导致可见性消失 在多线程环境下,每个线程都有自己的工作内存,线程对变量的操作是在工作内存中进行的&…

鸿蒙仓颉开发语言实战教程:页面跳转和传参

前两天分别实现了商城应用的首页和商品详情页面,今天要分享新的内容,就是这两个页面之间的相互跳转和传递参数。 首先我们需要两个页面。如果你的项目中还没有第二个页面,可以右键cangjie文件夹新建仓颉文件: 新建的文件里面没什…

Java 学习笔记:注解、泛型与 IO 流

目录 课程目标 Java 注解(Annotation) 1. 概念与作用 2. 自定义注解示例 3. JDK 内置注解 4.注释 Java 泛型(Generics) 1. 基本语法 2. 通配符与上下限 3. 常见应用场景 Java IO 流 1. 流的分类1.File文件类 2. 字节流与字符流 3. 经典示例:文件拷贝 总结与…

git仓库代码操作

1、从gitee下载代码提交到本地github仓库,保留提交记录 # 查看当前分支 git branch# 查看当前远程仓库 git remote -v# 确保所有更改已提交 git add . git commit -m "准备提交到GitLab"# 添加GitLab远程仓库 git remote add gitlab https://gitlab.com/…

Thinkphp6使用token+Validate验证防止表单重复提交

htm页面加 <input type"hidden" name"__token__" value"{:token()}" /> Validate 官方文档 ThinkPHP官方手册

Mcu_Bsdiff_Upgrade

系统架构 概述 MCU BSDiff 升级系统通过使用二进制差分技术&#xff0c;提供了一种在资源受限的微控制器上进行高效固件更新的机制。系统不传输和存储完整的固件映像&#xff0c;而是只处理固件版本之间的差异&#xff0c;从而显著缩小更新包并降低带宽要求。 该架构遵循一个…

Spring Boot微服务架构(四):微服务的划分原则

微服务划分原则&#xff08;CRM系统案例说明&#xff09; 一、微服务划分的核心原则 单一职责原则&#xff08;SRP&#xff09; 每个微服务只负责一个明确的业务功能服务边界清晰&#xff0c;避免功能混杂便于独立开发、测试和部署 业务领域驱动设计&#xff08;DDD&#xff0…

基于CNN卷积神经网络的带频偏QPSK调制信号检测识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

从机械应答到深度交互,移远通信如何让机器人“灵魂觉醒”?

你是否还在因机器人的“答非所问”而无奈&#xff0c;为它们的“反应慢半拍”而抓狂&#xff1f;别慌&#xff01;一场引领机器人实现“灵魂觉醒”的技术革命&#xff0c;正如同暗夜中悄然绽放的繁星&#xff0c;彻底颠覆人们对机器人的传统认知。 5月20日&#xff0c;移远通信…