【Linux】EXT2文件系统 | 磁盘分区块组 | inode

news2024/11/27 17:47:09

文章目录

  • 一、前言
  • 二、EXT2文件系统 - 逻辑存储结构
    • 💾分区(Partition)
        • 分区的概念
        • 每个分区的内容
        • Linux下查询磁盘分区
    • 💾块组(Block Group)
        • 磁盘格式化
        • 每个块组的内容
          • 1. Superblock(超级块)
          • 2. Group Descriptor Table(组描述符表)
          • 3. Block Bitmap(块位图)
          • 4. inode Bitmap(inode位图)
          • 5. inode Table(inode表)
          • 6. Data Blocks(数据块)
  • 三、操作磁盘文件的过程
    • ✨创建文件
    • ✨找到文件
    • ✨删除文件
    • ✨恢复文件

一、前言

在上篇 文件IO 文件系统调用 文件fd 重定向 文章中,我们已经学习了在内存中被打开(被加载)的文件,还有一部分是磁盘中未被打开的文件。这篇我们来谈磁盘文件。

Linux对文件的管理工作:

  1. 管理被打开的文件
  2. 管理磁盘中没有被打开的文件

以上两点构成了Linux的文件系统,文件系统这个名词狭义上指的是磁盘文件系统,例如Linux下的ext2文件系统。




二、EXT2文件系统 - 逻辑存储结构

💾分区(Partition)

分区的概念
  • 定义: 将硬盘划分为逻辑上独立的单元。

  • 作用: 实现文件系统的组织和管理,提供隔离的存储空间,体现了分治的思想。

    请添加图片描述

每个分区的内容
  • 对于每一个分区:
    请添加图片描述

Boot Block(引导块):

  • 定义: Boot block是文件系统中的第一个块,通常包含引导加载程序和文件系统的元数据,用于引导操作系统。
  • 作用: 存储引导加载程序,提供文件系统的起始点,引导操作系统的启动。

Linux下查询磁盘分区

可以通过以下命令查看当前Linux系统的分区:

  1. 使用 lsblk 命令:
lsblk /dev/vda

请添加图片描述

上述命令会列出 /dev/vda 设备的分区信息,包括每个分区的大小、挂载点等。


  1. 使用 fdisk 命令:
sudo fdisk -l /dev/vda

请添加图片描述

上述命令会显示 /dev/vda 设备的分区表信息,包括每个分区的起始扇区、大小等。可能要使用sudo提权。


  1. 使用 df -h
df -h

请添加图片描述

相当于Windows的 “此电脑”,df -h 提供了一个快速的方式来查看系统上各个文件系统的存储使用情况,以便及时了解磁盘空间的分布和使用率。




💾块组(Block Group)

ext2文件系统会根据分区的大小划分为数个块组(Block Group)。而每个块组都有着相同的结构组成。块组也被称为分组块组是由分区细分出的产物。

磁盘格式化
  1. 当磁盘完成分区后,我们还需要对磁盘进行格式化
  2. 磁盘格式化就是对磁盘中的分区进行初始化的一种操作,这种操作通常会导致现有的磁盘或分区中所有的文件被清除。
  3. 磁盘格式化就是对分区后的各个区域写入对应的管理信息

其中,写入的管理信息是什么是由文件系统决定的,不同的文件系统格式化时写入的管理信息是不同的,常见的文件系统有EXT2、EXT3、XFS、NTFS等。

每个块组的内容

块组与分区的关系如图所示:
请添加图片描述

当我们考虑一个块组中的内容时,以下是一个块组中包含的内容:

1. Superblock(超级块)
  • 定义: 超级块是文件系统中一个关键的元数据块,包含有关整个文件系统的信息
  • 作用: 提供整个块组的整体信息。存放文件系统本身的结构信息。
  • 记录的信息主要有:
    • block和 inode的总量
    • 未使用的block和inode的数量
    • 一个block和inode的大小
    • 最近一次挂载的时间
    • 最近一次写入数据的时间
    • 最近一次检验磁盘的时间等其他文件系统的相关信息。
      Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
