一篇文综合分析Fuse!

news2024/11/17 13:50:51

FUSE需求

究竟什么样的需求才能用到用户文件系统?

来看一个小例子:

需求是这样的。在deepin的安装器中,安装器就会给多分出一个分区:数据盘。

数据盘的主要作用是让用户存放数据文件,也就是以前用Windows的时候D盘或者E盘等的作用,放点图片、视频资源等。用户重装系统的时候,也可以方便的做数据迁移。这个数据盘大概隐含隐性需求:

  1. 文件权限不要太严格;

$ setfacl -d -m "g:sudo:rwx" /xxx
$ setfacl -m "g:sudo:rwx" /xxx

主要差别体现在ACL规则的继承上面,上面一句默认继承

Linux(可能其他系统也是)对ACL的处理有点奇怪,假如在拥有ACL规则的对象(文件或者文件夹)上进行chmod操作,那么chmod 会对对象的ACL规则造成影响,影响的结果就是对象虽然有ACL规则,但是ACL的有效值会变成chmod要达成的效果。

$ getfacl testacl              
# file: testacl
# owner: hualet
# group: hualet                 #chmod 700 testacl
user::rwx
group::r--                      #effective:---
group:sudo:rwx                  #effective:---
mask::---
other::---

造成的问题:系统里面的A用户放在数据盘里面的文件B用户怎么无法访问

FUSE(Filesystem in Userspace)就是用户空间的文件系统,它的出现让非内核开发者开发自己的文件系统成为可能,非特权用户不需要获取特权就可以挂载自己的文件系统。对于开发者来说,FUSE更多是一个开发框架,用来开发和实现用户空间系统,这个框架主要分为三个部分:内核模块、libfuse和文件系统守护进程,它们之间的关系如下图所示:

图中的./hello就是文件系统守护进程,/tmp/fuse则是这个文件系统的挂载点。文件系统工作在用户空间,通过libfuse跟内核中的FUSE模块进程通信,代理所有用户对挂载点内文件的访问请求,从而实现特殊的文件系统功能需求。

举个例子,sshfs就是一种用户空间文件系统,用来将ssh服务器上的一个文件夹挂载到本地使用。它的使用方式特别简单,只需执行命令:sshfs [user@]host:[dir] mountpoint,这样你在mountpoint下看到的文件的文件就是你ssh服务器上相应文件夹的文件,你再本地做得修改也都会在你的ssh服务器上体现出来。

因为libfuse使用起来非常方便,所以有不少有意思的文件系统都是基于FUSE完成的(见FUSE Filesystems)。类似上面的sshfs可能更像是开发者的一个玩具,但是FUSE家族也不缺乏一些重量级的文件系统,像ZFS和NTFS等也是基于FUSE实现的。这么说并不是在FUSE完美无瑕,实际上很多人批评FUSE的性能比较差,据To FUSE or Not to FUSE: Performance of User-Space File Systems这篇论文测算,FUSE文件系统在吞吐量上比原生的文件系统要低83%,而CPU占用则要高31%。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

Extfuse提出背景

 

EXTFUSE与现有的用户文件系统框架协同工作,允许快速路径和现有的慢速路径共存,而不会对目标用户文件系统的设计进行重大更改

fuse 文件挂载的小例子:

Fuse 包含两个部分 - kernel 和用户态 daemon。内核部分是一个 Linux 的内核模块,它会在 Linux 的 VFS 上面注册一个 Fuse 的文件系统驱动。这个 Fuse 驱动可以认为是一个 proxy,会将请求给转发到后面的用户态 daemon 上面。

Fuse 内核模块也会注册一个 /dev/fuse 的块设备,这个就是 kernel 和用户态 daemon 交互的接口。通常 Daemon 会从 /dev/fuse 上面读取到 Fuse 的请求,处理并且将数据写回到 /dev/fuse。一个简单的 Fuse 流程如下:

  • 应用程序在挂载的 Fuse 的文件系统上面进行操作。
  • VFS 会将操作转发到 Fuse 的 kernel driver 上面。
  • Fuse 的 kernel driver 分配一个 request,并且将这个 request 提交到 Fuse 的 queue 上面。
  • Fuse 的用户态 daemon 会从 queue 里面通过读取 /dev/fuse 将这个 request 取出来并且处理。这里需要注意,处理 request 的时候仍然可能进入 kernel,譬如可能将 request 发到 Ext4 去实际处理。
  • 当请求处理完毕,Daemon 会将结果写回到 /dev/fuse。
  • Fuse 的 kernel 标记这个 request 结束,然后唤醒用户应用程序。

