搜索
首页常见问题linux fuse是什么
linux fuse是什么Feb 28, 2023 am 09:59 AM
linux

在Linux中,fuse是指用户态文件系统,是用于支持用户空间文件系统的内核模块;fuse是一个实现在用户空间的文件系统框架,通过FUSE内核模块的支持,使用者只需要根据fuse提供的接口实现具体的文件操作就可以实现一个文件系统。

linux fuse是什么

本教程操作环境:linux7.3系统、Dell G3电脑。

fuse描述

linux fuse是什么

Linux用于支持用户空间文件系统的内核模块名叫FUSE,FUSE一词有时特指Linux下的用户空间文件系统。

是一个通用操作系统重要的组成部分。传统上操作系统在内核层面上对文件系统提供支持。而通常内核态的代码难以调试,生产率较低。

Linux从2.6.14版本开始通过FUSE模块支持在用户空间实现文件系统。

在用户空间实现文件系统能够大幅提高生产率,简化了为操作系统提供新的文件系统的工作量,特别适用于各种虚拟文件系统和网络文件系统。上述ZFS和glusterfs都属于网络文件系统。但是,在用户态实现文件系统必然会引入额外的内核态/用户态切换带来的开销,对性能会产生一定影响。

fuse主要作用:监控某个文件或者文件夹的变化,可以对其他进程在此文件夹或者文件中写入或者读取的东西增加自定义信息。

总结:

 FUSE (用户态文件系统)是一个实现在用户空间的文件系统框架,通过 FUSE内核模块的支持,使用者只需要根据 fuse 提供的接口实现具体的文件操作就可以实现一个文件系统。

fuse的组成及以及功能实现

        FUSE 由三个部分组成,FUSE 内核模块,FUSE 库以及一些挂在工具。FUSE 内核模块实现了和 VFS 的对接,它看起来像一个普通的文件系统模块,另外 FUSE 内核模块实现了一个可以被用户空间进程打开的设备,当 VFS 发来文件操作请求之后,它将该请求转化为特定格式,并通过设备传递给用户空间进程,用户空间进程在处理完请求后,将结果返回给 FUSE 内核模块,内核模块再将其还原为Linux Kernel 需要的格式,并返回给 VFS。

1.png

         FUSE 库负责和内核空间的通信,它接收来自/dev/fuse 的请求,并将其转化为一系列的函数调用,并将结果写回到/dev/fuse。

FUSE运行结构图

2.png

fuse库接口

struct fuse_operations {

        int (*getattr) (const char *, struct stat *, struct fuse_file_info *fi);

        int (*readlink) (const char *, char *, size_t);

        int (*mknod) (const char *, mode_t, dev_t);

        int (*mkdir) (const char *, mode_t);

        int (*unlink) (const char *);

        int (*rmdir) (const char *);

        int (*symlink) (const char *, const char *);

        int (*rename) (const char *, const char *, unsigned int);

        int (*link) (const char *, const char *);

        int (*chmod) (const char *, mode_t, struct fuse_file_info *fi);

        int (*chown) (const char *, uid_t, gid_t, struct fuse_file_info *fi);

        int (*truncate) (const char *, off_t, struct fuse_file_info *fi);

        int (*open) (const char *, struct fuse_file_info *);

