百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Linux内核源码分析之文件系统(linux操作系统文件系统)

ahcoder 2025-04-05 16:24 9 浏览

最近开始研究Linux文件系统,希望通过阅读源码,了解文件系统的设计要素、控制逻辑,最终自己能够实现出一个简易的文件系统。

经历过内核源码阅读的小伙伴,相信你在最初面对如此庞大的内核源码时,一定会有种“面对茫茫大海,无从下手”的感觉,即便幸运的找到了逻辑入口,却在繁琐的函数跳转中晕头转向,无法把握住整个控制路径上的重难点。代码阅读之后,无法上升到整体设计,提炼出实现者的出发点,对代码逻辑,常常感觉迷惑,无法洞悉代码背后的原理。

鉴于此,在研究该部分代码前,我从实现的角度出发,根据文件系统的功能往下进行推敲,提炼出文件系统的重难点,有方向性地阅读代码、印证想法、解决疑问。

挖掘出技术难点,带着问题有方向性的阅读代码,这样能够做到事半功倍,同时对整体结构的理解,更加透彻

1. 文件系统是什么

首先,我们先来考虑下“文件系统是什么?”,在早期操作系统还未出现文件系统这个概念的时候,如果程序需要存储数据,那么它必须自己实现文件存储、文件管理的代码,程序本身需要与硬盘驱动器打交道。最令人头痛的是,你存储文件的地方可能被其他程序覆盖,导致数据的丢失。

为了解决这个“各自为营,重复创造”的现象,大家提出采用统一的中间层,管理应用程序与硬盘之间的文件交互。这样做的好处就是:

  • 应用程序不再关注文件的存储与管理,能够专注于自身的应用逻辑控制

  • 统一的中间层知道所有文件存储的信息,能够避免文件覆盖现象的出现,进行更有效的数据管理

总结来说:

文件系统是应用程序与块设备(磁盘等)之间的桥梁,是对文件进行统一管理的中间层。

对上: 向上层用户提供读写文件的操作接口

对下: 将文件在磁盘上进行存储及有效的管理

2. 文件系统涉及什么

2.1 文件系统挂载

在Linux环境下,磁盘作为一种特殊的文件(Linux系统中一切皆文件),允许用户进行读写操作,但是如果我们想要正常使用,在其上创建文件夹,文件等,则必须经过以下几道工序:

  • 采用某种文件系统格式化磁盘

mkfs -t ext3 /dev/sdb

  • 为磁盘创建挂载点

mkdir /sdb_dir

  • 挂载磁盘到指定目录下

mount /dev/sdb /sdb_dir

  • 修改/ext/fstab配置文件,设置开机自启

/dev/sdb /sdb_dir ext3 defaults 0 0

我们可以将上面的步骤大体分为两步:

(1)磁盘格式化 : 写入超块信息,按照特有的数据布局,对磁盘进行格式化

(2)文件目录入口: 在整个系统文件目录上,为其寻一入口,以后由此进入

2.2 技术点初总结

从上面的步骤中,我们可以发现磁盘无法直接使用,首先需要经过某种文件系统的格式化,而这个格式化过程,包括注册超块信息,将磁盘划分成数据块进行管理,也就是说:文件是由多个数据块联接在一起进行表示。从这里出发,我们来思考一下,文件系统可能涉及哪些技术点:

1. 文件存储方式

  • 应用程序直接打交道的是文件,文件是采用何种方式持久化在磁盘上呢?

  • 如果采用数据分块的方式,数据块如何有效组织在一起,表示成一个文件?

2. 读、写、定位的实现

  • 如何快速定位文件中一个数据块的位置?比如要查看文件某个位置的数据。

3. 元数据的管理

  • 元数据有哪些?目录树,空闲块的维护?

4. 数据一致性保证

  • 内存的数据与硬盘上的数据如何来往? 何时将内存中的数据固化到磁盘,以防断电等造成的数据丢失。

