作者简介:
吴锦华,2015年毕业于西安电子科技大学,目前就职于诺基亚上海贝尔,从事嵌入式平台开发工作2年,负责对第三方boot和Linux移植和适配到公司的软件平台架构。
明鑫,2006年毕业于武汉大学,目前就职于诺基亚上海贝尔,从事嵌入式平台开发工作11年,先后参与了VxWorks、Integrity等RTOS下的底层BSP及驱动开发,主导接入网络设备RTOS到Linux的移植。
快,关注Linuxer,一起涨姿势~
用户态文件系统介绍
用户态文件系统(filesystem in userspace, 简称FUSE),它能使用户在无需编辑和编译内核代码的情况下,创建用户自定义的文件系统。文件系统是操作系统的重要组成部分,一般在内核层面实现对于文件系统的支持,而通常内核态的代码难以调试,生产率较低。在用户态空间实现文件系统能够极大幅度的提高生产效率,简化为实现新的文件系统的工作量。FUSE主要包含两个部分,内核FUSE模块(Linux从2.6.14版本开始支持)和用户态Libfuse库。
目前FUSE支持的平台:
-
Linux 完全支持
-
BSD 部分支持
-
OX-X参考OSXFUSE
比较知名的用户态文件系统:
-
ExpanDrive:商业文件系统,实现了SFTP/FTP/FTPS协议;
-
GlusterFS:用于集群的分布式文件系统,可以扩展到PB级;
-
SSHFS:通过SSH协议访问远程文件系统;
-
GmailFS:通过文件系统方式访问GMail;
-
EncFS:加密的虚拟文件系统
-
NTFS-3G和Captive NTFS,在非Windows中对NTFS文件系统提供支持;
-
WikipediaFS:支持通过文件系统接口访问Wikipedia上的文章;
-
升阳公司的Lustre:和GlusterFS类似但更早的一个集群文件系统
-
ZFS:Lustre的Linux版;
-
archivemount:
-
HDFS: Hadoop提供的分布式文件系统。HDFS可以通过一系列命令访问,并不一定经过Linux FUSE;
在嵌入式开发平台上,我们利用FUSE实现unionfs,quota fs, RIP和temp sensor的文件系统。
FUSE官网:
https://github.com/libfuse/libfuse
FUSE实现机制分析
在这个章节,我们首先对于虚拟文件系统做一个简单介绍,Linux下的文件系统都依赖于虚拟文件系统,要了解FUSE,首先要对虚拟文件系统有一个了解。然后我们对于FUSE做一个宏观框架的分析,先大致了解一下整个FUSE是如何工作的,最后两个小节分别从用户态和内核态具体分析FUSE的实现。
虚拟文件系统介绍(VFS)
Linux支持ext,ext2,xia,minix,umsdos,msdes,fat32 ,ntfs,proc,stub,ncp,hpfs,affs 以及 ufs 等多种文件系统。为了实现这一目的,Linux 对所有的文件系统采用统一的文件界面,用户通过文件的操作界面来实现对不同文件系统的操作。对于用户来说,我们不要去关心不同文件系统的具体操作过程,而只是对一个虚拟的文件操作界面来进行操作,这个操作界面就是 Linux 的虚拟文件系统(VFS ) 。形象地说,Linux 的内核好像一个 PC 机的主板,VFS 就是上面的一个插槽,具体的文件系统就是外设卡。因此,每一个文件系统之间互不干扰,而只是调用相应的程序来实现其功能。在 Linux 的内核文件中,VFS 和具体的文件系统程序都放在 Linux\FS 中,其中每一种文件系统对应一个子目录,另外还有一些共用的 VFS 程序。在具体的实现上,每个文件系统都有自己的文件操作数据结构file-operations。所以,VFS 作为 Linux内核中的一个软件层,用于给用户空间的程序提供文件系统接口,同时也提供了内核中的一个抽象功能,允许不同的文件系统很好地共存。VFS 使 Linux 同时安装、支持许多不同类型的文件系统成为可能。VFS 拥有关于各种特殊文件系统的公共界面,如超级块、inode、文件操作函数入口等。实际文件系统的细节,统一由 VFS 的公共界面来索引,它们对系统核心和用户进程来说是透明的。
图2-1 VFS示意图
FUSE内核模块的实现跟传统的文件系统实现既有相似点,也有差别的地方,