linux fuse是什么
在Linux中,fuse是指用户态文件系统,是用于支持用户空间文件系统的内核模块;fuse是一个实现在用户空间的文件系统框架,通过FUSE内核模块的支持,使用者只需要根据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。
FUSE 库负责和内核空间的通信,它接收来自/dev/fuse 的请求,并将其转化为一系列的函数调用,并将结果写回到/dev/fuse。
FUSE运行结构图
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
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
4.fuse_conn的connected字段用于表示连接的状态,成功挂载后为1,当文件系统被卸载,连接被中断或是设备驱动被释放后,该字段为0,此时这个connection(挂载的文件系统)不能提供正常服务。在fuse_request_send中会检查该字段,只有连接正常fuse文件系统才会发送请求。
5.fuse中每个请求用一个fuse_req
6.每个fuse的输入、输出参数都支持三个参数,见fuse_in、fuse_out结构的定义
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中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

CentOS 和 Ubuntu 的关键差异在于:起源(CentOS 源自 Red Hat,面向企业;Ubuntu 源自 Debian,面向个人)、包管理(CentOS 使用 yum,注重稳定;Ubuntu 使用 apt,更新频率高)、支持周期(CentOS 提供 10 年支持,Ubuntu 提供 5 年 LTS 支持)、社区支持(CentOS 侧重稳定,Ubuntu 提供广泛教程和文档)、用途(CentOS 偏向服务器,Ubuntu 适用于服务器和桌面),其他差异包括安装精简度(CentOS 精

CentOS 已停止维护,替代选择包括:1. Rocky Linux(兼容性最佳);2. AlmaLinux(与 CentOS 兼容);3. Ubuntu Server(需要配置);4. Red Hat Enterprise Linux(商业版,付费许可);5. Oracle Linux(与 CentOS 和 RHEL 兼容)。在迁移时,考虑因素有:兼容性、可用性、支持、成本和社区支持。

CentOS 安装步骤:下载 ISO 映像并刻录可引导媒体;启动并选择安装源;选择语言和键盘布局;配置网络;分区硬盘;设置系统时钟;创建 root 用户;选择软件包;开始安装;安装完成后重启并从硬盘启动。

如何使用 Docker Desktop?Docker Desktop 是一款工具,用于在本地机器上运行 Docker 容器。其使用步骤包括:1. 安装 Docker Desktop;2. 启动 Docker Desktop;3. 创建 Docker 镜像(使用 Dockerfile);4. 构建 Docker 镜像(使用 docker build);5. 运行 Docker 容器(使用 docker run)。

Docker利用Linux内核特性,提供高效、隔离的应用运行环境。其工作原理如下:1. 镜像作为只读模板,包含运行应用所需的一切;2. 联合文件系统(UnionFS)层叠多个文件系统,只存储差异部分,节省空间并加快速度;3. 守护进程管理镜像和容器,客户端用于交互;4. Namespaces和cgroups实现容器隔离和资源限制;5. 多种网络模式支持容器互联。理解这些核心概念,才能更好地利用Docker。

VS Code 系统要求:操作系统:Windows 10 及以上、macOS 10.12 及以上、Linux 发行版处理器:最低 1.6 GHz,推荐 2.0 GHz 及以上内存:最低 512 MB,推荐 4 GB 及以上存储空间:最低 250 MB,推荐 1 GB 及以上其他要求:稳定网络连接,Xorg/Wayland(Linux)

Docker镜像构建失败的故障排除步骤:检查Dockerfile语法和依赖项版本。检查构建上下文中是否包含所需源代码和依赖项。查看构建日志以获取错误详细信息。使用--target选项构建分层阶段以识别失败点。确保使用最新版本的Docker引擎。使用--t [image-name]:debug模式构建镜像以调试问题。检查磁盘空间并确保足够。禁用SELinux以防止干扰构建过程。向社区平台寻求帮助,提供Dockerfile和构建日志描述以获得更具体的建议。

Docker 进程查看方法:1. Docker CLI 命令:docker ps;2. Systemd CLI 命令:systemctl status docker;3. Docker Compose CLI 命令:docker-compose ps;4. Process Explorer(Windows);5. /proc 目录(Linux)。