当前位置:

首页 > 图解Linux文件系统结构与原理

图解Linux文件系统结构与原理

在之前的文章中,我曾从源码角度分析过Linux文件系统,但这种方式对于新手来说可能略显枯燥。所以,这次我将通过图文结合的方式,详细讲解Linux文件系统的原理,而不会深入到源代码的细节。一、硬盘简介在介绍文件系统之前,我们先来了解一下硬盘。众所周知,内存中的数据会在断电后丢失,因此现代计算机使用硬盘来存储数据。硬盘中的数据在断电后依然能够保存。目前,常见的硬盘类型包括机械硬盘(HDD)和固态硬盘(SSD)。由于本文的重点是文件系统,所以不会详细介绍硬盘的原理。以下是机械硬盘和固态硬盘的对比图:我们

在之前的文章中,我曾从源码角度分析过 Linux 文件系统,但这种方式对于新手来说可能略显枯燥。所以,这次我将通过图文结合的方式,详细讲解 Linux 文件系统的原理,而不会深入到源代码的细节。

一、硬盘简介

在介绍文件系统之前,我们先来了解一下硬盘。

众所周知,内存中的数据会在断电后丢失,因此现代计算机使用硬盘来存储数据。硬盘中的数据在断电后依然能够保存。

目前,常见的硬盘类型包括机械硬盘(HDD)和固态硬盘(SSD)。由于本文的重点是文件系统,所以不会详细介绍硬盘的原理。以下是机械硬盘和固态硬盘的对比图:

图解 Linux 文件系统

我们可以将硬盘想象成一个巨大的数组,每个元素代表一个数据块,如下图所示:

图解 Linux 文件系统

在 Linux 内核中,每个数据块的大小定义为 4KB。因此,一个 128GB 的硬盘可以被划分为 33554432 个数据块,内核通过数据块的编号来进行读写操作。

二、什么是文件系统

前面提到,内核通过数据块来读写硬盘,但这种方式对人类来说并不直观,因为我们无法记住每个数据块存储的内容。

为了让用户使用起来更方便和直观,Linux 内核抽象出两个概念来管理硬盘中的数据:文件(File)和目录(Directory)。

文件用于存储数据,目录用于存储文件列表,当然,目录也可以包含其他目录。由于数据存储在硬盘的数据块中,文件只需要记录哪些数据块属于它即可。如下图所示:

图解 Linux 文件系统

从图中可以看出,目录可以包含文件和子目录,而文件则记录了属于它的数据块编号。因此,读取或写入文件时,只需找到对应的文件数据块即可。

三、MINIX 文件系统实现

现在,我们以 MINIX 文件系统为例,详细介绍文件系统的设计原理。由于 MINIX 文件系统结构简单,非常适合用于教学。

  1. MINIX 文件与目录

在 MINIX 文件系统中,一个文件由 minix2_inode 对象描述。我们来看一下 minix2_inode 的定义:

struct minix2_inode {
    __u16 i_mode;     // 模式
    __u16 i_nlinks;   // 链接数
    __u16 i_uid;      // 所属用户UID
    __u16 i_gid;      // 所属组ID
    __u32 i_size;     // 文件大小
    __u32 i_atime;    // 访问时间
    __u32 i_mtime;    // 修改时间
    __u32 i_ctime;    // 创建时间
    __u32 i_zone[10]; // 文件对应的数据块编号
};

我们需要特别关注 minix2_inode 对象中的 i_zone 字段,它记录了属于当前文件的数据块编号。从定义来看,i_zone 是一个包含 10 个元素的整数数组。那么,是否意味着 MINIX 文件只能存储 40 KB 的数据呢?

答案是否定的。MINIX 文件系统将 i_zone 数组分为四个部分:前 7 个元素直接指向存储数据的数据块编号,第 8 个元素是一级间接指向,第 9 个元素是二级间接指向,第 10 个元素是三级间接指向。我们通过下图来解释这种关系:

图解 Linux 文件系统

通过这种多级指向的方式,一个 MINIX 文件可以存储超过 40KB 的数据。

既然有描述文件的对象,那么也应该有描述目录的对象。在 MINIX 文件系统中,目录也使用 minix2_inode 对象来描述。那么,如何区分文件和目录呢?

minix2_inode 对象中,有一个名为 i_mode 的字段,它保存了 minix2_inode 对应的类型。普通文件使用 S_IFREG 标志表示,而目录使用 S_IFDIR 标志表示。因此,从本质上来说,目录也是一种特殊的文件。

普通文件的数据块存储的是文件的数据,那么目录的数据块存储的是什么呢?答案是文件列表,每个表项使用 minix_dir_entry 对象表示,定义如下:

