[转帖]Linux fuse用户态文件系统及其libfuse

linux,fuse,用户,文件系统,及其,libfuse · 浏览次数 : 0

小编点评

为了解决用户态文件系统开发新功能的困难,可以考虑以下几种方法: **1. 使用FUSE内核模块** FUSE内核模块可以简化用户态文件系统的开发,无需内核重新编译。它通过提供接口,使用户态进程可以直接访问内核态文件系统。 **2. 使用libfuse用户态lib库** libfuse用户态lib库可以封装FUSE内核模块,提供用户态文件系统接口。这样,用户态进程可以轻松使用FUSE内核模块,而无需直接与内核进行通信。 **3. 使用本地挂载** 本地挂载可以将内核态文件系统与本地文件系统连接起来。用户态进程可以直接访问本地文件系统,而内核态进程可以访问内核态文件系统。 **4. 使用Python库** Python库可以帮助用户态进程访问内核态文件系统。可以使用libfuse库封装FUSE内核模块,提供用户态文件系统接口。

正文

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相似的内容:

[转帖]Linux fuse用户态文件系统及其libfuse

https://www.jianshu.com/p/abc5524ac18c 为什么要有用户态文件系统 VFS文件系统可知文件系统在内核态的,应用程序操作文件,统一调用内核态的VFS层抽象接口。 突然有一天有一个和文件系统有关的需求,要编写一个特定功能的文件系统,不管是代码编写还是调试都不太方便,就

[转帖]s3fs

https://github.com/s3fs-fuse/s3fs-fuse s3fs allows Linux, macOS, and FreeBSD to mount an S3 bucket via FUSE(Filesystem in Userspace).s3fs makes you op

[转帖]使用S3F3在Linux实例上挂载Bucket

https://docs.jdcloud.com/cn/object-storage-service/s3fs S3F3是基于FUSE的文件系统,允许Linux 挂载Bucket在本地文件系统,S3fs能够保持对象原来的格式。使用S3F3可以把Bucket当成一个文件夹挂载到Linux系统内部,当成

[转帖]Linux 磁盘I/O 调度算法 说明

2022-08-23 13:031361转载Linux 1 Linux 4.0 IO协议栈框架图 I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判的角色。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。 Linux 4.0 IO协议栈框架图 I/O调度程序的总结 当向

[转帖]Linux中常见IO调度器

https://www.jianshu.com/p/3c16e39a005a 单队列调度算法多队列调度算法 deadline mqdeadlines cfq bfq noop none kyber 对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略 cfq: 这个名字是

[转帖]Linux 平台使用shc 工具加密shell 脚本

2021-08-03 20:4510030原创Linux 本文链接:https://www.cndba.cn/dave/article/4642 1 shc 工具说明 shell 脚本是常用脚本,运维中经常使用,但有时候在shell 脚本中会包含一些敏感的信息,比如密码或者特殊的参数,此时我们就可以

[转帖]Linux系统多网卡环境下的路由配置

https://www.cnblogs.com/connect/p/linux-static-route.html Linux下路由配置命令 1. 添加主机路由 route add -host 192.168.1.11 dev eth0 route add -host 192.168.1.12 gw

[转帖]linux命令行下如何格式化json并进行各种json处理操作

https://blog.csdn.net/penriver/article/details/122016563 有时需要在linux 的命令行下,需要查看json的内容或针对json进行各种操作,本文针对此进行梳理、总结。 在Linux系统下基于python json.tool可以格式化json,

[转帖]Linux grep、egrep使用命令详解

https://segmentfault.com/a/1190000040654123?utm_source=sf-similar-article grep egrep区别 grep 默认不支持扩展 但可以通过-E 选择来支持扩展正则egrep 支持扩展正则 关于正则与扩展正则的区别可以看我另一篇s

[转帖]Linux kill & Java shutdownhook

https://www.jianshu.com/p/8001a66d37c9 shutdown-hook 建议加上shutdown的钩子 如果程序出现了内存溢出crash 则现在代码是没有任何保护措施的 或者说运维不小心关闭了服务器等 或者运维不小心kill了游戏服务器进程等 无法避免kill -9