首页 > 其他分享 >FUSE 透传

FUSE 透传

时间:2024-11-25 11:44:59浏览次数:7  
标签:文件 驱动程序 文件系统 透传 FUSE 请求

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 透传功能,但设备仍可正常运行。

标签:文件,驱动程序,文件系统,透传,FUSE,请求
From: https://www.cnblogs.com/linhaostudy/p/18567261

相关文章

  • 题解:[ARC188C] Honest or Liar or Confused
    乍一看以为是3-SAT不可做,动动脑子发现是2-SAT(鉴于本题解书写时洛谷题面暂无中文翻译,为避免可能的歧义或困惑,先对本题解中的译法进行约定:英文题面中“honestvillager”或日文题面中“正直者”译为“诚实村民”。英文题面中“liar”或日文题面中“嘘つき”译为“撒谎村民”......
  • [ARC188C] Honest or Liar or Confused
    扩展域并查集+带权并查集。题意中给的是骗子与否和糊涂与否,似乎有多个二元关系。观察结果:如果一个人不糊涂,那么\(C=0\)代表他们同是诚实的或者都是骗子;\(C=1\)代表他们的诚实与否不同。这时我们就可以不在意这个人是否诚实了,我们就去关系人与人之间的相对关系。若这个人......
  • 雷池+frp 批量设置proxy_protocol实现真实IP透传
    需求内网部署safeline,通过frp让外网访问内部web网站服务,让safeline记录真实外网攻击IPsafeline跟frp都部署在同一台服务器:192.168.2.103frpclient配置frpc只需要在https上添加transport.proxyProtocolVersion="v2"即可,例如root@safeline:~#cat/etc/frp/frpc.to......
  • 【论文阅读】ChainedDiffuser: Unifying Trajectory Diffusion and Keypose Predictio
    Abstract我们提出了chaineddiffuser,这是一种policy架构,它结合了动作键预测和轨迹扩散生成,用于从演示中学习机器人操作。我们的主要创新是使用全局基于转换器的动作预测器来预测关键帧的动作,这是一项需要多模态语义场景理解的任务,并使用局部轨迹扩散器来预测连接预测宏动作的轨......
  • 用户空间实现文件系统的接口FUSE(Filesystem in Userspace)API介绍
    FUSE(FilesysteminUserspace)API是一种在用户空间实现文件系统的接口。一、FUSEAPI的作用它允许开发者在不修改内核代码的情况下,创建自定义的文件系统。通过FUSEAPI,你可以实现各种特殊用途的文件系统,比如网络文件系统、加密文件系统、虚拟文件系统等。二、工作原理用户空间程......
  • 网站提示“Connection refused:数据库连接被拒绝”错误如何解决
    当您遇到“Connectionrefused:数据库连接被拒绝”的错误时,这意味着您的应用程序尝试连接数据库时未能成功建立连接。这种错误通常由以下几种原因造成:数据库服务未启动:确认数据库服务(如MySQL、PostgreSQL等)正在运行。您可以在服务器上使用命令行工具检查服务的状态,例如对于MyS......
  • Transfusion: Predict the Next Token and Diffuse Images with One Multi-Modal Mode
    Transfusion:PredicttheNextTokenandDiffuseImageswithOneMulti-ModalModel(2024,8)PaperTODO:目前没有开源代码,实时关注一下officialcode,Meta的工作基本开源的.本文给出了一种新的T2I的方法.lucidrains的代码本质是将LLM的transformer和图像中的diffusion结......
  • 一台Ubuntu22.04物理机搭建虚拟机云和容器云集群,通过安装ESXi、配置GPU透传、创建虚拟
    一台Ubuntu22.04物理机搭建虚拟机云和容器云集群,通过安装ESXi、配置GPU透传、创建虚拟机,然后在虚拟机上搭建集群。步骤1:安装ESXi并配置GPU透传下载和准备ESXi:从VMware官方网站下载ESXi镜像。使用Rufus等工具将镜像写入U盘,以便将其作为启动盘。安装ESXi:将U盘插......
  • Linux命令fuser使用
    简介在Linux操作系统中,fuser是一个命令行工具,用于查找并显示使用指定文件、文件系统或套接字的进程的情况。它可以帮助我们找出哪些进程占用了某个文件或目录,以便我们能够进行相关操作,比如杀死这些进程或释放对应的资源。命令语法fuser命令的基本语法如下:fuser[选项]文件或目录......
  • 小尺寸BLE 5.2低功耗串口透传蓝牙模块 - ANS-BT103M
    ANS-BT103M是安朔科技自主开发的一款小尺寸BLE蓝牙5.2模块,它支持HID、GATT、ATT和其他配置文件,使用UART作为编程接口,用户可以使用AT命令通过UART读取或写入模块的配置,支持空中升级。支持蓝牙主从一体,一对多连接,透传速率可达60KB/s,支持定制开发。产品参数:模块型号      ......