300来行代码带你实现一个能跑的最小Linux文件系统

300来行代码带你实现一个能跑的最小Linux文件系统,第1张

Linux作为一个类UNIX系统,其文件系统保留了原始UNIX文件系统的表象形式,它看起来是这个样子:

它其实是一棵目录树(没有画全):

然而,虽然所有的UNIX系统以及类UNIX系统的文件系统看起来一样,但是它们的实现却是不尽相同。

作为普通用户,了解文件系统的基本 *** 作就够了;作为应用开发人员,了解文件系统的POSIX接口足矣,但是作为一个对 *** 作系统有着浓厚兴趣的爱好者而言,自己可能就是一个新的文件系统的潜在实现者,所以必须一窥究竟,看看如此外观的文件系统到底是如何实现的。

网上已经有了很多关于UNIX/Linux文件系统实现的资源,但是无一例外,都太复杂了,除了整体的源码分析外,几乎就是针对某个特定文件系统的详解了,如此复杂的这些对于初涉该领域的满腔热情者无疑是一盆冷水,很多人因此望而却步。

几乎所有的关于Linux文件系统实现的资源都在用不同的语言解释上面的这些问题,这很容易陷入细节的泥潭。

本文以Linux内核为例,用一种稍微不同的方式去描述文件系统的实现。嗯,我会分3个部分来介绍Linux内核的文件系统:

本文中,我会通过一个实实在在的文件系统实现的例子,试图阐述 实现一个文件系统,哪些是必须的,哪些不是必须的。 这是一个任务驱动的过程,从简单的例子开始。

读过本文之后,相信会对Linux文件系统的实现有一个总体上的宏观把握,然后再去反复推敲上述的细节问题,重读网上的那些经典资源,相信会事半功倍。

当然,在给出最简单的tinyfs实现之前,还是会有一个总体的介绍。

如果我们把本文最初描述的那个在几乎所有UNIX/类UNIX系统中长的一模一样的文件系统表面刨开,在Linux内核中,文初的那棵树其实它长下面的样子(其实在大多数类UNIX系统中,它们长得都差不多):

【这张图基于我一张手绘图修改而成】

我们看到,Linux系统的文件目录树就是靠上图中的这一系列的链表穿针引线给串在一起的,就像缝制一件衣服一样,最终的成衣就是我们看到的Linux系统目录树,而缝制这件成衣的线以及指导走线的规则便是VFS本身了。

现在只要记住两个重要链表:

然后读完本文之后再去结合代码深入分析它们是如何串起整个文件系统的。

VFS之所有可以将机制大相径庭的完全不同的文件系统对外统一成一个样子,完全就是依靠了它的统一的对POSIX文件调用的接口,该接口的结构看上去是下面的样子:

注意上图最下面的那个椭圆,如果要实现一个文件系统,这个椭圆里的东西是关键,它完成了穿针引线的大部分工作。

现在让我们纵向地看一下一个完整的文件系统实现都包括什么,我指的是从POSIX系统调用开始,一直到数据落盘。Linux内核关于文件系统IO,完整的视图如下所示:

注意VFS提供的三类接口:

一个文件系统如果能实现上面三类接口,那它就是个完整的文件系统了。

我们恰好可以从设计并实现一个最基本的这样的文件系统开始。一个基本的文件系统,其着重点在于上图中红色的部分,而其它部分则不是必不可少的,但是却是让该文件系统变得优秀(而不仅仅是可用)所必须的。

为什么要实现这么一个文件系统,难道没人已经做了这个工作吗?做这个工作的意义何在?

原因如下:

然而确实,我没有找到简单的 最小文件系统 实现,也许你会说Linux内核自带的ramfs难道不就是一个现成的吗?的确算一个,但它有两个问题导致你无法领略实现一个文件系统的全过程,注意,我说的可是全过程:

为了 追求完整, 如果你把如何组织一块内核作为ramfs的底层介质这部分代码全部看完,如果你把libfs.c里的库实现全部看完,我想ramfs也就不算一个 足够简单 的文件系统实例了。

