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

文章目录

  • 一、前言
  • 二、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.rhkb.cn/news/251762.html

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

相关文章

Log360,引入全新安全与风险管理功能,助力企业积极抵御网络威胁

ManageEngine在其SIEM解决方案中推出了安全与风险管理新功能,企业现在能够更主动地减轻内部攻击和防范入侵。 SIEM 这项新功能为Log360引入了安全与风险管理仪表板,Log360是ManageEngine的统一安全信息与事件管理(SIEM)解决方案…

算法学习——华为机考题库2(HJ11 - HJ20)

算法学习——华为机考题库2(HJ11 - HJ20) HJ11 数字颠倒 描述 输入一个整数,将这个整数以字符串的形式逆序输出 程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为0…

如何在 Microsoft Azure 上部署和管理 Elastic Stack

作者:来自 Elastic Osman Ishaq Elastic 用户可以从 Azure 门户中查找、部署和管理 Elasticsearch。 此集成提供了简化的入门体验,所有这些都使用你已知的 Azure 门户和工具,因此你可以轻松部署 Elastic,而无需注册外部服务或配置…

JSR303参数校验-SpringMVC

文章目录 JSR303技术标准简介JSR303标准几个具体实现框架validation-apijakarta.validation-apihibernate-validatorspring-boot-starter-validation Spring Validationjavax.validation.constraints包下提供的注解org.hibernate.validator.constraints包扩展的注解校验注解默认…

《QDebug 2024年1月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.Repeator 的 delegate 在 remove 移除时的注意事项 Qt Bug Tracker:https://bugreports.qt.io/browse/QTBUG-47500 Repeator 在调用 remove 函数之后,对应的 Item 会立即释放,后续就…

Apache Doris 整合 FLINK CDC + Iceberg 构建实时湖仓一体的联邦查询

1概况 本文展示如何使用 Flink CDC Iceberg Doris 构建实时湖仓一体的联邦查询分析,Doris 1.1版本提供了Iceberg的支持,本文主要展示Doris和Iceberg怎么使用,大家按照步骤可以一步步完成。完整体验整个搭建操作的过程。 2系统架构 我们整…

Linux校准时间 Centos

Linux校准时间 Centos 首先,确保系统中已经安装了tzdata包。如果没有安装,可以使用以下命令安装: sudo yum install tzdata设置系统时区为上海: sudo timedatectl set-timezone Asia/Shanghai验证时区设置是否生效:…

安装配置Oracle 11g 、PLSQL及使用Navicat远程连接Oracle

目录 一、下载 二、安装 1.执行安装程序 2.配置安全更新 3.安装选项 4.系统类 5.网络安装选项 6.选择安装类型 7.选择产品语言 8.选择数据库版本 9.指定安装位置 10.选择配置类型 ​编辑11.指定数据库标识符 12.指定配置选项 13.电子邮箱 14.指定数据库存储…

Nucleosome, Recombinant Human, H2BK120ub1 dNuc, Biotinylated

EpiCypher(国内授权代理商欣博盛生物)是一家为表观遗传学和染色质生物学研究提供高质量试剂和工具的专业制造商。EpiCypher生产的在E. coli中表达的重组人单核小体(组蛋白H2A、H2B、H3和H4各2个;accession numbers:H2A-P04908;H2B-O60814;H3.1-P68431;H4…

重写Sylar基于协程的服务器(3、协程模块的设计)

重写Sylar基于协程的服务器(3、协程模块的设计) 重写Sylar基于协程的服务器系列: 重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar) 重写Sylar基于协程的服务器(1、日志模…

IP风险画像在企业网络安全中应用

随着企业数字化的不断深入,网络安全问题日益突显。IP风险画像作为一种综合性的网络安全工具,为企业提供了更全面的风险评估和防范手段。本文将结合一个实际案例,深入探讨IP风险画像在企业网络安全中的成功应用。 案例背景 一家大型金融机构…

苹果电脑录制视频在哪里?教你快速找到它!

录制电脑屏幕已成为了许多用户日常所需的操作,无论是录制在线课程、游戏过程,还是网络会议,一款好的录屏软件能帮助用户高效、便捷地完成任务。苹果电脑是当今主流的计算机设备之一,可是很多用户不知道苹果电脑录制视频在哪里。在…

LeetCode:283. 移动零

283. 移动零 1)题目2)代码方法一:两层for循环方法二:使用双指针 3)结果方法一结果方法二结果 1)题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的…

用GOGS搭建GIT服务器

GOGS官网 Gogs: A painless self-hosted Git service 进入文件所在目录 cd /usr/local/develop 解压文件 tar -xvf gogs_0.13.0_linux_amd64.tar.gz 解压之后 进入gogs 目录 cd gogs 创建几个目录 userdata 存放用户数据 log文件存放进程日志 repositories 仓库根目…

C语言函数递归详解

递归是什么&#xff1f; 递归&#xff0c;顾名思义&#xff0c;就是递推和回归。 递归是一种解决问题的方法&#xff0c;在C语言中&#xff0c;递归就是函数自己调用自己。 #include <stdio.h> int main() {printf("hehe\n");main();//main函数中⼜调⽤了main…

【python】OpenCV—Tracking(10.1)

学习来自《Learning OpenCV 3 Computer Vision with Python》Second Edition by Joe Minichino and Joseph Howse 文章目录 检测移动的目标涉及到的 opencv 库cv2.GaussianBlurcv2.absdiffcv2.thresholdcv2.dilatecv2.getStructuringElementcv2.findContourscv2.contourAreacv2…

React16源码: React中处理hydrate的核心流程源码实现

hydrate 1 &#xff09;概述 hydrate 在react当中不算特别重要, 但是很多时候会用到的一个API这个 API 它主要作用就是在进入第一次渲染的时候&#xff0c;如果本身 dom 树上面已经有一个dom结构存在是否可以去利用这一部分已经存在的dom&#xff0c;然后去避免掉在第一次渲染…

小华和小为的聚餐地点 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 小华和小为是很要好的朋友,他们约定周末一起吃饭。 通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达)。 求小华和小为都能到达的聚餐地点有多少个? 输入描述…

在本地运行大型语言模型 (LLM) 的六种方法(2024 年 1 月)

一、说明 &#xff08;开放&#xff09;本地大型语言模型&#xff08;LLM&#xff09;&#xff0c;特别是在 Meta 发布LLaMA和后Llama 2&#xff0c;变得越来越好&#xff0c;并且被越来越广泛地采用。 在本文中&#xff0c;我想演示在本地&#xff08;即在您的计算机上&#x…

最值得推荐收藏的 7 款 Android 系统修复软件,快速的修复手机异常

在当今世界&#xff0c;移动设备是我们生活的重要组成部分。我们将它们用于沟通、工作、娱乐和许多其他目的。然而&#xff0c;随着不断的使用&#xff0c;它们通常会面临速度慢、崩溃等问题。这可能会让人烦恼和沮丧。但是&#xff0c;值得庆幸的是&#xff0c;您可以在 Andro…