2. Group Descriptor Table(组描述符表)
  • 定义: 组描述符表存储了关于每个块组的元信息,包括块组中的inode和数据块的位置,以及空闲块和inode的数量等信息。

  • 作用: 提供了有关块组的重要信息,帮助文件系统在块组级别进行管理和分配。

  • 组描述符表中的主要信息包括:
    1. 块组的起始块号: 记录块组的起始块号,用于定位块组在整个文件系统中的位置。
    2. 块位图的起始块号: 记录块组中块位图的起始块号,用于定位块组中块的分配情况。
    3. Inode位图的起始块号: 记录块组中Inode位图的起始块号,用于定位块组中Inode的分配情况。
    4. Inode表的起始块号: 记录块组中Inode表的起始块号,用于定位块组中Inode的存储位置。
    5. 空闲块的数量: 统计块组中未分配的空闲块数量。
    6. 空闲Inode的数量: 统计块组中未分配的空闲Inode数量。

3. Block Bitmap(块位图)
  • 定义: 块位图是一个位图,记录块组中每个块的使用情况,标记哪些块已被分配,哪些是空闲的
  • 作用: 帮助文件系统管理块的分配和释放,维护块的空闲状态。
4. inode Bitmap(inode位图)
  • 定义: Inode位图是一个位图,记录块组中每个inode的使用情况,标记已分配和空闲的inode
  • 作用: 帮助文件系统管理inode的分配和释放,维护inode的空闲状态。
5. inode Table(inode表)
  • 定义: Inode表存储了块组中所有文件和目录的元数据,每个文件和目录都关联到一个唯一的inode。
  • 作用: 记录文件的属性信息,如文件大小、权限、属主等。

一个典型的inode结构包含以下信息:

  1. 文件类型(File Type): 表示Inode关联的文件类型,如普通文件、目录、符号链接等。

  2. 权限和所有者信息:

    • 文件所有者(User ID)
    • 文件所属组(Group ID)
    • 文件权限(Read、Write、Execute)
  3. 时间戳:

    • 文件的最后访问时间(atime)
    • 文件的最后修改时间(mtime)
    • Inode的最后修改时间(ctime)
  4. 文件大小: 记录文件的大小(以字节为单位)。

  5. 链接数: 记录连接到该Inode的硬链接数量。当链接数为0时,表示文件不再被引用,可以被删除。

  6. 数据块指针:

    • 直接块指针(Direct Block Pointers):用于存储文件的前一定量数据块。
    • 单间接块指针(Single Indirect Block Pointer):指向一个块,该块包含更多数据块的指针。
    • 双间接块指针(Double Indirect Block Pointer):指向一个块,该块包含单间接块的指针。
  7. 文件系统标志: 记录Inode所属的文件系统的特定标志。

6. Data Blocks(数据块)
  • 定义: 数据块是用于存储文件实际数据的块,也包括目录中文件名和对应inode的映射。
  • 作用: 存储文件和目录的实际内容,包括文件数据和目录项。



三、操作磁盘文件的过程

✨创建文件