        int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *);

        int (*write) (const char *, const char *, size_t, off_t, struct fuse_file_info *);

        int (*statfs) (const char *, struct statvfs *);

        int (*flush) (const char *, struct fuse_file_info *);

        int (*release) (const char *, struct fuse_file_info *);

        int (*fsync) (const char *, int, struct fuse_file_info *);

        int (*setxattr) (const char *, const char *, const char *, size_t, int);

        int (*getxattr) (const char *, const char *, char *, size_t);

        int (*listxattr) (const char *, char *, size_t);

        int (*removexattr) (const char *, const char *);

        int (*opendir) (const char *, struct fuse_file_info *);

        int (*readdir) (const char *, void *, fuse_fill_dir_t, off_t,

        struct fuse_file_info *, enum fuse_readdir_flags);

        int (*releasedir) (const char *, struct fuse_file_info *);

        int (*fsyncdir) (const char *, int, struct fuse_file_info *);

        void (init) (struct fuse_conn_info *conn,struct fuse_config *cfg);

        void (*destroy) (void *);

        int (*access) (const char *, int);

        int (*create) (const char *, mode_t, struct fuse_file_info *);

        int (*lock) (const char *, struct fuse_file_info *, int cmd,struct flock *);

        int (*utimens) (const char *, const struct timespec tv[2], struct fuse_file_info *fi);

        int (*bmap) (const char *, size_t blocksize, uint64_t *idx);

        int (*ioctl) (const char *, int cmd, void *arg,

        struct fuse_file_info *, unsigned int flags, void *data);

        int (*poll) (const char *, struct fuse_file_info *,

        struct fuse_pollhandle *ph, unsigned *reventsp);

        int (*write_buf) (const char *, struct fuse_bufvec *buf, off_t off,struct fuse_file_info *);

        int (*read_buf) (const char *, struct fuse_bufvec **bufp,

        size_t size, off_t off, struct fuse_file_info *);

        int (*flock) (const char *, struct fuse_file_info *, int op);

        int (*fallocate) (const char *, int, off_t, off_t,struct fuse_file_info *);

};

fuse库编译

1.安装:

(1)./configure --prefix=/usr

(2)make

(3)make install

2.加载驱动

 加载fuse.ko模块“modprobe fuse”,然后在切换到example目录下编译fusexmp.c

内核源码解析

        内核源码在:内核源码/fs/fuse

3.png

     1.fuse内核模块被加载时,以下初始化例程会被调用,见fuse_init函数

        (1)fuse_fs_init(); 注册fuse文件系统,创建fuse_inode高速缓存。

        (2)fuse_dev_init(); 创建fuse_req高速缓存,加载fuse设备驱动,用于用户空间与内核空间交换信息。

        (3)fuse_sysfs_init(); 在/sys/fs目录下增加fuse节点,在fuse节点下增加connections节点。

        (4)fuse_ctl_init(); 注册fuse控制文件系统

        2.fuse内核模块被卸载时,执行对应的清理工作,见fuse_exit函数

        (1)fuse_ctl_cleanup(); 注销fuse控制文件系统

        (2)fuse_sysfs_cleanup(); 移除fuse、connections节点。

        (3)fuse_fs_cleanup(); 注销fuse文件系统,释放fuse_inode高速缓存。

        (4)fuse_dev_cleanup(); 注销fuse设备驱动程序,释放fuse_req高速缓存。

        3. fuse_conn代表一个fuse连接,当用户文件系统被挂载时生成该结构,当文件系统被卸载时释放该结构,其主要用于管理各个请求队列,内核会为所有挂载的文件系统维护一个fuse_conn的链表(fuse文件系统可能会被挂载多次)。

        4.fuse_conn的connected字段用于表示连接的状态,成功挂载后为1,当文件系统被卸载,连接被中断或是设备驱动被释放后,该字段为0,此时这个connection(挂载的文件系统)不能提供正常服务。在fuse_request_send中会检查该字段,只有连接正常fuse文件系统才会发送请求。        

        5.fuse中每个请求用一个fuse_req的结构表示,该结构中包含fuse请求的输入输出参数,请求对象的inode、file等。

        6.每个fuse的输入、输出参数都支持三个参数,见fuse_in、fuse_out结构的定义,参数以<*value, size>的形式传递,当填充fuse_req结构时,根据请求类型,以及请求参数,设置fuse_in的参数个数(numargs),并将参数填充到args数组中,同时设置fuse_out输出参数的个数,并将存放输出结果的地址(局部变量outarg)填充到args数组中。

        7.当fuse文件系统设置好请求输入输出参数之后,所有接口最后都会调用fuse_request_send将代表本次请求的fuse_req结构的状态标志设置为FUSE_REQ_PENDING,将请求加到fuse_conn的pending链表中,并调用request_wait_answer等待请求完成(等待队列被唤醒后,需要检查请求状态是否为FUSE_REQ_FINISHED)。当本次请求被响应后,结果已经被存放在局部变量outarg中,fuse进行相应的处理即可向上层返回结果。

        8.每个请求fuse_req结构中包含一个wait_queue_head_t的waitq字段,每个请求在被发出之后,它首先会唤醒fuse_conn的waitq等待队列,告诉用户态守护进程有请求达到;然后其会调用wait_event_interruptible在req的waitq上睡眠等待FUSE_REQ_FINISHED条件变为真。

        9.fuse设备驱动是一个简单块设备驱动程序,用于fuse在用户态和内核态之间交换数据,fuse包含一个用户空间的守护程序,其一直循环运行,主要任务是调用read从fuse设备上读取请求,当没有请求时,它会在fuse_conn的waitq上睡眠等待(对应上一段中请求发出后唤醒fuse_conn的waitq等待队列),当有请求是其从fuse_conn的pengding队列中取出最前的一个请求(对应上一段中请求发出后加到fuse_conn的pending链表),并将该请求移动到processing队列中,守护进程将fuse_req的相关信息读到用户态后,根据请求表示调用用户态实现的回调函数,并将结果通过fuse_dev_write写到fuse设备驱动,用户态请求完成后,从processing队列中找到对应的fuse_req,将结果拷贝到fuse_req的out参数中,并将fuse_req的state设置为FUSE_REQ_FINISHED,然后唤醒fuse_req的waitq。此时,fuse_req被处理完毕,fuse文件系统向上层返回。

