FUSE 透传

news/2025/2/23 7:07:06/文章来源:https://www.cnblogs.com/linhaostudy/p/18567261

Android 12 支持 FUSE 透传功能,此功能可以最大限度地降低 FUSE 开销,从而实现可媲美直接访问下层文件系统的性能。android12-5.4android12-5.10android-mainline(仅限测试)内核支持 FUSE 透传功能,这意味着是否支持此功能取决于设备使用的内核和设备搭载的 Android 版本:

  • 从 Android 11 升级到 Android 12 的设备无法支持 FUSE 透传功能,因为这些设备的内核已冻结,并且无法迁移至已正式升级为包含 FUSE 透传变更的内核。
  • 发布时搭载 Android 12 的设备在使用官方内核时可以支持 FUSE 透传功能。在此类设备上,用于实现 FUSE 透传功能的 Android 框架代码已嵌入 MediaProvider Mainline 模块中,该模块会自动升级。未将 MediaProvider 实现为 Mainline 模块的设备(例如 Android Go 设备)也可以获取 MediaProvider 变更,因为这些变更已公开共享。

FUSE 与 SDCardFS

用户空间中的文件系统 (FUSE) 是一种机制,可让内核(FUSE 驱动程序)将 FUSE 文件系统中执行的操作外包给用户空间程序(FUSE 守护程序),由其来实现操作。Android 11 废弃了 SDCardFS,并将 FUSE 作为存储空间模拟的默认解决方案。作为此变更的一部分,Android 实现了自己的 FUSE 守护程序,用于拦截文件访问,强制执行额外的安全和隐私功能,并在运行时操作文件。

虽然 FUSE 在处理页面或属性等可缓存的信息时效果非常理想,但在访问外部存储设备时却会导致性能下降,这一点在中低端设备上尤为明显。导致这些性能下降问题的原因在于,实现 FUSE 文件系统需要一系列组件协同配合,在 FUSE 驱动程序与 FUSE 守护程序之间的通信过程中也需要从内核空间多次切换到用户空间(与此相比,直接访问下层文件系统则更加精简且完全在内核中实现)。

若要减轻这些性能下降问题,应用可以使用拼接来减少数据复制,并使用 ContentProvider API 直接访问下层文件系统文件。即使采取这些措施并进行其他优化之后,与直接访问下层文件系统相比,使用 FUSE 时的读取和写入操作仍会遇到带宽降低的问题,特别是在随机读取操作中更为突出,因为在这种情况下没有缓存或预读可助一臂之力。通过旧路径 /sdcard/ 直接访问存储空间的应用会继续出现显著的性能下降,尤其是在执行 IO 密集型操作时。

SDcardFS 用户空间请求

使用 SDcardFS 可从内核中移除用户空间调用,从而加快存储空间模拟和 FUSE 权限检查。用户空间请求遵循以下路径:用户空间 → VFS → sdcardfs → VFS → ext4 → 页面缓存/存储空间。

FUSE 透传 SDcardFS

图 1. SDcardFS 用户空间请求

FUSE 用户空间请求

FUSE 最初用于实现存储空间模拟并让应用能够透明地使用内部存储空间或外部 SD 卡。使用 FUSE 会产生一些开销,因为每个用户空间请求都遵循以下路径:用户空间 → VFS → FUSE 驱动程序 → FUSE 守护程序 → VFS → ext4 → 页面缓存/存储空间。

FUSE 透传 FUSE

图 2. FUSE 用户空间请求

FUSE 透传请求

大多数文件访问权限是在文件打开时进行检查,还有一些其他权限是在对文件执行读取和写入操作时进行检查。在某些情况下,系统可以在文件打开时确定发出请求的应用对所请求的文件具有完全访问权限,这样就不需要继续将读取和写入请求从 FUSE 驱动程序转发到 FUSE 守护程序(因为这样做只是将数据从一个位置移到另一个位置)。