上面我是想到啥,说到啥,整体感觉,有些凌乱,可能会遗漏某些技术点。接下来,从文件系统的基本功能“读写文件”出发,我们来尝试挖掘出一些有用的技术点。

2.3 读写流程分析

在这里,我们尝试分析下读写逻辑,整理其控制路径,当然这里只是一个粗糙的版本,毕竟此时我们还未读代码,只是猜想其过程,同时暂且不讨论Page Cache,均采用Direct IO的方式:

(1)根据文件路径,查找目录树,获得当前文件目录项

(2)通过文件目录项,可以获得该文件起始块,文件大小,权限等信息

(3)通过文件起始块,文件偏移,以某种方式,得到目标数据块位置 (这里需要研读下如何快速定位某数据块)

(4)读整个目标数据块,数据缓存于内存当中 (是否将整个目标数据块读出来,这里不确定,有待源码印证)

(5)拷贝数据到读请求的buffer当中

(1)根据文件路径,查找目录树,获得当前文件目录项

(2)通过文件目录项,可以获得该文件起始块,文件大小,权限等信息

(3)通过文件大小,如果发现文件偏移超过文件大小,则通过“空闲块管理”获取新的数据块位置。否则,通过文件起始块,文件偏移,以某种方式,得到目标数据块位置;

(4)将数据buffer中的数据写入对应磁盘位置(这里可能使用写buffer,不知如何实现的)

2.3 技术点总结

通过上面的控制逻辑推敲,我们对文件系统想必有更加清晰的认识了,这次,我们再来总结总结,可能涉及的知识点:

正常读写流程

应用读写请求(文件描述符,位置,长度,数据buffer)

读:文件系统如何填充到buffer当中,在内核态到用户态buffer,是否会有一次拷贝

写:将buffer当中的数据以IO的方式,发送到下层

目标:

1. 读写经过的路径:系统调用 --> 文件系统 --> 下层调用接口

2. 元数据之间的交互:目录树,空闲块的使用

3. buffer中数据的来龙去脉,能观察到经过了多少次拷贝

磁盘数据固化

  • 数据分布:超级块?目录树?空闲块?数据块? 这些如何记录在案

  • 数据固化:数据一致性保证,目录树这些在内存中的元数据,何时固化到磁盘上?采用什么方式,保证数据在突然断电的情况下,不会丢失

目录树

查找文件的入口地址,希望维护快,查找快

  • 数据结构:目录树采用何种数据结构进行维护:BTree?红黑树?

  • 磁盘固化:关机之后, 如何在硬盘上进行存储?

  • 加载方式:运行时,是将所有的目录信息均加载到内存当中,还是按需加载,缓存频繁的目录数据块?

空闲块表

记录哪些数据块还未被使用

  • 数据结构:采用何种数据结构进行维护:Bitmap?BTree?红黑树?

猜测:构造排序二叉树(红黑树啥的),维护关键字<空闲长度,位置>,这样就能快速找到满足长度的一段联系空闲块??

  • 磁盘固化:关机之后, 如何在硬盘上进行存储?

通过上面这些,让我们清楚认识哪些问题需要去注意,能够有方向性的去阅读代码。小伙伴们,让我们带着这些问题,去探索,阅读代码吧!!

当然每个人的关注点可能不一样,在此分享自己源码阅读的方式,希望抛砖引玉,大家相互交流。

如果你在工作学习中存在什么技术难题,请关注大数据架构师公众号:xinsz08,我们会努力帮你解答,每天1篇必读运维大牛亲笔绝密干货贴,1000万IT人的干货资源库。

相关推荐

KaOS 2025.05版本发布:全面拥抱Qt6,彻底告别Qt5

KaOSLinux2025.05版本重磅发布:全面拥抱Qt6,开启KDE生态新篇章继2025.03版本发布两个月后,专注于KDE桌面环境、采用XFS文件系统的滚动发行版Li...

基于FIMC接口的CMOS摄像头驱动分析与设计

摘要:目前的嵌入式系统中,USB摄像头使用比较普遍,但其应用会受到传输速度的限制。本文采用一款高速CMOS摄像头,其驱动利用S3C6410内置的FIMC接口技术,采用DMA和ping-pong缓冲...

没错是微软 推出基于Linux的交换机系统

2015-09-2205:59:59作者:郑伟你没看错,为了提升自身Azure云数据中心内网络设备的兼容性及开放性,微软也开始推出基于Linux的网络交换机系统了。这个被称为AzureCloud...

Linus Torvalds 宣布首个 Linux 内核 6.16 候选版本

Linux内核负责人兼创始人LinusTorvalds宣布关闭合并窗口,该窗口用于将主要新功能添加到内核中,并开始发布Linux6.16候选版本,从候选版本1(Linux6.16-r...

Linux内核漏洞将影响Haswell架构服务器

在infoq网站上,GilTene最近报告一个十分重要,但并不为人知Linux内核补丁,特别对采用Haswell架构的Linux系统用户和管理员应该特别关注。报告提醒RedHat发行版的用户(包括...

关于Linux性能调优中网络I/O的一些笔记

写在前面和小伙伴分享一些Linux网络优化的笔记,内容很浅,可以用作入门博文内容结合《Linux性能优化》读书笔记整理涉及内容包括常用的优化工具(mii-tool,ethtool,ifconfig,i...

国产操作系统- Veket Linux(国产操作系统之光银河麒麟阅读理解)

VeketLinux是一个随身的可装在U盘的Linux操作系统。主要面向桌面用户。它的设计重点是提供简单易用且稳定的操作系统,同时保持更新和开发。它具有强大的功能集和广泛的用户基础,可满足...

AlmaLinux 9.6发布:升级工具、初步支持IBM Power虚拟化技术

IT之家5月21日消息,科技媒体linuxiac昨日(5月20日)发布博文,报道称代号为SageMargay的AlmaLinux9.6发行版已上线,距上一版本9.5发...

跟老韩学Linux运维架构师系列,vim与view的基本使用

下面是vim和view的10个实例:用vim打开一个新文件:vimnewfile.txt这个命令将会在vim编辑器中打开一个新文件。在vim中移动光标:使用方向键或h、j、k、l键来移动光标。在v...

malloc底层原理剖析——ptmalloc内存池

malloc底层为什么是内存池malloc大家都用过,其是库函数。我们都知道库函数在不同的操作系统中其实执行的是系统调用,那么malloc在Linux上执行的是哪个系统调用呢?brk()和mmap()...

Zen 6架构首秀Linux,AMD加速下一代处理器布局

IT之家5月15日消息,科技媒体Phoronix昨日(5月14日)发布博文,报道称AMD已经开始为下一代“Zen6”处理器做准备,已为该构架向Linux内核提交了首个补丁,...

为何越来越多企业转向安卓/Linux工业平板电脑?答案在这里

在工业领域,设备的稳定性至关重要,尤其是工业平板电脑,常年运行在高温、粉尘、潮湿等复杂环境下,一旦系统崩溃或者卡顿,可能会影响整个生产流程。那么,为什么越来越多的企业选择安卓/Linux工业平板电脑,...

从3ms到0.8ms:ARM+Linux如何重塑工业控制实时性标杆

在智能制造领域,产线控制系统对实时性的要求越来越高。根据行业调研数据,超过65%的工业现场出现过因系统响应延迟导致的故障停机,平均每次停机造成的直接损失高达2-8万元。传统x86架构搭配Windows...

看Linux如何&quot;挖坑种树&quot;

写在前面,有人看我的Linux文章说技术难度不深,笔者不是不想写深,笔者是觉得Linux难就难在入门,入门之后你就知道如何上网查询你所要要解决的Linux需求。如果你已入门,此文已对你无用,请略过此...

AlmaLinux 9.6 发布,新增功能亮点纷呈!

距离上一版本AlmaLinux9.5发布六个月后,基于5.14内核的AlmaLinux正式宣布其企业级Linux发行版的9.x系列第六个更新——AlmaLinux9.6(Sag...