相关推荐:《Linux视频教程

以上是linux fuse是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
什么是linux设备节点什么是linux设备节点Apr 18, 2022 pm 08:10 PM

linux设备节点是应用程序和设备驱动程序沟通的一个桥梁;设备节点被创建在“/dev”,是连接内核与用户层的枢纽,相当于硬盘的inode一样的东西,记录了硬件设备的位置和信息。设备节点使用户可以与内核进行硬件的沟通,读写设备以及其他的操作。

Linux中open和fopen的区别有哪些Linux中open和fopen的区别有哪些Apr 29, 2022 pm 06:57 PM

区别:1、open是UNIX系统调用函数,而fopen是ANSIC标准中的C语言库函数;2、open的移植性没fopen好;3、fopen只能操纵普通正规文件,而open可以操作普通文件、网络套接字等;4、open无缓冲,fopen有缓冲。

linux怎么判断pcre是否安装linux怎么判断pcre是否安装May 09, 2022 pm 04:14 PM

在linux中,可以利用“rpm -qa pcre”命令判断pcre是否安装;rpm命令专门用于管理各项套件,使用该命令后,若结果中出现pcre的版本信息,则表示pcre已经安装,若没有出现版本信息,则表示没有安装pcre。

linux中什么叫端口映射linux中什么叫端口映射May 09, 2022 pm 01:49 PM

端口映射又称端口转发,是指将外部主机的IP地址的端口映射到Intranet中的一台计算机,当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上;可以通过使用动态或固定的公共网络IP路由ADSL宽带路由器来实现。

linux中eof是什么linux中eof是什么May 07, 2022 pm 04:26 PM

在linux中,eof是自定义终止符,是“END Of File”的缩写;因为是自定义的终止符,所以eof就不是固定的,可以随意的设置别名,linux中按“ctrl+d”就代表eof,eof一般会配合cat命令用于多行文本输出,指文件末尾。

linux怎么查询mac地址linux怎么查询mac地址Apr 24, 2022 pm 08:01 PM

linux查询mac地址的方法:1、打开系统,在桌面中点击鼠标右键,选择“打开终端”;2、在终端中,执行“ifconfig”命令,查看输出结果,在输出信息第四行中紧跟“ether”单词后的字符串就是mac地址。

手机远程linux工具有哪些手机远程linux工具有哪些Apr 29, 2022 pm 05:30 PM

手机远程linux工具有:1、JuiceSSH,是一款功能强大的安卓SSH客户端应用,可直接对linux服务进行管理;2、Termius,可以利用手机来连接Linux服务器;3、Termux,一个强大的远程终端工具;4、向日葵远程控制等等。

linux中lsb是什么意思linux中lsb是什么意思May 07, 2022 pm 05:08 PM

linux中,lsb是linux标准基础的意思,是“Linux Standards Base”的缩写,是linux标准化领域中的标准;lsb制定了应用程序与运行环境之间的二进制接口,保证了linux发行版与linux应用程序之间的良好结合。

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版