struct minix_dir_entry {
    __u16 inode;     // 当前文件对应的 minix2_inode 对象在 inode 数组中的索引
    char name[0];    // 用于记录当前文件的文件名,由于文件名长度不固定,这里使用柔性数组表示
};

我们通过下图来展示文件与目录在数据内容上的区别:

图解 Linux 文件系统

上图展示了文件与目录的两个明显区别:

  • 文件的 i_mode 字段设置为 S_IFREG,而目录的 i_mode 字段设置为 S_IFDIR
  • 文件的 i_zone 字段指向的数据块存储的是文件的数据,而目录的 i_zone 字段指向的数据块存储的是文件列表。
  1. MINIX 文件系统格式化

现在,我们基本了解了 MINIX 文件系统对文件与目录的存储方式,接下来介绍 MINIX 文件系统如何管理硬盘中的文件和目录,也就是我们常说的格式化。

我们可以将硬盘视为一个由数据块组成的巨大数组,MINIX 文件系统将硬盘划分为以下几个部分,如下图所示:

图解 Linux 文件系统

下面我们对这几个部分进行解释:

  • 引导块:占用一个数据块,用于操作系统启动时使用,我们可以忽略。
  • 超级块:占用一个数据块,用于保存文件系统的信息,MINIX 文件系统使用 minix_super_block 对象来保存文件系统的信息,如 inode位图 占用几个数据块、数据块位图 占用几个数据块等。
  • inode位图:占用若干个数据块,用于描述 inode表 中哪些成员已经被使用,每个位表示一个 inode 的使用情况。
  • 数据块位图:占用若干个数据块,用于描述 数据块列表 中哪些成员已经被使用,每个位表示一个数据块的使用情况。
  • inode表:占用若干个数据块,由多个 minix2_inode 对象组成,每个 minix2_inode 对象表示一个文件或目录。
  • 数据块列表:占用若干个数据块,用于保存文件的数据。

上图展示了 MINIX 文件系统在硬盘中的格式化结构。我们先来看一下 超级块 记录的信息有哪些,超级块由 minix_super_block 对象表示,其定义如下:

struct minix_super_block {
    __u16 s_ninodes;       // inode表的元素个数
    __u16 s_nzones;        // 数据块列表的元素个数(v1版本)
    __u16 s_imap_blocks;   // inode位图占用的数据块数量
    __u16 s_zmap_blocks;   // 数据块位图占用的数据块数量
    __u16 s_firstdatazone; // 第一个数据块起始号
    __u16 s_log_zone_size;
    __u32 s_max_size;      // 文件最大尺寸
    __u16 s_magic;         // 魔数(用于识别MINIX文件系统)
    __u16 s_state;         // 文件系统状态
    __u32 s_zones;         // 数据块列表的元素个数(v2版本)
};

minix_super_block 每个字段的作用都在注释中进行了说明,通过 minix_super_block 对象我们可以了解到 MINIX 文件系统的信息。

  1. 读取文件过程

了解了 MINIX 文件系统的结构组织,现在我们介绍一下 MINIX 文件系统读取文件的过程。

例如,我们要读取 /home/file.txt 文件的内容,MINIX 文件系统是如何准确地找到文件并读取其中的内容呢?下面我们分步描述这个过程。

第一步:读取根目录

要读取 /home/file.txt 文件,首先要从根目录 / 开始。MINIX 文件系统约定根目录使用 inode表 的第一个元素进行存储。如下图:

图解 Linux 文件系统

如上图所示,根目录使用 inode表 的第一个元素进行存储,然后从根目录的文件列表中查找目录 home。从图中可以看出,home 目录的 inode索引 为 5,表示 home 目录存储在 inode表 的第 5 个元素中。

第二步:读取 home 目录

知道 home 目录的 inode索引 为 5 后,再读取 inode表 的第 5 个元素,然后从 home 目录的文件列表中查找文件 file.txt,过程如下图:

图解 Linux 文件系统

如上图所示,从 home 目录的文件列表中找到 file.txt 文件的 inode索引 为 9,所以现在可以通过读取 inode表 的第 9 个元素来获得 file.txt 文件对应的 inode 节点。

第三步:读取 file.txt 文件的内容

现在我们已经知道了 file.txt 文件对应的 inode索引,所以从 inode表 中读取第 9 个元素即可获得 file.txt 文件的 inode节点,然后就可以通过 inode节点i_zone 字段所指向的数据块来读取文件的内容,如下图所示:

图解 Linux 文件系统

如上图所示,通过读取 inode表 的第 9 个元素获得 file.txt 文件的 inode节点 后,可以通过 inode节点i_zone 字段所指向的数据块读取文件的内容。

四、总结