看到了么?要想代码简单,你就不得不使用libfs.c里的现成的例程,这将损失你实现一个文件系统的完整性体验,反之,要想完整实现一个文件系统,你可能不得不自己写大量的代码,这却并不简单。

如何既完备,又足够简单呢?

对于我这种编程水平渣渣的内核爱好者而言,如何在堵车的一个多小时内完成一个可以编译通过的文件系统(我承认完全能跑是我回到家后又调试了一个多小时才完成的...),这对于我而言,是一个挑战,但我要试一试,没想到就成功了。所以才有了今天的分享。

我从最底层的介质结构的设计开始。

我并没有真实的硬件介质,也并不打算编写专门的 格式化程序 去格式化一块内存区域,所以我直接用大数组定义一块内存,它便是我的模拟介质了,我的tinyfs的文件格式如下:

这个文件系统的格式非常的Low:

之所以这么Low是因为它只是一个开始, 当这个文件系统实现并且能跑之后,你会发现它因为Low而带来的不足和一些代价,而弥补这些不足正好是优化的动机,带着你逐步实现一个更加不Low的文件系统,在实现的过程中,你会窥见并掌握Linux内核文件系统的全貌和细节。 完美的学习过程,OK!

下面是代码:

review代码后,你可能已经发现了几个问题:

嗯,其实这些问题目前而言还都不是问题,它们并不阻碍这个文件系统的真实性,它用起来是那么的真实。

没有任何规范规定一个文件系统存储格式必须有什么或者必须没有什么,文件系统格式只是一个 看上去还可以的信息持久化记录格式 ,只要下次能根据某些信息将文件读取出来,任何格式都是OK的。

之所以很多人会认为一个文件系统的格式必须要符合某种规范,完全是因为人们看的最多的那些文件系统ext3,ext4,ntfs等恰好是那样做的罢了。不过事实证明,那样做确实是很好的。在可用的玩具完成之后,就要考虑 性能,健壮性,可扩展性 等这些工程因素了。而ext3/4,ntfs,xfs则充分考虑了这些。

逐渐的,权威变成了规范,至少成了一种范式或者模式,这是计算机领域常有的事,见怪不怪。

我们来使用下这个文件系统:

OK,挂载成功。

这里又有疑问了,为什么是none挂载,而不是一个块设备,比如/dev/sda1之类的。

这是因为我根本没有将介质(其实是一块连续的内存)抽象成块设备,如果引入块设备抽象,势必要导出device层 *** 作接口,这样做并不困难,但却太麻烦,且块设备抽象和文件系统的实现核心无关。本文不是讲块设备的,加之班车上的堵车时间有限,故不做抽象。

好了,现在让我们来折腾下/mnt目录,该目录就是我的tinyfs的挂载目录了,在其下读写文件,就是在tinyfs的内存介质上读写文件:

除了最后一个删除目录的 *** 作,其它的都OK,这也是预期之中,毕竟删除目录是TODO嘛。

一共300来行的代码(省去了很多异常判断和处理,真实情况下,这些要占据80%的代码量),非常容易读懂,你会发现这个文件系统实现是如此之low,然而却能看起来像真的一样。

这意味着完成和完美真的是两回事!

很多最终看起来很大型的东西,都是都这种刚刚完成可以用开始的。

很明显,这个代码没有使用块层来和底层介质通信,而是直接 *** 作了底层介质,也就是那块连续的内存。因为我用内存模拟介质,尚且OK,如果底层真的有一个类似磁盘那样的慢速介质,每次 *** 作直接读写block将是不可接受的。但如果你想获得性能上的提升,就必须使用块层的缓存机制,以及pagecache机制。

所以,方向很明确,我们有了一个todolist:

这些todo完成,意味着对Linux内核文件系统实现原理的彻底掌握,从一个简单的刚刚可用的tinyfs开始(这花不了多少时间),到整理出一份todolist,到完成这些todo,这便是一个任务驱动的学习过程。

回过头来看Linux文件系统IO的纵向视图:

这次注意蓝色部分,我们的TODO就是要补充这部分的实现。

好了,换一个视角看VFS。

我们把Linux内核内存中的VFS看作是磁盘等慢速介质中特定文件系统的缓存,这是一个典型的 分级存储结构, 就好像CPU cache和内存的关系一样。

在这个视角下,如何完成上图蓝色框框中的部分,可参考的现成范式就太多了。但无论如何都要解决的是:

Linux内核已经给了我们一个现成的答案:

当然,如果你觉得这些不够好,你也可以设计你自己的。总之,这是一块非常独立的工作,正如我图中所示,这部分工作的目标是,在文件系统刚好可以工作后, 让事情变得更加完美有趣!

挺多的,比较有名的是北京麟卓,他们开发的卓懿应用商城不少人在用,卓懿的技术比较先进,不是用的虚拟机而是非虚拟技术,具体的技术就不太清楚了,感觉软件兼容性很好,这个商城里的安卓应用跑在Linux系统上都很流畅,算是安卓应用迁移这块做的比较好的厂商了。百度回答望采纳

Windows系统和苹果的Mac系统玩厌了怎么办?Linux *** 作系统有很多个发行版可以给大家继续折腾电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍 ,本文介绍Linux *** 作系统的其中一个发行版CentOS 7的安装步骤,想要玩CentOS 7的朋友请收藏备用。Linux是开源的系统,很多Linux *** 作系统的发行版是免费的,而Win11系统要1千多元电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

经验介绍:华擎主板(i7-4790K)这个年代(2015年左右)的华擎主板,在安装Linux *** 作系统时,经常出现下图的错误提示,也就是出现 AHCI controller unavailable! 这个错误提示(见下图),出现下面的报错提示的解决方法就是光驱或者硬盘换另一个Sata接口,一个sata接口不行就接着换另一个,全部接口都换一遍直到成功为止。u盘安装如果出现下图的报错提示,就换usb接口,换不同的usb接口直到不报错为止。

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

第一步、去CentOS官网下载iso系统安装文件

必应搜索CentOS,进入CentOS官网(见下图):

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

之后点击官网上方的“Download”按钮,进入下图的下载页面:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

在上图的界面点击“X86_64”那个粉色的文字,进入下图的镜像链接界面:

为什么要点击“X86_64”呢?因为包括Intel或者AMD的CPU的电脑都是X86架构的(64代表64位的处理器)。我们自己有“龙芯架构”了,我们也有基于龙芯开发的 *** 作系统。各位同胞加油,早日将中国架构发扬光大,把X86打下去吧。

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

点击上图的镜像链接,这么多镜像链接怎么选?选一个你下载速度比较快的镜像链接,将CentOS-7-x86_64-DVD-2009.iso这个镜像文件下载到电脑里。

例如,你可以选择下面的镜像链接进行下载:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

下载的镜像文件的名称看下图:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

第二步、用下载好的iso文件制作U盘启动盘

将CentOS-7-x86_64-DVD-2009.iso这个镜像文件下载到电脑之后,就可以用这个iso文件来制作u盘启动盘了。

制作u盘启动盘用balenaEtcher这个免费的软件(balenaEtcher软件可以去其官网免费下载),balenaEtcher软件的使用非常简单,第一步点击软件左边的“+”号(见下图),选择你下载到电脑的CentOS-7-x86_64-DVD-2009.iso这个镜像文件;第二部点击软件中间的“Select target”按钮(见下图),选择你的U盘;第三步点击“Flash”按钮,开始将iso文件写入u盘。

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

第三步、用制作好的u盘启动盘来启动电脑,安装CentOS系统

将第二步制作好的启动u盘插入电脑,如果你的电脑没有从u盘启动,需要进入电脑的BIOS设置一下启动顺序,将U盘启动设置为第一启动盘,之后就进入下图的u盘启动界面。在下图的启动界面,用上下键选择“Install CentOS 7”,然后回车。

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

之后出现下面的画面:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

然后一排排的文字闪过:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

之后进入下面的图形安装界面,在下面的界面选择“中文”,然后继续下一步:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

之后进入下面的界面,这个设置界面可以设置很多的选项,例如设置“日期和时间”、设置“键盘布局”、设置“系统安装位置”、设置“网络”等,这一步非常重要,必须设置好“系统安装位置”,不然无法进入下一步。而且必须设置好“网络”,不然后面的安装步骤会比较麻烦。

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

