自制文件系统

前不久,林同学分享了 Unix/Linux 下操作文件和目录的接口,还顺便介绍一些磁盘、文件系统基础知识。我发现他们对文件系统其实没什么概念,对硬链接和软链接也只是知其然而不知其所以然。

讨论硬链和软链的区别,他们能说出目标文件删除,硬链还能访问而软链不行这种现象。但你一问为什么,他们就一脸懵逼了。这种靠机械记忆的知识并不牢靠,而且心智负担也重。

如果对文件系统原理比较了解,那很多系统行为便了然于胸,完全不需要机械记忆。但我问了一下,他们似乎对文件系统知之甚少,有些甚至连操作系统课都没有学过。

像操作系统文件系统这种基础知识,你说重要吧,其实平时做项目几乎完全用不上;你说不重要吧,数据库调优、系统 IO 优化等场景又多有涉及;可能取决于想不想进一步提升自己的技术视野吧。

如果想要了解文件系统工作原理,又该如何入手呢?

很多人可能会直接搜一些博客来看,或者看操作系统教材中的理论介绍,但我觉得最好的学习方式是自己撸个文件系统来玩一玩!这也是自制玩具系列的一贯宗旨,在模仿中学习。

小菜科班出身,大三学过操作系统课,大作业就是实现一个文件系统,因而对文件系统基本原理驾轻就熟。毕业后,凭借这点小经验,参与了公司误删数据的恢复工作,跟着老板从 ZFS 中抢救出被误删的 100T 数据。

鉴于自己的成功经验,我非常认可 造玩具,学理论 的实践思路,感觉可以带着新人撸一把。那么,自造文件系统又需要具备哪些知识呢?

  • 磁盘知识 ,文件系统通常保存在磁盘上,有必要了解磁盘是如何存储数据的;
  • 文件系统结构 ,磁盘由存储扇区构成,如何在其上实现文件以及目录树是重点;

这些基础知识我会陆续整理进来,大家可按需查阅。

由于 Linux 是主流的服务器系统,因此我们选它作为制作平台。在 Linux 系统上实现文件系统,主要有两个思路:

  • 编写 内核模块 ,内核模块实现我们的文件系统,然后加载到内核;
  • 通过 FUSE用户态文件系统 ,在一个进程中实现文件系统,然后挂载到内核;

其中,用户态文件系统更方便开发调试,因此我们可以先试试这种方法。

小菜自制文件系统】系列文章首发于公众号【小菜学编程】,敬请关注:

【自制文件系统】系列文章首发于公众号【小菜学编程】,敬请关注: