初识FUSE(Filesystem in userspace)

初识FUSE(Filesystem in userspace)

        • 什么是FUSE?
        • FUSE原理
          • FUSE协议
        • 如何去使用?
        • 参考文章

之前因为一次作业有幸接触过FUSE,觉得它是一个很不错的框架,没来得及仔细了解。现在有点时间了,想要利用它做一个文件系统,便系统地去学习一下,在这里简单做个总结。

什么是FUSE?

FUSE is a userspace filesystem framework.

FUSE(全称Filesystem In Userspace)是一个用户空间的文件系统框架,也就是说能够允许用户空间创建并管理文件系统。它由三部分组件组成:

  • 内核模块(fuse.ko):协议封装和解析,封装转发由VFS转发过来的请求给用户态程序
  • 用户空间库(libfuse.*):协议解析和封装,负责解析由内核模块封装好的IO请求
  • 挂载工具(fusemount):用户态文件系统挂载

用户态文件系统是区别于内核文件系统的,在用户态文件系统没有出现之前,常见的文件系统如Ext2Ext4等都是在内核中直接实现的,这就很容易引发一个问题:(开发角度)调试困难;(使用角度)需要提权(root)。而用户态文件系统框架FUSE提供了这样一个机会:能保证安全不需要提权,开发过程中也易调试。但需要考虑到的是:FUSE作为一层框架,相当于在原有的文件系统上套了一层代理,相比原来内核实现的文件系统,会带来更多的性能开销。

FUSE原理

FUSE的工作流程可以用下图表示:
在这里插入图片描述

从图中可以看到,当用户空间发起request(ls -l /tmp/fuse)时,首先VFS获得请求(经由系统调用,再根据挂载点分析文件系统)并转发到内核模块中的FUSE,该框架按照预先定义好的协议将请求进行封装,并将封装好的请求发送给处理程序,而处理程序会解析该请求为原始请求并完成对应处理(利用libfuse),再按原路返回,由VFS将数据进行返回给用户空间。

在这里有一个注意的点:处理程序是如何和FUSE传输数据的?是/dev/fuse虚拟块设备,当FUSE将请求打包成特定格式后,会将数据放置于/dev/fuse中,而**守护进程(在用户空间侧)**监听到有消息后会立即读取来处理。

FUSE协议

struct fuse_req(向客户端发出的请求)的源码可以找到两个请求头struct fuse_in_headerstruct fuse_out_header

struct fuse_req {......
/* The request input header */struct {struct fuse_in_header h;} in;/* The request output header */struct {struct fuse_out_header h;} out;......
}

struct fuse_in_header的定义(内核中、libfuse中均有定义):

struct fuse_in_header {uint32_t	len; //数据长度uint32_t	opcode; // 操作码uint64_t	unique; // 唯一请求iduint64_t	nodeid; // 被操作的文件系统对象(文件/目录)的IDuint32_t	uid; // 请求进程的uiduint32_t	gid; // 请求进程的giduint32_t	pid; //请求进程的piduint16_t	total_extlen; /* 在libfuse中额外的定义*/uint16_t	padding; 
};

在请求头之后一般会紧接着一个请求体,类似于http协议,而请求体的大小是可变的(这跟发出请求后携带的实际数据大小有关的,可以通过opcode操作码来进行判断)

struct fuse_out_header的定义:

struct fuse_out_header {uint32_t	len;  //数据长度int32_t		error; // 错误码uint64_t	unique; // 唯一请求id
};

这个响应头也是类似于请求头,当处理程序完成对请求头的处理后,会根据协议将结果进行封装传回内核中,这就会用到响应头(如果携带有响应数据的话还会包含一个响应体)。在这个过程中,内核是通过unique标识请求的。

如何去使用?

libfuse的官方开源代码介绍中提到了这个库提供了两种API:

  • high-level:同步API,处理工作主要是与文件名称file name,文件路径path处理相关,并且当回调函数返回时请求处理完成。
  • low-level:异步API,所处理的必须是跟索引节点inode相关(相对来说要更加地熟悉底层文件系统实现的细节),响应必须使用一组单独的API函数显示发送。

具体如何使用,请查阅源码中所提供的例子。