EXTFUSE由三个组件组成。首先是一个帮助器用户库,它提供了一组熟悉的文件系统API来注册扩展并实现C语言子集的定制快速路径功能。其次,包装器(no-op)插入驱动程序,该驱动程序与低级VFS接口连接,并提供必要的支持,以便根据需要将请求转发到已注册的内核扩展以及较低的文件系统。第三,安全地执行扩展的内核内的虚拟机(VM)运行时。

慢速路径:开销大,红色的切换

快速路径:开销小,迅速切换

工作流程:

1.挂载阶段:在挂载用户文件系统时,FUSE驱动程序向用户空间守护进程发送FUSE_INIT请求。(1&&4)

2.用户守护进程通过在请求参数中查找FUSE_CAP_EXTFUSE标志来检查操作系统内核是否支持EXTFUSE框架。如果支持,守护程序必须调用libExtFUSE init API将包含专用处理程序(扩展)的eBPF程序加载到内核中,并将其注册到EXTFUSE驱动程序。这是使用bpf_Load_prog系统调用来实现的,该系统调用eBPF验证器来检查扩展的完整性。

复现进度

extfuse已完成,开始SandFs

接下来的计划

全过程追踪(就是把extfuse的路程图与代码对应起来)

1.Extfuse Library:extfuse/src at master · extfuse/extfuse · GitHub

2.Modified:ExtFUSE: Extension Framework for FUSE · extfuse/linux@b7923d6 · GitHub

3.libfuse: Add support for detecting/enabling ExtFUSE · extfuse/libfuse@7c88efb · GitHub

Comparing libfuse:master...extfuse:ExtFUSE-1.0 · libfuse/libfuse · GitHub

性能分析(论文中提到了很多性能的对比)

1.可以尝试将eBPF开源项目中已有的文件性能测试相关的代码单独抽取出来做demo

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

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

相关文章

YoloV7

总体来说,YoLoV7主要可分为主干特征提取网络(backbone),加强特征提取网络以及SPPCSPC三个部分,然后再加上RepConv和YoLoHead部分。输入图片640*640*3的RGB图片,然后卷积、标准化(BN)…

QT学习笔记-QT多项目系统中如何指定各项目的编译顺序

QT学习笔记-QT多项目系统中如何指定各项目的编译顺序背景环境解决思路具体操作背景 为了更好的复用程序功能以及更优雅的管理程序,有经验的程序员通常要对程序进行分层和模块化设计。在QT/C这个工具中同样可以通过创建子项目的方式对程序进行模块化,在这…

浅谈Linux下的shell--BASH

环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹shell的概念与作用我们已经学习并知道了操作系统实际上就是一款软件,一款用来管理计算机软硬件资源,为用户提供良好的执行环境的…

擎创喜报 | 名单公布!恭喜入选!

前言:企业数字化转型作为一种经营策略,指的是利用数字技术和数字化流程来改变企业的运营、管理、销售和服务方式,以适应数字化时代的发展趋势。一般来说,企业进行数字化出于以下几点考虑。提高效率:数字化改进了业务流…

人口老龄化背景下家政服务网络平台【附源码】

1 毕业论文(设计)版权使用授权书 本毕业论文(设计)作者同意学校保留并向国家有关部门或机构送交论文(设计)的复印件和电子版,允许论文(设计)被查阅和借阅。本人授权广西…

JAVA中比较对象是否相等的方式是什么?为什么重写equals就一定要重写hashcode?百天百题(3/100)

目录 JAVA中比较对象是否相等的方式是什么? 为什么重写equals就一定要重写hashcode? JAVA中比较对象是否相等的方式是什么? 在了解这个问题之前需要先知道: 1.如果对象相同,那么hashcode是一定相同的。 2.对象不同的…

哈希表