本文通过 MINIX 这种简单的文件系统来介绍如何设计一个文件系统。虽然 Linux 系统有多种文件系统,但其基本思想都是如何有效地管理硬盘的数据。因此,掌握 MINIX 文件系统的设计对理解其他不同的文件系统有非常大的帮助。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
相关文章 更多
AE基础教程:如何创建合成并制作关键帧动画
AE基础教程:如何创建合成并制作关键帧动画

本文指导After Effects新手完成从打开软件到制作简单动画的完整流程。内容涵盖新建合成、导入素材、添加关键帧及预览验证,适用于AE基础学习。读者可依据步骤快速完成首个可播放的动效项目。

电影剪辑实战:镜头组织、节奏控制与声音衔接技巧
电影剪辑实战:镜头组织、节奏控制与声音衔接技巧

本文详解电影剪辑核心流程,从素材整理、镜头空间组织到叙事节奏压缩,再到J-cut/L-cut声音衔接技巧。通过粗剪保逻辑、精剪压停顿、反应镜头缓冲及电平统一检查,帮助创作者打造空间清晰、情绪连贯且听感自然的成片。

转场剪辑实战指南:硬切、遮挡与运镜的精准选择与操作技巧
转场剪辑实战指南:硬切、遮挡与运镜的精准选择与操作技巧

本文详解硬切、遮挡转场和运镜转场的适用场景与操作逻辑。通过对比三种转场的核心区别,提供基于素材条件和叙事目的的判断标准,帮助剪辑师避免滥用特效,掌握自然衔接画面的实战技巧。

GitLab新手创建项目并推送第一次提交的操作指南
GitLab新手创建项目并推送第一次提交的操作指南

本文指导GitLab新手完成创建项目并推送第一次提交的最小闭环。涵盖远程项目创建、本地仓库初始化、添加远程地址及执行git push。重点说明HTTPS与SSH认证差异、分支名(master/main)核对及提交验证标准,确保远程仓库真正建立。

抖音拍摄剪辑教程:从竖屏运镜到卡点成片
抖音拍摄剪辑教程:从竖屏运镜到卡点成片

本教程针对抖音竖屏视频制作,涵盖拍摄前构思、稳定运镜、粗剪筛选、音乐卡点及导出检查全流程。重点在于拍摄时预留字幕空间、利用动作节点辅助剪辑,以及通过鼓点对齐画面。适用于新手快速完成第一条完整成片,强调素材质量与节奏自然,避免过度特效与版权风险。

饭圈舞台照修图:降噪、调色与人物突出技巧
饭圈舞台照修图:降噪、调色与人物突出技巧

针对饭圈舞台照光线乱、噪点多、背景抢眼的痛点,本文提供“保脸、控光、突出主体”的修图方案。核心步骤包括:利用Lightroom降噪面板处理高ISO颗粒,控制曝光避免高光死白或脸部死黑;通过压低背景色彩、提升人物亮度与对比度来修正舞台灯光导致的肤色偏差;最后通过裁剪去除杂乱元素,确保人物主体清晰且肤色自然。

Photoshop安装失败或启动异常:系统要求、安装流程与故障排查指南
Photoshop安装失败或启动异常:系统要求、安装流程与故障排查指南

本文提供Photoshop完整安装指南,涵盖Windows/macOS系统要求、Creative Cloud客户端部署及常见启动故障排查。通过安装前磁盘与账号检查、安装中网络监控、安装后功能测试三步法,解决安装中断、登录失败及启动卡顿问题,确保软件稳定可用。

创维电视通过U盘安装第三方软件完整教程:权限设置与故障排查
创维电视通过U盘安装第三方软件完整教程:权限设置与故障排查

本文提供创维电视通过U盘安装第三方APK的完整操作指南。核心步骤包括:准备格式化的U盘与正规APK文件,在酷开系统“应用管理”中找到安装入口,临时开启“允许安装未知来源应用”权限,以及安装后的功能测试与权限关闭。适用于解决电视无法识别U盘、提示解析失败或权限受限等问题,确保安装安全且不影响系统稳定。

Excel筛选大于指定数值:操作步骤与结果验证
Excel筛选大于指定数值:操作步骤与结果验证

本教程演示如何在Excel中筛选大于指定数值的数据。核心步骤包括:确保数据连续、选中表头、通过“开始→排序和筛选”开启筛选,并在“数字筛选”中选择“大于”输入阈值。筛选仅隐藏不符合条件的行,不删除数据。完成后需逐行验证可见数据是否均大于阈值,并可通过取消筛选恢复全部数据。

Creo零基础入门:新建零件与第一次拉伸建模完整指南
Creo零基础入门:新建零件与第一次拉伸建模完整指南

本教程指导Creo初学者完成首个拉伸实体建模。通过新建零件、选择mmns_part_solid模板、定义草绘平面及绘制封闭轮廓,生成三维实体。内容涵盖操作路径、参数设置及常见错误排查,帮助新手建立正确的建模逻辑与单位概念。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。