参考文章

  • 详解 FUSE 用户态文件系统 - 摸鱼派 (fishpi.cn)

  • FUSE介绍 | 成长录-知行合一 (a-programmer.top)

  • FUSE(Filesystem in Userspace) - 简书 (jianshu.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux部署kettle并设置定时任务

一.安装Kettle linux中使用kettle时首先需要jdk环境,这里就不概述linux中jdk的安装与配置了。 1.首先将kettle压缩包放入linux并解压 unzip data-integration.zip kettle安装路径为:/root/Kettle9.3/data-integration 设置权限 chmod -R 755 /root/Kettle9.3/d…

LVS负载均衡群集NAT模式

LVS负载均衡群集NAT模式 一、集群与分布式1.1、集群的含义1.2、lvs模型1.3、系统性能扩展方式1.4、群集的三种类型1.4.1、负载均衡群集1.4.2、高可用群集1.4.3、高性能运算群集 1.5、LVS的负载调度算法1.5.1、轮询1.5.2、加权轮询1.5.3、最少连接1.5.4、加权最少连接1.5.5、ip_…

pc端测试手机浏览器运行情况,主要是测试硬件功能

测试h5震动摇晃等功能时不方便测试,需要连电脑显示调试数据 方法: 1.需要手机下载谷歌浏览器,pc端用edge或这谷歌浏览器 2.手机打开USB调试,打开要测试的网页 3.pc端地址栏输入edge://inspect/#devices(这里用的edge浏…

K8S:kubeadm搭建K8S+Harbor 私有仓库

文章目录 一.部署规划1.主机规划2.部署流程 二.kubeadm搭建K8S1.环境准备2.安装docker3. 安装kubeadm,kubelet和kubectl4.部署K8S集群(1)初始化(2)部署网络插件flannel(3)创建 pod 资源 5.部署 …

Linux HTTP协议

目录 1.浏览器与服务器通信过程2.HTTP请求报头(1)HTTP的请求报头结构(2)HTTP的请求方法 3.HTTP应答报头(1)HTTP的应答报头结构(2) HTTP的应答状态 1.浏览器与服务器通信过程 浏览器…

回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测(多指标,多图)效果一览…

清理Maven仓库中下载失败的文件

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Nginx详解 五:反向代理

文章目录 1. 正向代理和反向代理1.1 正向代理概述1.1.1 什么是正向代理1.1.2 正向代理的作用1.1.3 正向代理的基本格式 1.2 反向代理概述1.2.1 什么是反向代理1.2.2 反向代理可实现的功能1.2.3 反向代理的可用模块 2. 配置反向代理2.1 反向代理配置参数2.1.1 proxy_pass2.1.2 其…

当你的公司突然开始大量的裁员,被留下的你,真的准备好面对以后了吗?

留下来的,也是迷茫的 最近公司突然开始大量裁员,裁了一多半,作为唯一留下的APP 端开发人员,也开始陷入了焦虑,开始了思考,未来究竟何去何从,是否再去转到原生,从事原生的开发工作&a…

C语言入门Day_19 初识函数

目录 1.函数的定义 2.函数的调用 3.易错点 4.思维导图 前言: printf()我们已经很熟悉了,它有一个特定的功能,就是在屏幕上输出一行文字。之前的课程我们都称呼printf()为一个功能,实际上ta在编程中有个特定的名字——函数。 …

测试-----selenuim webDriver

文章目录 1.页面导航2.元素定位3. 浏览器操作4.获取元素信息5. 鼠标的操作6. 键盘操作7. 元素等待8.下拉框9.弹出框10.滚动条11.frame处理12.验证码处理(cookie) 1.页面导航 首先是导入对应的包 :from selenium import webdriver然后实例化:driver web…

网络安全宣传周|探索AI数字人的魅力和价值所在

9月11日至9月17日是国家网络安全宣传周,在福州举办的安全博览会上有着多种人工智能模型产品亮相现场,吸引着众多参观者的目光,尤其是AI数字人面对不同的问题、不同的场景都可以进行实时响应,不同于冷冰冰的传统智能客服的对话场景…

前端面试合集(二)

前端面试题合集 1.懒加载的原理及实现了解吗2.如何理解JS异步3.阐述一下 JS 的事件循环4.JS 中的计时器能做到精确计时吗?为什么? 1.懒加载的原理及实现了解吗 原理:当图片没有到达可视范围内时,图片不加载,当图片一旦…

Mobileye CEO来华:只有能控制住成本的公司,才能活下来

‍作者|德新 编辑|王博 上午9点近一刻,Mobileye CEO Amnon Shuashua步入酒店的会议室。由于Amnon本人是以色列希伯来大学的计算机科学教授,大部分人更习惯称他为「教授」。 时近以色列的新年,这趟教授的中国之行安排十分紧凑。 他率领了一…

遥遥领先的内存函数

目录 ​编辑 函数介绍 1.1 strlen 1.2 strcpy 1.3 strcmp 1.4 strcat 1.5 strstr 2.1 memcpy 2.2 memmove 2.3 memcmp 函数实现 1.1 strlen 1.2 strcpy 1.3 strcmp 1.4 strcat 1.5 strstr 2.1 memcpy 2.3 memcmp 函数介绍 1.1 strlen size_t strlen ( const char *…

SpringBoot整合Redis,基于Jedis实现redis各种操作

前言&#xff08;三步教你学会redis&#xff0c;主打一个实用&#xff09; springboot整合redis步骤&#xff0c;并基于jedis对redis数据库进行相关操作&#xff0c;最后分享非常好用、功能非常全的redis工具类。 第一步&#xff1a;导入maven依赖 <!-- springboot整合re…

小程序代码管理

“微信开发者工具”点击版本管理&#xff0c;然后点击代码管理会打开代码管理网页。 选择对应的项目组。 进来后点击创建项目。 输入git名称&#xff0c;然后选择命名空间&#xff0c;最后创建即可。 在刚才的“微信开发者工具”选择设置&#xff0c;然后添加远程。 输入名称&…

朋友圈大佬都去读研了,这份备考书单我码住了

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

pycharm安装jupyter,用德古拉主题,但是输入行全白了,看不清,怎么办?

问题描述 今天换了以下pycharm主题&#xff0c;但是jupyter界面输入代码行太白了&#xff0c;白到看不清楚这行的字&#xff0c;更不知道写的是什么&#xff0c;写到哪了&#xff0c;这还是挺烦人的&#xff0c;其他都挺正常的。 问题分析 目前来看有两个原因&#xff1a; 1、…

【新版vscode配置自动补全括号】

vscode新版配置自动补全括号方法 新版配置方法(Pylance) ①设置 -> 扩展 -> Pylance -> 将 python.analysis.completeFunctionParens 下方的选项打勾 ②直接在settings.json中添加"python.analysis.completeFunctionParens": true