当前位置: 首页 > 编程日记 > 正文

FUSE——用户空间文件系统

用户空间文件系统(Filesystem in Userspace,简称FUSE)是操作系统中的概念,指完全在用户态实现的文件系统。
目前Linux通过内核模块对此进行支持。一些文件系统如ZFS,glusterfs和luster使用FUSE实现。   
  
  Linux用于支持用户空间文件系统的内核模块名叫FUSE,FUSE一词有时特指Linux下的用户空间文件系统。   
  
  文件系统是一个通用操作系统重要的组成部分。传统上操作系统在内核层面上对文件系统提供支持。而通常内核态的代码难以调试,生产率较低。   

  Linux从2.6.14版本开始通过FUSE模块支持在用户空间实现文件系统。   

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

使用 FUSE 您可以开发功能完备的文件系统:其具有简单的 API 库,可以被非特权用户访问,并可以安全的实施。更重要的是,FUSE 以往的表现充分证明了其稳定性。

使用 FUSE,您可以像可执行二进制文件一样来开发文件系统,它们需要链接到 FUSE 库上 —— 换言之,这个文件系统框架并不需要您了解文件系统的内幕和内核模块编程的知识。

http://fuse.sourceforge.net/

2011033009162596.png

The FUSE kernel module and the FUSE library communicate via a special file descriptor which is obtained by opening /dev/fuse.  This file can be opened multiple times, and the obtained file descriptor is passed to the mount syscall, to match up the descriptor with the mounted filesystem.

=================
  浏览了下sourceforge,知道FUSE支持kernel2.4.X和2.6.X,就直接把latest stable release下下来了,2.8.2,./configure;make;make install之后跑了下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都看得到了。

接下去一分为二,FUSE的一些实现以及API Reference,并且在fuse的源pack里也有相应doc,kernel文件夹下就是source code;另外就是实际的编码实现,无论是商业抑或学术的项目,基于fuse实现的有很多,cvsfs,ftpfs...wiki上有详细list,不过都笼统介绍了下。在IBM developerworks里搜到篇比较详细的说明定制和创建新fs的过程的文章,刚上手的话推荐看下,很有实用价值。

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。并返回fuse模块文件fd给fuse_main()函数。

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读取文件系统调用,调用fuse_operations结构中的处理函数,返回调用结果给/dev/fuse

几个key:
  (1)处于用户态的文件系统要和kernel通讯的话要通过一个特殊的FD,打开/dev/fuse即可得到
  (2)让不具备相应优先级的用户做mount syscall:两个提升优先级的解决方案,一是你创建的文件系统有device file,打开device即可。或者创建的文件系统包含suid,sgid的程序,然后执行改程序,suid,sgid可以帮助非授权用户在执行含有其的程序时能够访问受限的资源。

FUSE operations:


  这个就跟编码有关系了,要实现的文件系统有些特殊功能,只要实现上述fuse_operations的部分函数即可,比较重要的像mkdir,read,open,write...因此在fuse的帮助下实现user态的文件系统,编码架构就非常清晰了,
给出需要使用的文件系统功能的函数指针,

static struct fuse_operations my_operations = {  
.getattr = my_getattr,  
.readdir = my_readdir,  
.open = my_open,  
.read = my_read,  
... ...
};  
定义完之后在main函数里面直接丢给fuse_main()即可。当然my_open,my_read之类的功能函数要自己实现好,最后完成后fusemount下就可以测试新创建的文件系统了。也有其他应用,比如让老内核通过fuse调用新内核下的文件系统等等。下一步要着眼的是项目所需要的功能,以此来选取fuse_operations中需要实现的函数,以及这些函数需要的coding skills,目前,看了几个利用fuse搭起来的fs源码,很多函数和宏定义都不理解其意。快过年了,导师仍然不待见,sigh...这阶段要复习下基础知识了,从ulk看起,os学的不理想。

from:http://hi.baidu.com/bulletup/blog/item/fa612c7052f823178701b0ac.html

相关文章:

29个简单直观的移动设备网页设计

毫无疑问的是移动网络已经风靡世界。运行在iOS或Android智能手机,这两者提供了出色的网页浏览平台。而且这个数字仅仅是预期增加人口的平均工资增长率扩大。 然而该过程的设计和编码移动模板可以是非常乏味。我希望提供一个创造性的思路在这个画廊29个直观的手机设计…

【java】maven工程使用switch时不能使用String解决方法

原因 : 1.7之前不支持使用String 解决方法 : 1、右击程序------》 Build Path ------》Config Build Path 2、选择图示选项 3、更改选项,如图 4、更改编译器 5、将版本改为1.8 6、应用

Oracle 存储过程 无法编译 解决方法(转载)

声明:本文为转载,如果有侵犯知识版本,请通知本人,本人将即刻停止侵权行为: http://blog.csdn.net/tianlesoftware/article/details/7412555 Oracle存储过程无法编译,在PL/SQL中编译,总是挂住了,这个原因可能是要编译的…

