https://www.jianshu.com/p/abc5524ac18c

为什么要有用户态文件系统

VFS文件系统可知文件系统在内核态的,应用程序操作文件,统一调用内核态的VFS层抽象接口。

突然有一天有一个和文件系统有关的需求,要编写一个特定功能的文件系统,不管是代码编写还是调试都不太方便,就算是仅仅在现有传统文件系统上添加一个小小的功能,在内核中实现仍需要做很大的工作量。

怎么解决这个问题呢?既然内核态开发和调试都不方便且耗费工作量,能不能在用户态实现一个易维护易调试的文件系统呢?

FUSE (Filesystem in Userspace) 用户态文件系统应运而生,不像其他内核态文件系统,编写FUSE文件系统时,只需要内核加载fuse模块,不需要重新编译内核。

FAQ:内核态文件系统如何开发新功能呢?如何繁琐如何不易调试?

什么是用户态文件系统fuse

用户态文件系统指一个文件系统的data和metadata都是由用户态的进程提供的(这种进程被称为"daemon")。

虽然是用户态的文件系统,但并不是说不需要内核的参与。因为Linux中对文件的访问都是统一通过VFS层提供的内核接口进行的(比如open/read),因此一个进程(称为"user")访问由daemon实现的文件系统时,依然经过VFS。

当VFS接到user进程对文件的访问请求,根据mount type判断出该文件属于某个用户态文件系统,如果访问用户态文件系统则将这个请求转交给一个名为"fuse"的内核模块。而后"fuse"模块将该请求转换为和daemon之间约定的协议格式,传送给daemon进程。

 

红框的部分是FUSE用户态文件系统的具体实现,也是用户态文件系统的设计者可以发挥的空间。

生成设备节点的目的是方便用户态的控制,但是对于文件系统这种级别的应用来说,直接使用ioctl() 来访问设备还是显得麻烦,因为呈现了太多的细节。怎么解决这个问题?libfuse作为一个中间层应运而生,daemon进程实际上是通过libfuse提供的接口来操作fuse设备文件的。

缺点:在fuse文件系统中,即便执行一个相对简单的"touch"操作,所涉及的用户态和内核态的切换都是比较频繁的,并且还伴随着多次的数据拷贝。相比于传统的内核文件系统,它整体的I/O吞吐量更低,而延迟也更大。

fuse包括fuse内核模块和libfuse用户态lib库两部分,libfuse提供接口和fuse内核模块通信。libfuse provides functions to mount  the file system, unmount it, read requests  from the kernel, and send responses back.  libfuse offers two APIs: a "high-level",  synchronous API(同步), and a "low-level"  asynchronous API(异步). In both cases,  incoming requests from the kernel are  passed to the main program using  callbacks. When using the high-level API,  the callbacks may work with file names and paths instead of inodes, and processing of a request finishes when the callback  function returns. When using the low-level API, the callbacks must work with  inodes and responses must be sent  explicitly using a separate set of API  functions.

采用本地挂载的方式(假设本机的"dir-src"目录位于ext4文件系统):sshfs  localhost:<dir-src> <dir-dst>

当daemon进程收到请求后,它需要再次进入内核,去访问ext4的内核模块(这种文件系统模式被称为"stackable"的):

 

以user进程向fuse文件系统发出 write() 请求为例,右边红框部分是一次原生的ext4调用路径,而左边多出来的就是因为引入fuse后增加的路径:

 

如何使用用户态文件系统fuse

通过Python使用下fuse吧(待实践):

https://github.com/libfuse/python-fuse

API在README.new_fusepy_api有描述,只是信息描述,不做参考,除此之外查看.examples和实际代码。

 

参考

LinuxFUSE(用户态文件系统)的使用:用libfuse创建FUSE文件系统

https://github.com/libfuse/libfuse/

用户态文件系统-FUSE

用户态文件系统fuse学习