文章目录什么是哈希问题引入哈希函数直接定址法除留余数法 (常用、重点)哈希冲突哈希冲突的解决方法闭散列开散列unordered_map && unordered_set 封装实现哈希的应用位图布隆过滤器哈希经典面试题哈希切分位图应用布隆过滤器什么是哈希 在上一…

阿里巴巴商品详情爬虫数据字段解析 源代码分享 调用示例

返回数据代码段1"item": {"num_iid": "60840463360","title": "Slip-on Daily Urban Walking Shoes","desc_short": "","price": "$47.70","nick": "cn1522808546p…

TypeScript深度剖析:TypeScript 中类的理解?应用场景?

一、是什么 类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础 类是一种用户定义的引用数据类型,也称类类型 传统的面向对象语言基本都是基于类的,JavaScript …

好友管理系统--课后程序(Python程序开发案例教程-黑马程序员编著-第4章-课后作业)

实例3:好友管理系统 如今的社交软件层出不穷,虽然功能千变万化,但都具有好友管理系统的基本功能,包括添加好友、删除好友、备注好友、展示好友等。下面是一个简单的好友管理系统的功能菜单,如图1所示。 图1 好友管理系…

api接口详解大全

api接口详解大全?优秀的设计是产品变得卓越的原因设计API意味着提供有效的接口,可以帮助API使用者更好地了解、使用和集成,同时帮助人们有效地维护它每个产品都需要使用手册,API也不例外在API领域,可以将设计视为服务器和客户端之…

【SpringCloud】SpringCloud教程之Nacos实战(三集群配置)

目录前言一.Nacos集群逻辑图二.Nacos集群搭建1.搭建数据库,初始化数据库表结构2.下载Nacos3.配置Nacos3.启动Nacos4.配置启动nginx5.测试是否成功6.设置服务的nacos地址7.新增一个配置,查看数据看是否进行持久化了前言 在我前面两篇讲的都是单个nacos&a…

Activity的启动和结束

onCreate:创建活动。此时会把页面布局加载进内存,进入了初始状态。onStart:开启活动。此时会把活动页面显示在屏幕上,进入了就绪状态。onResume:恢复活动。此时活动页面进入活跃状态,能够与用户正常交互&am…

Vulnhub系列:FristLeaks

一、配置靶机环境以往的靶机,本人是在virtual box中,去配置,和vm上的kali进行联动,但是这个靶机需要DHCP,以往的方式可能不太行了,或者可以在virtual box中桥接成统一网卡。下面介绍下本人最有用的方法&…

2021牛客OI赛前集训营-提高组(第三场) T4扑克

2021牛客OI赛前集训营-提高组(第三场) 题目大意 小A和小B在玩扑克牌游戏,规则如下: 从一副52张牌(没有大小王)的扑克牌中随机发3张到每个玩家手上,每个玩家可以任意想象另外两张牌&#xff0…

Allegro如何知道单个操作命令的拼写

Allegro如何知道单个操作命令的拼写 在用Allegro做PCB设计的时候,时常需要给某些命令设置一些快捷键,但是有时候无法知道命令的拼写是什么,就无法定义到env文件里面去 如下图 如何知道上方图标的命令拼写,下面介绍两种方法 方法一 鼠标左键移动到图标的位置,就会出现命令…

【动态规划】背包问题(01背包,完全背包)

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…

JavaWeb学习-Tomcat

常用的Web服务器 ①IIS:Microsoft的Web服务器产品为Internet Information Services (IIS),IIS 是允许在公共Intranet或Internet上发布信息的Web服务器。ⅡS是目前最流行的Web服务器产品之一,很多著名的网站都是建立在…

二进制转换之命理学习

什么是十神 运用儒家学说: 克我者官也:古代没有民主思想,官不是为民服务的,官就是克的。 对男命来说克我的是儿女,女儿是正官,儿子是偏官(七杀)克的厉害,对父亲来说有了…

图解七大排序算法,面试超高频考点,java实现

前言 排序算法在面试中属于超高频的考点了,至少要学会如何手写各种排序算法,其中快速排序尤为重要 看完了本文以后,大家可以自己尝试着去手写一下这些排序算法啦,leetcode题号:75颜色分类 多努力点,活的…