交流一点CCNP学习经验

首先反问自己,学习NP的最现实目的是什么。 如果是在校大学生,中专,职高的学生。大多目的是通过一个认证,学习更多有用的知识和技能。招个好工作。有个好的开始。这样应该是把扎实的基础理论和熟练的基础实验操作放在第一位。不要死…

iOS测试基础(命令篇)-iPhone型号及其他信息

首先安装libimobiledevice和ideviceinstaller brew uninstall ideviceinstaller brew uninstall libimobiledevice brew install --HEAD libimobiledevice brew link --overwrite libimobiledevice brew install ideviceinstaller brew link --overwrite ideviceinstaller 应用…

Soft-to-Hard Vector Quantization for End-to-End Learning Compressible Representations

郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract: 我们提出了一种新的方法,通过端到端的训练策略来学习深度架构中的可压缩表征。我们的方法是基于量化和熵的软(连续&#x…

Delta3D———通过游戏管理器组件和消息的扩展创建自定义行为 《转》

游戏管理器组件给我们提供了在不修改游戏管理器的情况下灵活扩展我们的自定义行为的能力。游戏管理器组件是基于消息来工作的,定义自定义行为的基本 流程就是创建自定义类型的消息,在合适的时候发送消息,创建自定义游戏管理组件并重写自己的消…

【spring】在不联网的情况下查看xml的定义规则的方法

1、打开依赖 2、打开该jar包 3、打开该包 4、找到xml的规则

常用的js判断

常用的js判断 关于注册的时候&#xff1b;对注册信息的判断&#xff1a; 表单 <form id"form" name"form" method"post" action"" οnsubmit"return CheckPost();"> 引入&#xff1a;<script language"JavaS…

解决Chrome中UEditor插入图片的选择框加载过慢问题

解决Chrome中UEditor插入图片的选择框加载过慢问题 ../resources/plugins/ueditor/ueditor.all.js 中line24489/24498中的 accept"image/*" 修改为 accept"image/jpeg,image/jpg,image/png,image/gif,image/bmp"../resources/plugins/ueditor/dialogs/im…

转:[大数据竞赛]夺冠感言:走进业务,提升对世界的认知能力

http://bbs.aliyun.com/read/153103.html?spm5176.7189909.0.0.KWGWap 一、同为推荐&#xff0c;大不同&#xff01;不知道同学们是否经常在天猫购物&#xff0c;但是相信大家一定听过音乐&#xff0c;看过电影&#xff0c;读过新闻和小说。大家在享受各种娱乐信息的时候&…

【转】C/C++中的日期和时间

头文件 time.h 函数用途 函数名 得到处理器时间 clock 得到时间差 difftime 设置时间 mktime 得到时间 time 得到以ASCII码表示的时间 asctime 得到字符串表示的时间 ctime 得到指定格式的时间 strftime 摘要&#xff1a; 本文从介绍基础概念入手&#xff0c;探讨了在C/C中对日…

【spring】di(依赖注入)使用实例

1、xml文件里的配置 <!-- 问题 &#xff1a; 两个bean的顺序可不可以调换&#xff1f; 答 &#xff1a; 可以--><bean id"userDao" class"springboottest.ioc.UserDao"> </bean><bean id"UserService" class"springb…

设置php-fpm使用socket文件

1、在配置文件/usr/local/php/etc/php-fpm.conf文件中找到 <value name "listen_address">127.0.0.1:9000</value> 改为<value name"listen_address"> /var/run/phpfpm.sock</value> 重启php-fpm /usr/local/php/sbin/php-fpm r…

BZOJ1251: 序列终结者

【传送门&#xff1a;BZOJ1251】 简要题意&#xff1a; 给出一个长度为n的序列&#xff0c;有m个操作&#xff0c;3种操作&#xff1a; 1 l r k将l到r的数增加k 2 l r将l到r的数列翻转 3 l r求出l到r的最大值 题解&#xff1a; 裸SPLAY&#xff0c;直接下放两种标记&#xff0c…

Linux笔记 软件管理

一、软件包分类1.软件包分类&#xff1a;源码包、二进制包源码包&#xff1a;源代码1&#xff09;优点&#xff1a;开源&#xff0c;有能力可修改源代码可以自由选择所需的功能软件是编译安装&#xff0c;更适合Linux系统&#xff0c;更稳定效率更高卸载方便。2&#xff09;缺点…

如何有效编写软件的75条建议

1. 你们的项目组使用源代码管理工具了么&#xff1f; 应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。2. 你们的项目组使用缺陷管理系统了么&#xff1f; 应该用。ClearQuest太复杂&#xff0c;我的推荐是BugZilla。 3. 你们的测试组还在用…

【spring】使用spring的环境配置及从官网获得配置文件所用代码的方法

环境配置 1、添加jar包 spring-beans-4.1.3.RELEASE.jarspring-context-4.1.3.RELEASE.jarspring-core-4.1.3.RELEASE.jarspring-expression-4.1.3.RELEASE.jar 2、配置文件 &#xff08;1&#xff09;在下创建一个config文件夹 &#xff08;2&#xff09;在文件夹下创建一…

C语言:1孩半问题

题目&#xff1a; 一孩半&#xff0c;又称独女户二胎&#xff0c;即中国大陆部分农村的一项计划生育政策&#xff0c;第一胎是女孩的夫妻可以生育第二个子女。如果第二胎有n%人工性别选择干预&#xff08;选择男孩&#xff09;&#xff0c;试问男女比例为多少。&#xff08;10分…

Javascript字符串及数组赋值区别

最近做一个分页的javascript程序&#xff0c;需要先将tbody下面的tr标签全部删除&#xff0c;然后再append新的tr&#xff0c;使用下面的代码 var trs$d("tbdoys").getElementsByTagName("tr");for(var j0;j<trs.length;j){$d("tbdoys").remo…

Linux系统分辨率设置

linux 设置分辨率 如果你需要在linux上设置显示屏的分辨率&#xff0c;分两种情况&#xff1a;分辨率模式存在与分辨率模式不存在&#xff0c;具体如下。 1&#xff0c;分辨率模式已存在 1&#xff09;如何查询是否存在&#xff1a; 图形界面&#xff1a;在System Settings/Dis…

【spring】使用构造方法依赖注入

注 &#xff1a; &#xff08;1&#xff09;使用构造方法依赖注入有两种一种是通过参数顺序一种是按照参数类型的顺序 &#xff08;2&#xff09;所有的依赖注入都必须拥有无参的构造方法&#xff0c;一开始没有添加是因为jvm会自动分配 按照参数的顺序 代码实现&#xff1…

【技术贴】火狐的悬停激活标签扩展插件下载。Tab Focus

火狐专用鼠标悬停激活标签&#xff0c;像360和搜狗浏览器那样的把鼠 标放在标签上&#xff0c;一般都是设置200ms激活此标签。 https://addons.mozilla.org/zh-CN/firefox/addon/tab-focus/ 在组件里可以设置Tab Focus &#xff0c;我都是设置1ms激活。比较爽。

数据结构_顺序栈的代码实践

#include <iostream> using namespace std; #define Maxsize 100//预先分配空间&#xff0c;这个数值根据实际情况预估确定 typedef struct SqStack{int *base;//栈底指针int *top;//栈顶指针 }SqStack;bool InitStack(SqStack &S)//构造空栈 {S.base new int…

C#字符串与享元(Flyweight)模式

写这个文章&#xff0c;主要是因为网上对C#字符串和享元模式的误解比较多。 Flyweight模式 先说这名字&#xff0c;fly呢&#xff0c;就是苍蝇&#xff0c;没错这里面不是飞的意思&#xff0c;是苍蝇的意思&#xff0c;weight大家都知道&#xff0c;就是重量&#xff0c;苍蝇的…

CarTool 使用,获取图片资源

程序&#xff1a;gitHub: 项目地址 使用方法&#xff1a; 1.拿到资源包 在itunes里找到喜欢的应用&#xff0c;然后下载&#xff0c;直接将app拖到桌面。得到一个一个ipa资源包&#xff0c;如图 2.将资源包改成zip格式 3.解压zip资源包&#xff0c;随后打开&#xff0c;显示包…

【spring】p命名空间的使用

1、在xml文件中添加配置 xmlns:p"http://www.springframework.org/schema/p" 2、在xml中进行更改 更改前&#xff08;使用属性依赖注入&#xff09;&#xff1a; 代码实现&#xff1a; <bean id"UserService" class"springboottest.ioc.UserSe…

ARM的位置无关程序设计在Bootloader中的应用

http://www.mcuol.com/tech/107/26052.htm 引言 基于位置无关代码PIC&#xff08;PositionIndependent Code&#xff09;的程序设计在嵌入式应用系统开发中具有重要的作用。 尤其在裸机状态下开发Bootloader程序及进行内核初始化设计&#xff1b;利用位置无关的程序设计方…

CentOS 7 添加系统开机服务

CentOS 7的服务systemctl脚本存放在&#xff1a;/usr/lib/systemd/&#xff0c;有系统&#xff08;system&#xff09;和用户&#xff08;user&#xff09;之分&#xff0c;需要开机不登陆就能运行的程序&#xff0c;存在系统服务里&#xff0c;即&#xff1a;/usr/lib/systemd…

UITableView HeaderView,FooterView 使用SnapKit布局导致约束异常

今天做一个APP里面设置页面(个人中心) 就是一个列表菜单 顶部是一个头像和账户标题, 底部为一个退出登录按钮 当然我第一时间就想到了UITableView, HeaderView, FooterView // 我创建了两个类文件, 用来做UITableView 的header, footer class SettingHeaderView: UIView {//里面…