关注分享主机优惠活动
国内外VPS云服务器

linux fuse是什么意思?

本文主要讲解“linux fuse是什么意思”,感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。下面就让主机频道带你学习一下“linux fuse是什么意思”!

Linux用来支持用户空间文件系统的内核模块叫做FUSE。fuse的全称是“用户空间中的文件系统”,中文意思是“用户空间文件系统”。它指的是完全在用户模式下实现的文件系统。它用于在Linux中挂载一些网络空间,是通用操作系统的重要组成部分。

什么是linux fuse?

用户空间中的文件系统指的是完全以用户模式实现的文件系统。它是Linux中使用的一个模块,用于将一些网络空间(如SSH)挂载到本地文件系统。相关内容可以在SourceForge上找到。

Linux用来支持用户空间文件系统的内核模块叫做FUSE,FUSE这个词有时也指Linux下的用户空间文件系统。是通用操作系统的重要组成部分。传统上,操作系统在内核级支持文件系统。一般内核代码调试困难,生产率低。

所谓的“用户模式文件系统”是指文件系统的数据和元数据都是由用户模式进程提供的(这个进程称为“守护进程& quot)。对于微内核的操作系统来说,在用户态实现文件系统没什么,但是对于宏内核的Linux来说,意义就不一样了。

虽然被称为用户态文件系统,但并不意味着完全不需要内核的参与,因为在Linux中,对文件的访问是通过VFS层提供的内核接口(比如open/read)统一实现的,所以当一个进程(称为“user & quot当访问由daemon实现的文件系统时,您仍然需要访问VFS。

当VFS收到用户进程访问文件的请求并判断该文件属于用户模式文件系统(根据挂载类型)时,它会将请求转发到名为“fuse & quot的内核模块。然后,“保险丝& quot用守护进程将请求转换成协议格式并发送给守护进程。

linux fuse指的是什么

可见,在这种三方关系中,“导火索& quot这个内核模块扮演了一个中继的角色,帮助建立VFS(或用户进程)和守护进程之间的通信通道。通俗地说,它的作用其实就是一个“代理”。

整个框架的实现是在Linux下的FUSE(用户空间中的文件系统)。如图1所示,红框是FUSE文件系统的具体实现,是用户态文件系统的设计者可以发挥的空间。目前,基于FUSE的文件系统已经超过100种(有些基于内核的文件系统也可以移植到用户态文件系统,如ZFS和NTFS),本文将选择一个现成的fuse-sshfs来进行演示。

首先,安装fuse-sshfs软件包,并使用以下命令挂载文件系统(连接远程机器的“remote-dir & quot;该目录被挂载到“本地目录”中目录):

sshfs & lt远程ip & gt:& lt远程目录& gt& ltlocal-dir & gt;之后,在“/sys/fs & quot;目录下,一个名为“fuse & quot同时,你可以看到“保险丝& quot内核模块已经加载(它对应的设备是“/dev/fuse & quot;),本地挂载目录的类型变成了“fuse.sshfs & quot:

linux fuse指的是什么生成设备节点的目的是便于控制用户模式。但是对于这种级别的文件系统的应用,使用ioctl()直接访问设备还是比较麻烦的。因为太多细节的呈现,libfuse作为中间层应运而生,守护进程实际上是通过libfuse提供的接口操作fuse设备文件。

你来我往,为了“fuse.sshfs & quot文件系统是通过“触摸”传递的命令创建一个新文件,例如,查看fuse内核模块和守护进程(即" sshfs & quot)具体交互流程(代码部分基于内核5.2.0版本):

[第一轮]

首先,它是权限的验证,但这里的验证与VFS的权限验证是不一样的。其主要目是防止其他用户访问他们自己的私有fuse文件系统。

linux fuse指的是什么然后根据文件路径查找文件的inode。因为这是一个新创建的文件,所以inode不在内核的inode缓存中,所以需要发送“lookup & quot请求:

linux fuse指的是什么这些请求将被放入挂起队列,等待守护进程的回复,而用户进程将进入休眠状态:

linux fuse指的是什么作为守护进程,sshfs进程读取“/dev/fuse & quot;设备文件来获取数据,如果挂起队列为空,它将陷入阻塞等待:

linux fuse指的是什么当请求到达挂起队列时,守护进程将被唤醒并处理这些请求。已处理的请求将被移动到处理队列中。在守护进程回复fuse内核模块后,用户进程将被唤醒,相应的请求将从处理队列中删除。

linux fuse指的是什么[第二轮]

下一步是执行“触摸& quot由该命令触发的其他系统调用,如果它们是先前访问的数据/元数据,则很可能存在于缓存中。再次访问这部分数据/元数据时,fuse内核模块可以自行解决,不需要来回到用户空间,否则仍然需要上报给守护进程处理。

这里get_fuse_conn()获取挂载“fuse_conn”时创建的fuse类型的文件系统结构实例。作为守护进程和内核之间的纽带,这种连接将一直存在,除非守护进程死亡或者相应的fuse文件系统被卸载。

linux fuse指的是什么在守护进程端,操作是类似的。需要注意的是fuse_write/read()和fuse_dev_write/read()是两个系列的函数。前者是用户进程访问fuse文件系统上的文件时的VFS读写请求,属于常规文件的操作,后者是守护进程对“/dev/fuse & quot;读写这个代表fuse内核模块的设备的目的是获取请求并给出回复。

linux fuse指的是什么[第三轮]

fuse内核模块和daemon进程的最后一轮交互是获取代表fuse文件系统的超级块中的inode号,并填入这个元数据的相关信息。

找到硬币的两面并不困难。在fuse文件系统中,即使一个相对简单的“触摸& quot操作涉及到用户模式和内核模式的频繁切换,并且伴随着多个数据副本。与传统的内核文件系统相比,其整体I/O吞吐量更低,延迟更大。

那为什么fuse在操作系统支持的文件系统中仍然占据一席之地?说起来,以用户模式开发有很多好处。第一,易于调试,特别适合快速验证一个新的文件系统原型,所以在学术研究领域很受欢迎。在内核中,你只能使用C语言。当你处于用户模式时,就没有那么多限制了。各种函数库和编程语言都可以。

第二,内核bug往往会导致整个系统的崩溃(在虚拟化应用中更为严重,因为主机的崩溃会导致其上运行的所有虚拟机崩溃),而用户态bug的影响相对有限。

所以硬币积极的一面是容易开发,但是有多方便毕竟是主观感受,消极的一面是性能的影响,可以用客观的实验数据来验证。那么应该用什么方法来相对准确地测量引信造成的损失呢?

我们仍然使用以前使用的fuse-sshfs,但是这里我们不再使用远程挂载,而是使用本地挂载(假设本地“dir-src & quot;ext4文件系统中的目录):

sshfs本地主机:& ltdir-src & gt;& ltdir-dst & gt;当守护进程收到请求时,它需要再次进入内核来访问ext4的内核模块(这种文件系统模式称为“stackable & quot):

linux fuse指的是什么以用户进程向fuse文件系统发送write()请求为例。右边的红框是原生ext4调用路径,左边多出来的路径是引入fuse后添加的路径:

linux fuse指的是什么根据本文档中给出的数据,“getxattr & quot形成的请求需要两倍于“user-kernel&quot互动量。对于顺序写入,与原生ext4文件系统相比,I/O吞吐量降低27%,随机写入降低44%。

然而,在fuse文件系统诞生以来的几年里,人们已经为它提出了许多优化措施。比如顺序读写时,可以设计成批量向守护进程发送请求(但随机读写不合适)。

还有使用拆分,一种零拷贝技术。Linux内核提供的拆分机制,允许用户空间转移两个内核的内存缓冲区的数据,无需复制,因此特别适合以可堆叠的方式直接从fuse内核模块向ext4内核模块转移数据(但拆分通常用于超过4K的请求,不需要少量数据的读写)。

经过这些努力,fuse文件系统的性能能达到什么程度?根据这份报告中列出的测试结果,与原生ext4相比,fuse的性能损失在理想情况下可以控制在5%以内,但最差情况下达到83%。同时,其对CPU的资源占用也增加了31%。

从Android v4.4到v7.0之间存在的sdcard守护进程,到近几年的Ceph和GlusterFS,所有基于FUSE的实现都已经采用或正在采用。FUSE在网络文件系统和虚拟化应用程序中都显示了它的实用性。它的出现和发展并不是为了取代内核模式下实现的文件系统,而是作为一种有益的补充(理论上FUSE也可以用来实现根文件系统,但不建议这么做,“可以做& quot和“应该做的”是两回事)。

未经允许不得转载:主机频道 » linux fuse是什么意思?

评论 抢沙发

评论前必须登录!