Linux FUSE源代码分析(1)

一、Fuse简要介绍

FUSE(用户空间文件系统)是这样一个框架,它使得FUSE用户在用户态下编写文件系统成为可能,而不必和内核打交道。FUSE由三个部分组成,linux内核模块、FUSE库以及mount 工具。用户关心的只是FUSE库和mount工具,内核模块仅仅提供kernel的接入口,给了文件系统一个框架,而文件系统本身的主要实现代码位于用户空间中。 FUSE库给用户提供了编程的接口,而mount工具则用于挂在用户编写的文件系统。

FUSE起初是为了研究AVFS(A Virtual Filesystem)而设计的,而现在已经成为SourceForge的一个独立项目,目前适用的平台有Linux, FreeBSD, NetBSD, OpenSolaris和Mac OS X。官方的linux kernel版本到2.6.14才添加了FUSE模块,因此2.4的内核模块下,用户如果要在FUSE中创建一个文件系统,需要先安装一个FUSE内核模块,然后使用FUSE库和API来创建。

1.1 什么是Fuse

传统的文件系统是操作系统的一部分,放在操作系统内核里面实现。Fuse(Filesystem in Userspace), 一个用户空间文件系统框架,提供给我们一组用于实现一个文件系统的API,使我们可以在用户态实现自已的文件系统。目前fuse已集成在Linux2.6以上版本的内核中。

(注:操作系统中的用户态指权限等级中的一般级别,与之相对的是超级用户或者管理员的特权级别。用户态启动的每个进程,根据运行该进程的登录用户,都被系统赋予一定的权限,另外也有一些限制。)

1.2 优缺点

1)              传统文件系统都是定义在操作系统内核层面上的,要操作系统识别一种新的文件系统,必需重写内核,而内核态代码难以调试,生产率较低;但是用户空间编程和调试难度较小,有更多的语言可以选择(目前FUSE已经绑定了很多语言,比如c++、java等),还可以复用已有的库),从而能够大幅提高生产率,极大地简少了为操作系统提供新的文件系统的工作量。

2)              一些服务可以通过统一的文件系统接口来进行访问,比如说ftp、sftp、samba

3)              可以把非文件的服务当做文件来实现,比如把gmail提供的巨大的空间用来进行文件存储的Gmail Filesystem。

在用户态实现文件系统必然会引入额外的内核态/用户态切换带来的开销,对性能会产生一定影响。

二、FUSE特性

a、库文件和 API简单,极大地方便了用户的使用

b、安装简便,不需要加补丁或者重新编译 kernel

c、执行安全,使用稳定

d、高效,相对于其它用户态文件系统实例

e、非特权用户可以使用

f、基于  linux2.4.x 和 2.6.x 内核,现在可以支持JavaTM 绑定,不必限定使用C和C++来编写文件系统

三、源代码目录:

 ./doc               包含FUSE相关文档

 ./include       包含了FUSE API头,对创建文件系统有用,主要用fuse.h

 ./lib                存放FUSE库的源代码

 ./util               包含了FUSE工具库的源代码

 ./example        参考的例子

 

四、安装

FUSE的源码安装类似于其他软件,只需要在FUSE的源码目录下执行如下命令即可: 

./configure

make

make install(以root身份执行)

五、FUSE operations

      FUSE使用fuse_operations来给用户提供编程结构,让用户通过注册自己编写的函数到该结构体来实现自己的文件系统。

 

六、Fuse文件系统的结构

fuse包括三个模块:用户空间库,内核模块以及mount工具

1)用户空间库给程序员提供编程接口,程序员通过实现fuse提供的两组接口fuse_lowlevel_ops, fuse_operations之一即可实现一个用户空间文件系统

2)内核模块实现了一个完整文件系统的框架,但具体操作没有实现(由程序员在用户空间实现)

3)mount工具fusermount用于挂载基于fuse的文件系统

 

6.1 Fuse在用户空间工作的流程图

通过这幅图可以看到三个模块在fuse工作时所起的作用

fuse_main() (lib/helper.c)——fuse用户空间主函数,用户程序调用它时,fuse_main()函数解析相关参数(如mountpoint,multithreaded),并调用fuse_mount()函数,接着调用fuse_new()函数,为fuse文件系统数据分配存储空间。最后调用fuse_loop()函数实现会话的接受与处理。

fuse_mount() (lib/mount.c)——创建UNIX本地套接口,创建并运行子进程fusermount。

fusermount (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 (/dev 设备文件存储目录)读取文件系统调用,调用fuse_operations或fuse_lowlevel_ops结构中的处理函数,返回调用结果给/dev/fuse

6.2 Fuse内核模块

FUSE Kernel模块由两部分组成:

第一部分——proc文件系统组件:Kernel/dev.c——回应io请求到/dev/fuse。fuse_dev_read()函数负责读出文件,并将来自“list of request”结构体的命令返回到调用函数。fuse_dev_write ()负责文件写入,并将写入的数据置放到“req→out”数据结构中。

第二部分——文件系统调用部分:kernel/file.c,kernel/inode.c,kernel/dir.c——调用request_send(),将请求加入到“list of request”结构体中,等待回复(reply)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值