[转帖]Linux fuse用户态文件系统及其libfuse的更多相关文章

  1. 用户态文件系统fuse学习【转】

    本文转载自:https://blog.csdn.net/ty_laurel/article/details/51685193 FUSE概述 FUSE(用户态文件系统)是一个实现在用户空间的文件系统框架 ...

  2. BlueStore-先进的用户态文件系统《二》-BlueFS

    https://zhuanlan.zhihu.com/p/46362124 简介 上一篇文章中,介绍了BlueStore的诞生背景.逻辑架构以及设计思想,提到了在BlueStore中元数据都是存放在R ...

  3. FUSE 用户空间文件系统 (Filesystem in Userspace)

    FUSE 仓库 Wiki FUSE 性能评测 关于Fuse文件系统: FUSE (Filesystem in Userspace) is an interface for userspace prog ...

  4. linux之用户态和内核态

    一. Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程 ...

  5. linux内核--用户态内存管理

    在上一篇博客“内核内存管理”中,描述的内核内存管理的相关算法和数据结构,在这里简单描述用户态内存管理的数据结构和算法. 一,相关结构体 与进程地址空间相关的全部信息都包含在一个叫做“内存描述符”的数据 ...

  6. Linux对用户态的动态内存管理

    Linux对内核态内存分配请求与用户态内存分配请求处理上分别对待 Linux本身信任自己,因此Linux内核请求分配多少内存,就会马上分配相同数量的内存出来. 但内核本身不相信应用程序,而且通常应用程 ...

  7. [转帖]Linux超级用户root口令忘记怎么办?

    Linux超级用户root口令忘记怎么办? 2010-05-10 12:15:00 monkey_d_meng 阅读数 5535  收藏 更多 分类专栏: Linux   版权声明:本文为博主原创文章 ...

  8. BlueStore-先进的用户态文件系统《一》

    https://zhuanlan.zhihu.com/p/45084771 分布式存储系统通过将数据分散到多台机器上来充分利用多台机器的资源提高系统的存储能力,每台机器上的数据存放都需要本地的单机存储 ...

  9. Linux探秘之用户态与内核态

    一. Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程 ...

  10. 用户态Linux内核

    User Mode Linux 是可以在用户态启动的 Linux版本,最新版linux内核已提供了支持.这使我们能在类似 OpenVZ 虚拟化技术的系统上,使用最新的 Linux 内核:并且可以在非 ...

随机推荐

  1. 在xml中比较运算符

    SQL 中,可以使用比较运算符来比较两个值,如使用小于运算符 < 比较两个值大小.但是,在 SQL 查询中,有时候需要将小于运算符 < 用于 XML 或 HTML 语法中,这会导致语法冲突 ...

  2. root无法下载

    在 Linux 中,root 用户已经拥有系统中的最高权限.然而,如果你需要确保 root 用户具有所有权限,可以通过以下步骤来进行:(这是不对的) sudo chown -R root:root / ...

  3. 神经网络入门篇:激活函数的导数(Derivatives of activation functions)

    激活函数的导数 在神经网络中使用反向传播的时候,真的需要计算激活函数的斜率或者导数.针对以下四种激活,求其导数如下: 1)sigmoid activation function 图1.8.1 其具体的 ...

  4. 如何用华为云ModelArts平台玩转Llama2

    本文分享自华为云社区<如何用华为云ModelArts平台玩转Llama2>,作者:码上开花_Lancer. 天哪~~ Llama2模型开源了拉!! Llama2不仅开源了预训练模型,而且还 ...

  5. CPU高速缓存与极性代码设计

    摘要:CPU内置少量的高速缓存的重要性不言而喻,在体积.成本.效率等因素下产生了当今用到的计算机的存储结构. 介绍 cpu缓存的结构 缓存的存取与一致 代码设计的考量 最后 CPU频率太快,其处理速度 ...

  6. 教你用Python 编写 Hadoop MapReduce 程序

    摘要:Hadoop Streaming 使用 MapReduce 框架,该框架可用于编写应用程序来处理海量数据. 本文分享自华为云社区<Hadoop Streaming:用 Python 编写 ...

  7. “/usr/bin/hdp-select”, line 226 print “ERROR: Invalid package – “ + name ^ SyntaxError: Missing parentheses in call to ‘print’. Did you mean print(“ERROR: Invalid package

    spark-submit时报错 python升级3.7引起 恢复2.7正常

  8. 基于迁移学习的基础设施成本优化框架,火山引擎数智平台与北京大学联合论文被KDD收录

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   基于迁移学习的基础设施成本优化框架,火山引擎数智平台与北京大学联合论文被KDD收录 近期,第29届国际知识发现 ...

  9. Solon 运行出乱码怎么办?

    1.启动时添加 -Dfile.encoding=utf-8,示例: java -Dfile.encoding=utf-8 -jar DemoApp.jar 再出现乱码?一般是文件本身编码问题.检查一下 ...

  10. Dependencies unknown

    Dependencies unknown 由父POM 托管 <properties> <boot-admin.version>2.3.0</boot-admin.vers ...