Fuse是filesystem in user space,一个用户空间的文件系统框架,允许非特权用户建立功能完备的文件系统,而不需要重新编译内核。fuse模块仅仅提供内核模块的入口,而本身的主要实现代码位于用户空间中。对于读写虚拟文件系统来讲,fuse是个很好的选择。fuse包含包含一个内核模块和一个用户空间守护进程,将大部分的VFS调用都委托一个专用的守护进程来处理。
2工作原理
Fuse用户空间文件系统与真实的文件系统不同,它的supper block, indoe, dentry等都是由内存虚拟而来,具体在物理磁盘上存储的真实文件结构是什么,它不关心,且对真实数据的请求通过驱动和接口一层层传递到用户空间的用户编写的具体实现程序里来,这样就为用户开发自己的文件系统提供了便利,这也就是所谓的“用户空间文件系统”的基本工作理念。2.1模块架构
FUSE分为三大模块:
ØFUSE内核模块(内核态)
ØLibFUSE模块(用户态)
Ø用户程序模块(用户态)
用户程序在用户空间实现LibFUSE库封装的文件系统操作;
LibFUSE实现文件系统主要框架、对“用户实现的文件系统操作代码“的封装、mount管理、通过字符设备/dev/fuse与内核模块通信;
FUSE内核模块实现VFS接口(实现fuse文件驱动模块的注册、fuse的(虚拟)设备驱动、提供supper block、dentry、inode的维护),接收来至后者的请求,传递给LibFUSE,LibFUSE再传递给我们用户程序的接口进行实现操作。
图一2.1.1源代码结构及开发库
FUSE内核模块
kernel/inode.c—>主要完成fuse文件驱动模块的注册,提供对supper block的维护函数以及其它(驱动的组织开始文件)
kernel/dev.c—> fuse的(虚拟)设备驱动
kernel/control.c —>提供对于dentry的维护及其它
kernel/dir.c—>主要提供对于目录inode索引节点的维护
kernel/file.c—>主要提供对于文件inode索引节点的维护
LibFUSE模块
lib/helper.c—> “fuse_main()”调用的主入口
lib/fuse_kern_chan.c—>主要实现fuse应用层访问(读写)fuse driver的功能
lib/mount_util.c –>提供mount的基础函数调用
lib/mount.c—>主要实现设备的“mount”、“umount”等挂接操作
lib/mount_bsd.c —>“Free bsd”下的“mount”、“umount”实现
lib/fuse_mt.c—> fuse的mount管理
lib/fuse.c—> lib库主框架文件,实现了主要框架及对“用户实现的文件系统操作代码“的封装
lib/fuse_lowlevel.c–>实现比较底层的函数封装,供fuse.c等使用
lib/fuse_loop.c —> fuse lib循环监视“fuse driver”的通信缓存
lib/fuse_loop_mt.c —>同上
lib/fuse_session.c —> fuse会话管理
开发库
include/fuse.h—>the library interface of FUSE(High Level)
include/fuse_common.h—> common
include/fuse_lowlevel.h—> Lowlevel API
include/fuse_opt.h—> option parsing interface of FUSE2.2系统工作流程
fuse_main(lib/helper.c)–fuse用户空间主函数,用户程序调用它时,fuse_main函数解析相关函数(如mountpoint,multithreaded),并调用fuse_mount函数。调用fuse_new()函数,为fuse文件系统数据分配存储空间。调用fuse_loop()函数实现会话的接受与处理。
fuse_mount(lib/mount.c)–创建UNIX本地套接口,创建并运行子进程fusermount.并返回fuse模块文件fd给fuse_main()函数。
fusemount(util/fusermount.c)–确保fuse模块已经加载,通过UNIX套接口返回fuse模块的文件fd给fuse_mount()函数。
fusermount提供一系列挂载选项,如direct_io(跳过页缓存),allow_root(允许root访问挂载的文件系统),allow_other(允许其他用户访问挂载的文件系统),nonempty(允许把文件系统挂载到非空目录),big_writes(支持大于4k的写操作)等
fuse_new(lib/fuse.c)–为fuse创建数据结构空间,用来存储文件系统数据。
fuse_loop(lib/fuse.c)(fuse_loop_mt(lib/fuse_mt.c))–从/dev/fuse读取文件系统调用,调用fuse_operation结构中的处理函数,返回调用结果给/dev/fuse.
如图二:
图二
fuse处理请求的整个流程如图三所示,以unlink操作为例进行说明。其中>”表示调用,”