FUSE用户空间文件系统



FUSE用户空间文件系统。用户空间文件系统(Filesystem in Userspace,简称FUSE)是操作系统中的概念,指完全在用户态实现的文件系统。目前Linux通过内核模块对此进行支持。一些文件系统如ZFS,glusterfs和moosefs使用FUSE实现。

Linux用于支持用户空间文件系统的内核模块名叫FUSE,FUSE一词有时特指Linux下的用户空间文件系统。文件系统是一个通用操作系统重要的组成部分。传统上操作系统在内核层面上对文件系统提供支持。而通常内核态的代码难以调试,生产率较低。

 

Linux从2.6.14版本开始通过FUSE模块支持在用户空间实现文件系统。在用户空间实现文件系统能够大幅提高生产率,简化了为操作系统提供新的文件系统的工作量,特别适用于各种虚拟文件系统和网络文件系统。ZFS和 glusterfs都属于网络文件系统。但是,在用户态实现文件系统必然会引入额外的内核态/用户态切换带来的开销,对性能会产生一定影响。

 

使用 FUSE 您可以开发功能完备的文件系统:其具有简单的 API 库,可以被非特权用户访问,并可以安全的实施。更重要的是,FUSE 以往的表现充分证明了其稳定性。使用 FUSE,您可以像可执行二进制文件一样来开发文件系统,它们需要链接到 FUSE 库上 —— 换言之,这个文件系统框架并不需要您了解文件系统的内幕和内核模块编程的知识。 http://fuse.sourceforge.net/

 


浏览了下sourceforge,知道FUSE支持kernel2.4.X和2.6.X,就直接把latest stable release下下来了2.8.2,

复制代码
tar -xzvf fuse-2.8.5.tar.gz
cd fuse-2.8.5/
./configure;
make
make install
echo ‘exportPKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH’ >>/etc/profile
source /etc/profile
modprobe fuse
复制代码

可能出现的问题:

之后跑了下example里的hello,出现device not found error,用modprobe fuse查看,cannot locate fuse module.果然,FUSE虽说是支持2.4.X,不过该版本kernel里面没有fuse内核模块。查了下wiki,kernel 2.6.14之后才开始有自带fuse。

有2种解决方案:

一种是将fuse编译进current kernel module中,
另一种将fuse source code配置好放于相应目录中recompile kernel。
显然前者更方便,不过由于下载的是最新稳定版本,configure选项没有–enable-kernel-module参数,退而求其次,下了个蛮早的版本,2.4.2,证实有–enable-kernel-module,安装完之后modprobe fuse不再报错,./hello pathname -d下就可以跑个最简单的程序了。该文件系统只有单个文件hello,只含hello world一句话,然后将其mount到pathname下,跑完之后无论cat还是ls都看得到了。