展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 软件教程 > 图解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 文件系统的设计对理解其他不同的文件系统有非常大的帮助。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    软件教程
    相关文章 更多
    精品专题 更多
    装机必备

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

    Windows

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

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

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

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。