[转帖]Linux fuse用户态文件系统及其libfuse
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/
[转帖]Linux fuse用户态文件系统及其libfuse的更多相关文章
- 用户态文件系统fuse学习【转】
本文转载自:https://blog.csdn.net/ty_laurel/article/details/51685193 FUSE概述 FUSE(用户态文件系统)是一个实现在用户空间的文件系统框架 ...
- BlueStore-先进的用户态文件系统《二》-BlueFS
https://zhuanlan.zhihu.com/p/46362124 简介 上一篇文章中,介绍了BlueStore的诞生背景.逻辑架构以及设计思想,提到了在BlueStore中元数据都是存放在R ...
- FUSE 用户空间文件系统 (Filesystem in Userspace)
FUSE 仓库 Wiki FUSE 性能评测 关于Fuse文件系统: FUSE (Filesystem in Userspace) is an interface for userspace prog ...
- linux之用户态和内核态
一. Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程 ...
- linux内核--用户态内存管理
在上一篇博客“内核内存管理”中,描述的内核内存管理的相关算法和数据结构,在这里简单描述用户态内存管理的数据结构和算法. 一,相关结构体 与进程地址空间相关的全部信息都包含在一个叫做“内存描述符”的数据 ...
- Linux对用户态的动态内存管理
Linux对内核态内存分配请求与用户态内存分配请求处理上分别对待 Linux本身信任自己,因此Linux内核请求分配多少内存,就会马上分配相同数量的内存出来. 但内核本身不相信应用程序,而且通常应用程 ...
- [转帖]Linux超级用户root口令忘记怎么办?
Linux超级用户root口令忘记怎么办? 2010-05-10 12:15:00 monkey_d_meng 阅读数 5535 收藏 更多 分类专栏: Linux 版权声明:本文为博主原创文章 ...
- BlueStore-先进的用户态文件系统《一》
https://zhuanlan.zhihu.com/p/45084771 分布式存储系统通过将数据分散到多台机器上来充分利用多台机器的资源提高系统的存储能力,每台机器上的数据存放都需要本地的单机存储 ...
- Linux探秘之用户态与内核态
一. Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程 ...
- 用户态Linux内核
User Mode Linux 是可以在用户态启动的 Linux版本,最新版linux内核已提供了支持.这使我们能在类似 OpenVZ 虚拟化技术的系统上,使用最新的 Linux 内核:并且可以在非 ...
随机推荐
- Rabin-Karp 字符串查找算法
和一般的比较字符串的方式不同,Rabin-Karp 查找算法通过对子字符串进行 hash,如果在原有字符串中找到了 hash 值相同的字符串,那么继续比较是否是需要查找的字串,一般来讲,如果 hash ...
- 动态规划问题(三)最长递增子序列长度(LIS)
问题描述 有一个数组,它内部的顺序是乱序的,现在要求你找出该数组中的最长的递增子序列长度. 例如:对于数组 {10, 20, 9, 33, 21, 50, 41, 60, 80},它的最长递增 ...
- 性能提升1400+倍,快来看MySQL Volcano模型迭代器的谓词位置优化详解
摘要:性能提升1400+倍,快来看MySQL Volcano模型迭代器的谓词位置优化详解. 本文分享自华为云社区<华为云数据库内核专家为您揭秘MySQL Volcano模型迭代器性能提升千倍的秘 ...
- 在springboot中,如何读取配置文件中的属性
摘要:在比较大型的项目的开发中,比较经常修改的属性我们一般都是不会在代码里面写死的,而是将其定义在配置文件中,之后如果修改的话,我们可以直接去配置文件中修改,那么在springboot的项目中,我们应 ...
- 初探语音识别ASR算法
摘要:语音转写文字ASR技术的基本概念与数学原理简介. 本文分享自华为云社区<新手语音入门(三): 语音识别ASR算法初探 | 编码与解码 | 声学模型与语音模型 | 贝叶斯公式 | 音素> ...
- 原来的 service 命令与 systemctl 命令对比
service [服务] start systemctl start [unit type] 启动服务 #启动网络服务 systemctl start network.servicese ...
- 多智能体协同控制研究中光学动作捕捉与UWB定位技术比较
人类在进行任何工作时,总是强调团队合作,teamwork.随着控制科学.计算机科学等多学科的交叉发展与融合,在智能体控制领域,对于单个机器人,无人机,无人车的控制已经不能满足现在领域的技术需求,从而和 ...
- Apollo系列之架构设计(一)
原创文章,转载请标注.https:https://www.cnblogs.com/boycelee/p/17967590 目录 一.什么是配置中心? 二.传统配置有什么问题? 三.配置中心的场景 四. ...
- ME5A报表增强
一.ME5A报表新增长文本字段 结构中添加字段 在该方法下添加对应的取值逻辑 二.ME5A点击科目分配按钮界面添加字段 结构中添加字段 对应位置写取值逻辑 定期更文,欢迎关注 TRANSLATE wi ...
- Problem 1342B - Binary Period (思维)
AC代码: #include<bits/stdc++.h> using namespace std; int main() { //freopen("in.txt", ...