借助 FUSE 透传功能,负责处理待处理请求的 FUSE 守护程序可以通知 FUSE 驱动程序:可以执行相关操作,并且可将后续所有读取和写入请求直接转发给下层文件系统。如此一来,就可以避免等待用户空间 FUSE 守护程序回复 FUSE 驱动程序请求所产生的额外开销。

下面对 FUSE 请求与 FUSE 透传请求进行了对比。

FUSE 透传对比

图 3. FUSE 请求与 FUSE 透传请求

当应用执行 FUSE 文件系统访问时,会发生以下操作:

  1. FUSE 驱动程序处理请求并将其加入队列,然后通过 /dev/fuse 文件(FUSE 守护程序无法读取该文件)中的特定连接实例将请求提交给负责处理该 FUSE 文件系统的 FUSE 守护程序。
  2. 当 FUSE 守护程序收到打开文件的请求时,它会确定 FUSE 透传是否适用于该特定文件。如果适用,守护程序会执行以下操作:
    1. 将此请求通知 FUSE 驱动程序。
    2. 使用 FUSE_DEV_IOC_PASSTHROUGH_OPEN ioctl(必须对打开的 /dev/fuse 的文件描述符执行)针对该文件启用 FUSE 透传功能。
  3. ioctl 接收包含以下内容的数据结构(作为参数):
    • 作为透传功能目标的下层文件系统文件的文件描述符。
    • 当前正在处理的 FUSE 请求(必须为待处理状态或创建并待处理状态)的唯一标识符。
    • 可以留空并打算供未来实现之用的额外字段。
  4. 如果 ioctl 成功,FUSE 守护程序会完成待处理的请求,FUSE 驱动程序会处理 FUSE 守护程序回复,并且系统会将对下层文件系统文件的引用添加到内核中的 FUSE 文件中。当应用请求对 FUSE 文件执行读写操作时,FUSE 驱动程序会检查是否有可用的对下层文件系统文件的引用。
    • 如果有可用的引用,驱动程序会以下层文件系统文件为目标,使用相同的参数创建一个新的虚拟文件系统 (VFS) 请求。
    • 如果没有可用的引用,驱动程序会将请求转发给 FUSE 守护程序。

对常规文件执行读写操作和读取迭代器/写入迭代器操作以及对内存映射文件执行读写操作时,都会发生上述操作。针对特定文件的 FUSE 透传会一直存在,直到相应文件关闭为止。

实现 FUSE 透传功能

如需在搭载 Android 12 的设备上启用 FUSE 透传功能,请将以下代码行添加到目标设备的 $ANDROID_BUILD_TOP/device/…/device.mk 文件中。

# Use FUSE passthrough
PRODUCT_PRODUCT_PROPERTIES += \persist.sys.fuse.passthrough.enable=true

如需停用 FUSE 透传功能,请省略上述配置更改或将 persist.sys.fuse.passthrough.enable 设为 false。如果您之前已启用 FUSE 透传功能,停用该功能会使设备无法使用 FUSE 透传功能,但设备仍可正常运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/840789.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易基因:转录因子Pax5在多西紫杉醇耐药性神经内分泌样前列腺癌中的表观调控作用|Cell Death Dis

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 前列腺癌患者在接受雄激素受体信号抑制剂(ARSI)治疗后,可能会出现耐药性,导致治疗诱导的神经内分泌样前列腺癌(therapy-induced neuroendocrine-like prostate cancer,t-NEPC)发生。t-NEPC是一种高侵袭性…

反向 Debug 了解一下?揭秘 Java DEBUG 的基本原理

Debug 的时候,都遇到过手速太快,直接跳过了自己想调试的方法、代码的时候吧…… 一旦跳过,可能就得重新执行一遍,准备数据、重新启动可能几分钟就过去了。好在IDE 们都很强大,还给你后悔的机会,可以直接删除某个 Stack Frame,直接返回到之前的状态,确切的说是返回到之前…

记录一次RPC服务有损上线的分析过程

1. 问题背景 某应用在启动完提供JSF服务后,短时间内出现了大量的空指针异常。 分析日志,发现是服务依赖的藏经阁配置数据未加载完成导致。即所谓的有损上线或者是直接发布,当应用启动时,service还没加载完,就开始对外提供服务,导致失败调用。 关键代码如下 数据的初始化加…

阿里二面:如何设计一个高并发系统?

大家好,我是苏三,又跟大家见面了。 前言 最近有位粉丝问了我一个问题:如何设计一个高并发系统? 这是一个非常高频的面试题,面试官可以从多个角度,考查技术的广度和深度。 今天这篇文章跟大家一起聊聊高并发系统设计一些关键点,希望对你会有所帮助。1 页面静态化 对于高并…

Linux之CPU调度策略和CPU亲和性

一、调度策略 调度进程 单个 CPU一次只能执行一个进程,虽然 Linux 系统通过使用多任务同时处理多个进程,但当多个进程同时运行在一个CPU 上时,它通过交错执行这些进程。 内核使用进程调度器来决定在某一时间点上哪个进程在运行。调度器必须平衡几个选项:快速决定下一个该运…

Linux之CPU调度策略

调度进程 单个 CPU一次只能执行一个进程,虽然 Linux 系统通过使用多任务同时处理多个进程,但当多个进程同时运行在一个CPU 上时,它通过交错执行这些进程。 内核使用进程调度器来决定在某一时间点上哪个进程在运行。调度器必须平衡几个选项:快速决定下一个该运行的进程进程可…

2025年IT项目经理必看!9大项目管理平台完全对比,选错软件你后悔一辈子!

一、引言2025 年,IT 项目管理面临着更多的挑战和机遇。选择合适的项目管理平台对于 IT 项目经理来说至关重要,一个好的平台能够提高项目管理效率,确保项目顺利进行。本文将对 2025 年九大热门项目管理平台进行全面对比,帮助 IT 项目经理做出明智的选择。 在当今数字化时代,…

Unity版本使用情况统计(更新至2024年11月)

UWA发布|本期UWA发布的内容是第十五期Unity版本使用统计,统计周期为2024年5月至2024年11月,数据来源于UWA网站(www.uwa4d.com)性能诊断提测的项目。希望给Unity开发者提供相关的行业趋势作为参考。2024年5月 - 2024年11月版本分布 以近半年的数据统计来看,如图1所示,2…

sql学习~

一.mysql数据模型二.sql简介三、mysql通用语法 1.注释 单行注释。-- 内容(注意空格) 多行注释。/* 内容 */ 2.不区分大小写 3.分号结尾。 四、sql分类1.DDL 1>进入mysql mysql -uroot -p+密码 2>操作数据库查询数据库show databases; 创建数据库create database 数据库…

Qt 打包为可执行文件(详解)

https://blog.csdn.net/dfr110719/article/details/136992619<div id="content_views" class="htmledit_views"><p id="main-toc"><strong>目录</strong></p> 一.打包为文件夹 二.打包为可执行文件(.exe) 当我…

关于train, evaluate 和 作图——dymean3

TMscore 从代码实现来看,这里的 TMscore 计算是通过调用外部的 TMscore 可执行程序完成的,输入的 PDB 文件包含了原子的三维坐标信息。那么具体答案可以分以下几个方面来分析: 1. 是否只对 CA 坐标进行计算答案:否。 TMscore 通常会基于整个 PDB 文件中所有原子的坐标计算分…

微信小程序生成朋友圈分享图/海报

效果图海报生成原文链接:https://developers.weixin.qq.com/community/develop/article/doc/000ac686c5c5506f18b87ee825b013demo 代码片段:https://developers.weixin.qq.com/s/J38pKsmK7Qw5小程序海报生成工具链接:https://developers.weixin.qq.com/community/develop/ar…