方案论证(设计理念)
首先说一下我对FUSE的理解,FUSE是对Linux内核扩展,允许用户空间程序为各种与文件相关的系统调用提供实现。可以说FUSE其实是一个用来帮助我们实现文件系统的库,我们可以通过库里面的各种方法和它给出的框架,来实现一个用户空间上的文件系统,这个系统里面对文件的各种操作由我们自己编写相应的函数来实现。
fuse主要由三部分组成:FUSE内核模块、用户空间库libfuse以及挂载工具fusermount3。内核模块实现了一个能被用户空间进程打开的设备;libfuse库负责和内核空间通信,接收来自/dev/fuse的请求,并将其转化为一系列的函数调用,将结果写回到/dev/fuse;挂载工具fusermount3实现对用户态文件系统的挂载。
文件系统的运行流程大概是这样的:
-
在fuse_operation里面注册各种操作的函数,这些函数当然是由我们实现的,其中会调用到一些libfuse里面的API,还要有一个数据结构来把整个文件系统的内容存起来,至于详细如何与OS进行连接,还有fuse是如何处理我们在终端输入的命令的,我们全部交给fuse_main来处理就可以了。经过我的观察,一旦我们运行了自己的编译好的文件系统文件,这个进程就会一直在后台运行,等待新的内核命令到来,这是我在网上找到的关于fuse_main()的处理过程:
-
先打开设备文件/dev/fuse;
-
然后挂载FUSE文件系统;
-
产生FUSE文件系统指针;
-
初始化FUSE文件系统的操作函数集:
-
初始化信
-