请添加图片描述

  1. 存储属性
    内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。
  2. 存储数据
    该文件需要存储在三个数据块,内核通过块位图找到了三个空闲数据块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。
  3. 记录分配情况
    文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
  4. 添加文件名到目录
    假如新的文件名是“abc”。linux如何在当前的目录中记录这个文件?内核将映射关系(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

✨找到文件

在Linux操作系统的ext2文件系统中,通过一个文件的inode找到该文件的过程涉及到文件目录、内核缓冲区等关键概念。以下是找文件的步骤:

  1. 文件目录(Directory):

    • 文件目录是一个特殊的文件,用于存储文件名与其对应的inode号之间的映射关系。每个目录项都包含文件名和对应文件的inode号。
  2. 查找文件的inode:

    • 当用户提供一个文件名时,内核首先会查找文件所在的目录,即打开包含文件名的目录文件。这可以通过系统调用如 opendirreaddir 来实现。
  3. 读取目录文件:

    • 文件目录是一个包含目录项的文件。通过系统调用 readdir 等,内核将目录文件的内容读入内核缓冲区。
  4. 在内核缓冲区中查找目录项:

    • 内核缓冲区中存储了目录文件的内容,包括文件名和对应的inode号。内核根据用户提供的文件名在内核缓冲区中查找相应的目录项。

目录项

目录项是文件系统中的一个记录单元,用于将文件名与其对应的inode号关联起来。每个目录项包含一个文件或目录的名称以及与之相关联的唯一标识符(inode号),该标识符用于定位并访问文件或目录的详细元数据。目录项是构建目录结构的基本组成部分,使得文件系统能够有效地组织和检索文件。

  1. 获取文件的inode号:

    • 一旦找到了目录项,就可以从中获取文件对应的inode号。
  2. 访问文件的inode:

    • 使用文件的inode号,内核再次进行系统调用(例如 stat)来获取文件的详细元数据。这涉及到文件系统的访问操作,文件系统会将对应inode的信息读取到内核缓冲区中。
  3. 获取文件的数据块:

    • 通过读取inode中的数据块指针,内核可以找到文件的实际数据块。
  4. 读取文件内容:

    • 最终,内核可以通过读取文件的数据块来获取文件的实际内容。

总体而言,文件系统通过在文件目录中查找文件名与inode号的映射关系,然后通过inode号来获取文件的详细信息,最终访问文件的实际数据块,实现了从用户提供的文件名到文件内容的映射过程。这一系列操作都依赖于内核缓冲区。


✨删除文件

  1. 将该文件对应的inode在inode位图当中置为无效(比特位设置为0)。
  2. 将该文件申请过的数据块在块位图当中置为无效(比特位设置为0)。

✨恢复文件

因为删除操作并不会真正将文件对应的信息删除,而只是将其inode号和数据块号置为了无效,所以当我们删除文件后短时间内是可以恢复的,在删除后,有些操作系统会记录日志,日志中会保存被删的inode编号!
为什么说是短时间内可恢复呢?因为该文件对应的inode号和数据块号已经被置为了无效,因此后续创建其他文件或是对其他文件进行写入操作申请inode号和数据块号时,可能会将该置为无效了的inode号和数据块号分配出去,此时删除文件的数据就会被覆盖,也就无法恢复文件了。

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

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

相关文章

5.0 HDFS 集群服务建立教程

HDFS 集群是建立在 Hadoop 集群之上的,由于 HDFS 是 Hadoop 最主要的守护进程,所以 HDFS 集群的配置过程是 Hadoop 集群配置过程的代表。 使用 Docker 可以更加方便地、高效地构建出一个集群环境。 每台计算机中的配置 Hadoop 如何配置集群、不同的计…

vue2 el-table新增行内删除行内(两种写法)里面第一个是树组件,第二个是数字组件,第一个数组件只能勾选最后一个节点

第一种 <template><div class"time_table"><div style"margin-bottom: 10px"><el-button click"addRowFn">新增</el-button></div><el-form ref"costForm" :model"formData">&l…

云原生数据库 GaiaDB 的核心技术演进和解析

导读 在越来越强调云原生的环境下&#xff0c;存算分离作为一种新的架构理念&#xff0c;已经是大势所趋。新的技术架构带来新的问题和挑战&#xff0c;百度智能云的云原生数据库 GaiaDB 采用 Quorum 分布式协议、高性能网络、高可靠分布式存储引擎等技术实现更高的性能和可用性…

[开源]GPT Boss – 用图形化的方式部署您的私人GPT镜像网站

在这个以数据和智能为核心的时代&#xff0c;掌握最新的技术趋势是每个企业和个人都需要做到的。这就是GPT Boss存在的意义&#xff1a;一个基于OpenAI技术的一站式GPT应用解决方案。 自2022年起&#xff0c;GPT Boss团队便投身于人工智能领域&#xff0c;将OpenAI的GPT模型带给…

Bard 最新更新:全球开放访问Gemini Pro并生成图片

深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领域的领跑者。点击订阅&#xff0c;与未来同行&#xff01; 订阅&#xff1a;https://rengongzhineng.io/ 。 今…

2024/2/4学习记录

微信小程序 网络数据请求 出于安全性方面的考虑&#xff0c;小程序官方对数据接口得请求做出了俩个限制 只能对 https 类型的接口必须将接口的域名添加到信任列表中 需要去这里设置 域名只支持 https 协议域名不能使用 ip 地址 或者localhost域名必须经过 ICP 备案 服务器域…

在 iOS 上安装自定企业级应用

了解如何安装您的组织创建的自定应用并为其建立信任。 本文适用于学校、企业或其他组织的系统管理员。 您的组织可以使用 Apple Developer Enterprise Program 创建和分发企业专用的 iOS 应用&#xff0c;以供内部使用。您必须先针对这些应用建立信任后&#xff0c;才能将其打…

Excel没有内置统计字数功能,但可以用一些变通的方法

是否需要计算Excel工作簿中某个单元格或单元格范围内的单词数? 出于多种原因,你可能需要计算文本数据中的字数。也许你有逗号分隔的列表,需要计算每个列表中的项目数。 不幸的是,Excel没有内置的单词计数方法。但是有一些聪明的方法可以得到你需要的结果。 这篇文章将向…

【开源】基于JAVA+Vue+SpringBoot的软件学院思政案例库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理员2.2 普通教师 三、系统展示四、核心代码4.1 查询思政案例4.2 审核思政案例4.3 查询思政课程4.4 思政案例点赞4.5 新增思政案例评语 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的软件学…

文心一言 VS 讯飞星火 VS chatgpt (194)-- 算法导论14.3 2题

二、用go语言&#xff0c;改写 INTERVAL-SEARCH 的代码&#xff0c;使得当所有区间都是开区间时&#xff0c;它也能正确地工作。 文心一言&#xff0c;代码正常运行&#xff1a; 在Go语言中&#xff0c;处理开区间&#xff08;open intervals&#xff09;时&#xff0c;我们需…

Linux的库文件

概述&#xff1a; 库文件一般就是编译好的二进制文件&#xff0c;用于在链接阶段同目标代码一块生成可执行文件&#xff0c;或者运行可执行文件的时候被加载&#xff0c;以遍调用库文件中的某段代码。 动态链接都是索引的.so文件&#xff0c;静态链接都是压缩打包的.a文件。 …

配置visualsvn提交后自动邮件通知

参考&#xff1a; https://blog.csdn.net/wiker_yong/article/details/10334967 # -*- coding: utf-8 -*- import sys import os import smtplib from email.mime.text import MIMEText from email.header import Headermail_host smtp.163.com #发送邮件的smtp地址 mail_us…

【RPA】什么是RPA

一、什么是RPA? RPA&#xff0c;全称机器人流程自动化&#xff0c;是一种利用机器人技术实现工作信息与业务交互自动化的过程。它能够按照预先设计的流程&#xff0c;高效地处理大量的工作信息与业务交互&#xff0c;极大地节约了人工成本。如今&#xff0c;RPA已成为智能化软…

26.云原生ArgoCD高级之ApplicationSet

云原生专栏大纲 文章目录 ApplicationSet介绍ApplicationSet 特性ApplicationSet 安装ApplicationSet 工作原理ApplicationSet 生成器列表类型生成器集群生成器基础使用方法Label Selector 指定集群Values 字段传递额外的参数 git生成器git目录生成参数排除目录git文件生成器矩…

zabbix server/agent源码编译成rpm包(通用版-小白教程)

前言 工作环境需要用到很多信创的操作系统&#xff0c;zabbix agent2的官方没有现成的包可用&#xff0c;网上巴拉了一下找到zabbix agent2通用版编译成rpm包的方法 思路&#xff1a;假如当你有一批ky10_x86的机器需要配套的zabbix agent的rpm包&#xff0c;那就找一台ky10_x…

6个国内可用的chat大模型

文心一言 - 一款适合中国人使用的AI智能助理&#xff0c;能够帮助用户进行对话、生成内容等工作&#xff0c;提高工作效率和创作水平 文心一言 文心一言 App 是一款适合中国人的 AI 智能助理&#xff0c;它的功能点主要包括&#xff1a; 工作生活助理&#xff1a;该应用通过简…

鉴权失败原因

在技术领域&#xff0c;鉴权失败是指一个系统或应用程序中的身份验证或权限验证过程失败。当用户试图访问受限资源或执行受限操作时&#xff0c;系统会进行鉴权过程来确认用户是否具有足够的权限。如果鉴权过程失败&#xff0c;则表示用户无法获得所需的访问权限。 鉴权失败可…

Java代码实现基数排序算法(附带源码)

基数排序是一种非比较型整数排序算法&#xff0c;其原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。由于整数也可以表达字符串&#xff08;比如名字或日期&#xff09;和特定格式的浮点数&#xff0c;所以基数排序也不是只能使用于整数。 1. 基数排序…

基于Springboot的兼职网(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的兼职网&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0…

ubuntu离线安装k8s

目录 一、前期准备 二、安装前配置 三、安装docker 四、安装cri-dockerd 五、部署k8s master节点 六、整合kubectl与cri-dockerd 七、网络等插件安装 八、常见问题及解决方法 一、前期准备 ①ubuntu系统 本地已安装ubuntu系统&#xff0c;lsb_release -a命令查看版本信…