前不久,林同学分享了 Unix/Linux 下操作文件和目录的接口,还顺便介绍一些磁盘、文件系统基础知识。我发现他们对文件系统其实没什么概念,对硬链接和软链接也只是知其然而不知其所以然。
讨论硬链和软链的区别,他们能说出目标文件删除,硬链还能访问而软链不行这种现象。但你一问为什么,他们就一脸懵逼了。这种靠机械记忆的知识并不牢靠,而且心智负担也重。
如果对文件系统原理比较了解,那很多系统行为便了然于胸,完全不需要机械记忆。但我问了一下,他们似乎对文件系统知之甚少,有些甚至连操作系统课都没有学过。
像操作系统文件系统这种基础知识,你说重要吧,其实平时做项目几乎完全用不上;你说不重要吧,数据库调优、系统 IO 优化等场景又多有涉及;可能取决于想不想进一步提升自己的技术视野吧。
如果想要了解文件系统工作原理,又该如何入手呢?
很多人可能会直接搜一些博客来看,或者看操作系统教材中的理论介绍,但我觉得最好的学习方式是自己撸个文件系统来玩一玩!这也是自制玩具系列的一贯宗旨,在模仿中学习。
小菜科班出身,大三学过操作系统课,大作业就是实现一个文件系统,因而对文件系统基本原理驾轻就熟。毕业后,凭借这点小经验,参与了公司误删数据的恢复工作,跟着老板从 ZFS 中抢救出被误删的 100T 数据。
鉴于自己的成功经验,我非常认可 造玩具,学理论 的实践思路,感觉可以带着新人撸一把。那么,自造文件系统又需要具备哪些知识呢?
- 磁盘知识 ,文件系统通常保存在磁盘上,有必要了解磁盘是如何存储数据的;
- 文件系统结构 ,磁盘由存储扇区构成,如何在其上实现文件以及目录树是重点;
这些基础知识我会陆续整理进来,大家可按需查阅。
由于 Linux 是主流的服务器系统,因此我们选它作为制作平台。在 Linux 系统上实现文件系统,主要有两个思路:
- 编写 内核模块 ,内核模块实现我们的文件系统,然后加载到内核;
- 通过 FUSE用户态文件系统 ,在一个进程中实现文件系统,然后挂载到内核;
其中,用户态文件系统更方便开发调试,因此我们可以先试试这种方法。
【小菜自制文件系统】系列文章首发于公众号【小菜学编程】,敬请关注: