如何实现一个非常简单的文件系统?

45

我想知道操作系统是如何读写硬盘的。
作为练习,我想实现一个简单的文件系统,不带目录,可以读写文件。
我应该从哪里开始?
C/C++是否足够,还是需要使用更底层的方法?
这个任务对一个人来说是否太过繁重?


只需查看minix文件系统的概念。 - Erhard Dinhobl
一个人处理文件系统并不是太难。许多文件系统最初都是由一个人编写的(至少在最初阶段)。 - Omnifarious
@Mr. Q.C.:在答案中留下一个链接。 - the_drow
有一些资源链接吗?好的:http://en.wikipedia.org/wiki/MINIX_file_system - Erhard Dinhobl
使用Busybox创建简单的文件系统 http://linuxseekernel.blogspot.com/2014/06/create-simple-file-system.html - Jeyaram
与之密切相关,但具有更精确的需求列表:https://dev59.com/V0vSa4cB1Zd3GeqPgrvR - Ciro Santilli OurBigBook.com
4个回答

28

看看 FUSE:http://fuse.sourceforge.net/

这允许您编写文件系统而无需实际编写设备驱动程序。从那里开始,您可以从一个单一的文件开始。基本上创建一个长度为100MB的文件,然后编写用于读写该文件的例程。

在您对结果满意之后,可以考虑编写设备驱动程序,并使您的驱动程序针对物理磁盘运行。

好处是使用 FUSE 几乎可以使用任何语言,不仅仅是 C/C++。


4
我同意FUSE是一个很好的接口,适合初学者使用,因为它抽象了许多底层细节。但也许OP对这些底层细节也感兴趣? - miku
3
@The MYYN:是的,我是。但我必须从某个地方开始。 - the_drow

12

在我看来,FAT有点复杂。 - user6754053
@MarkYisri,哪个更容易? - Pacerier
1
@Pacerier 你可以用几个 structs 来制作一个简单的文件系统。它的功能非常有限,但在嵌入式系统中可能已经足够了。 - user6754053

11

学习文件系统的概念并不一定需要使用磁盘,我认为只需创建一个由512字节的字节数组组成的数组即可。想象一下这是您的硬盘并开始进行一些实验。 此外,您可能想看一下一些标准的操作系统教科书,比如http://codex.cs.yale.edu/avi/os-book/OS8/os8c/index.html


5
你的第一个问题的答案是,除了像其他人告诉你的Fuse之外,你还可以使用Dokan,在Windows上执行相同的操作,然后只需对物理分区执行读取和写入操作(http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx(特别是关于物理磁盘和卷的部分))。
当然,在Linux或Unix中,除了使用类似Fuse的东西之外,如果你是root,你只需要对想要的设备发出读取或写入调用,在这些方面,Unices更加友好,或者根据你的观点更不安全。
从那里开始尝试实现一个简单的文件系统,如Fat,或者像tar文件系统这样的更神秘的东西,甚至是基于Unix概念(如UFS或Minux)的一些简单的文件系统,或者只记录被调用及其参数的调用日志文件(这将有助于你了解在正常使用计算机期间向文件系统驱动程序发出的调用)。
现在回答你的第二个问题(比较简单),是的,C/C++可以胜任,因为它们是系统开发的通用语言,此外,很多示例代码都是用C/C++编写的,所以你至少需要读懂C/C++来进行开发。
至于你的第三个问题,是的,一个人可以完成,例如ext文件系统(在Linux世界中广泛被认为是其后继者ext2或ext3)就是由单个开发者Theodore Ts'o创建的,所以不要认为这些事情不能由一个人完成。
最后需要注意的是,真正的文件系统与正常内核中的许多其他子系统交互,例如,如果你有一台笔记本电脑并将其休眠,文件系统必须刷新对打开文件所做的所有更改,如果分区上有页面文件,甚至如果页面文件有自己的文件系统,那么这将影响你的文件系统,特别是块大小,因为它们将倾向于等于或是页面块大小的幂次方,因为只需将一个文件系统块放置在恰好等于页面大小的内存中(因为这只是一个传输)即可。
而且,安全性也很重要,因为您希望控制用户以及他们读/写哪些文件,这通常意味着在打开文件之前,您需要知道已登录的用户以及他对该文件的权限。显然,如果没有文件系统,用户无法运行任何程序或与机器交互。现代文件系统层也会与网络子系统交互,因为存在网络和分布式文件系统。
因此,如果您想学习如何编写内核文件系统,那么除了了解VFS接口之外,还需要考虑这些问题。
附言:如果您想让Unix权限在Windows上起作用,可以使用类似于MS在Windows服务器版本上使用的NFS的东西。 (http://support.microsoft.com/kb/262965)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接