一、简介fuse用户文件系统,作为可加载模块,允许非特权用户建立功能完备的文件系统,而不需要重新编译内核。fuse模块仅仅提供内核模块的入口,而本身的主要实现代码位于用户空间中。对于读写虚拟文件系统来讲,fuse是个很好的选择。fuse包含包含一个内核模块和一个用户空间守护进程,将大部分的VFS调用都委托一个专用的守护进程来处理。
二、fuse
./doc包含fuse相关文档
./kernel包含了fuse内核模块的代码
./include包含了fuse API头,对创建文件系统有用,主要用fuse.h
./lib中存放了fuse库的源代码
./util包含了fuse工具库的源代码
./example参考例子
三、fuse流程
3.1
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()函数。
fuse_new(lib/fuse.c)--为fuse创建数据结构空间,用来存储文件系统数据。
fuse_loop(lib/fuse.c)(fuse_loop_mt(lib/fuse_mt.c))--从/dev/fuse读取文件系统调用,调用fuse_operation结构中的处理函数,返回调用结果给/dev/fuse.
具体流程图:
3.2 fuse_operation结构
向用户提供接口,实现用户空间文件系统。
3.3 fuse内核模块
fuse内核模块由两部分组成:
proc文件系统组件:kernel/dev.c--回应io请求到/dev/fuse。fuse_dev_read函数负责读出文件,并将来自request结构体的命令返回到调用函数。fuse_dev_write负责文件写入,并将写入的数据置放到req->out"结构中。
文件系统调用部分:kernel/file.c,kernel/inode.c,kernel/dir.c--调用request_send(),将请求加入到"list of request"结构体中,等待回复。
阅读(6260) | 评论(1) | 转发(0) |