最重要的就是设置“系统安装位置”,点击“安装位置”:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

选择你的硬盘:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

如果你的硬盘里面之前有安装过 *** 作系统或存在数据,安装程序会自动检出你的硬盘里面存在数据,点击“全部删除”、“回收空间”等按钮,将原来的旧硬盘数据进行清空处理,这样才能进入下一步的安装步骤:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

另外要看看“网络和主机名”,如果显示“已连接”代表网络已经设置好了,如果发现“未连接”或者“连接中断”之类的提示,代表网络没有设置好。点击“网络和主机名”进去(见下图),将网络设置好:设置网络非常简单,网线插好,然后自动IP、反正什么选项都点击“自动获取”,确定之后,你就发现网络变成了“已连接”了(见下图)。看到“已连接”字样,代表网络已经连接好了,可以接着进行下一步。

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

下图的这几个选项都设置好之后,你就会发现界面右下角可以继续下一步了。

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

点击继续之后,系统就开始安装了:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

在系统的安装过程中,可以点击界面上方的“ROOT密码”来设置ROOT密码,点击“创建用户”来创建用户(见上图)。我建议还是设置一下“ROOT密码”、然后创建一个用户名为“admin”的用户,密码自己选。

如果你的硬盘是固态硬盘,安装过程大概5-8分钟就安装完了,安装完成后,会出现下图的界面:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

我将上图放大一下,大家看看界面右下角出现了“CentOS已成功安装并可以使用”字样(见下图),代表安装已经完成了。

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

第4步、重启电脑,进入CentOS 7纯文字系统界面

拔掉u盘启动盘,进入CentOS 7 *** 作系统,就是下图的界面。

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

很多高手会直接在这个界面 *** 作Linux系统,我见过这样的高手。

有朋友会问,这样像是DOS界面的CentOS界面,怎么 *** 作啊?高手是用命令来 *** 作的电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

可惜我不是高手,所以我进入下一步。

第5步、安装图形 *** 作界面

在上面的界面,输入用户名root,密码是刚刚安装系统时,你自己设置的密码。

然后输入下面的命令,并回车:

yum groupinstall "X Window System"

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

yum groupinstall "X Window System"回车之后,系统会开始下载图形 *** 作界面上(所以在第3步安装系统的时候,必须设置好网络,因为这一步需要用到网络连接互联网,如果第3步没有设置网络,这里用命令来配置网络的话,是非常麻烦的),下载过程中,遇到问你y还是n的时候,一律y回车:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

出现Complete提示,代表完成了(见下图):

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

之后输入下面的命令并回车,来安装图形 *** 作界面:

yum groupinstall “GNOME Desktop”

等了大概10分钟之后,会出现“Complete”字样的提示(见下图),代表安装完成了。安装过程中,问你y还是n的时候,一律选y:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

第6步、进入图形 *** 作界面

第5步完成之后输入startx并回车,就会进入下图所示的图形 *** 作系统界面。

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

第一次进入的话,需要选择“语言”和“键盘输入布局”等:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

这个CentOS 7系统的界面非常简洁:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

自带Firefox火狐浏览器:

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

终端等等linux的功能都有。

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍

总结

1、按照上面步骤全部完成之后,第一次进入CentOS 7的图形界面会发现这是一个全英文的菜单,当然可以设置成中文菜单,设置方法在这里就不再赘述了。

2、Linux系统包括CentOS 7也可以安装微信、QQ、WPS、Photoshop等我们常用的软件,大公司的常用软件一般有Linux版本。但是也有很多windows软件没有Linux版本,如果windows软件没有Linux版本,可以在Linux系统上安装windows虚拟机来运行windows程序电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍 。

3、使用Linux系统的朋友,大多可能是因为要跑Linux程序。程序对硬件要求不高的朋友,一般会在windows系统上安装Linux虚拟机来跑Linux程序,但是有些Linux程序对硬件要求比较高(不少Linux程序处理大数据需要超大内存等),所以才会在电脑上直接安装一个Linux系统。

电脑安装Linux *** 作系统的步骤:CentOS 7系统安装步骤介绍


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7408987.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存