☰
如何让 KernelSU 模块真正覆盖 /system?meta-overlayfs 元模块快速详解
2026/9/28 7:07:18 网站建设 项目流程

如何让 KernelSU 模块真正覆盖 /system?meta-overlayfs 元模块快速详解

【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU

装好重启后,模块的system目录会被无感叠加到/system上生效,而分区本身原封不动——这正是 KernelSU 的元模块meta-overlayfs为你做到的。本文先用三分钟讲清原理,再带你装好并逐项自查。

它到底怎么工作:systemless 覆盖 /system 的三个概念

先说元模块:KernelSU 把模块挂载逻辑从内核核心剥离,做成了独立可插拔的模块,即metamodule。为什么这么拆?挂载逻辑留在核心里,核心就既是容易暴露的检测点,也不好演进;拆出去之后攻击面更小,社区也能在不 fork 核心的前提下实现不同挂载方案。附带一条硬规则:没装元模块时,任何模块都不会被挂载。

再说OverlayFS:Linux 内核自带的分层文件系统,把多层目录叠加成一个视图——原系统目录在底层,模块的system目录在上层,读文件时上层自动压过底层。meta-overlayfs就是官方参考实现,用内核 OverlayFS 驱动这套叠加,还可用 ext4 镜像(modules.img)存放模块文件,覆盖 system、vendor、product、system_ext、odm、oem 多个分区。

最后说systemless:改动而不修改。应用看到的是合并后的视图,磁盘上/system分区纹丝不动,重刷 ROM 后修改自动消失。也就是说,你改的是系统的"视图",不是系统本身。

模块能力是否需要元模块
system目录覆盖(systemless 覆盖 /system、vendor 等)需要
post-fs-data.sh、service.sh 等启动脚本不需要
sepolicy.rule不需要
system.prop不需要
initrc 注入、模块配置、WebUI不需要

换句话说,只有要动/system文件的模块才必须装元模块,脚本类、策略类、属性类模块由 KernelSU 核心直接处理。

安装实操:从 ZIP 到生效的 5 步

元模块的安装方式和普通模块完全相同,不需要额外刷机工具;前提只是 KernelSU 已装好且 Manager 里能看到 root 状态。为什么装完必须重启?挂载发生在内核早期启动的 post-fs-data 阶段,运行中的系统安装完根本不会走这个流程。

  1. 下载 ZIP。把meta-overlayfs.zip存到设备能访问的目录——官方参考实现,基于内核 OverlayFS 挂载。
  2. 打开 Manager 点安装。进入 KernelSU Manager 应用,点安装悬浮按钮进入安装流程。
  3. 选择 ZIP 并确认。内置安装器会自动解压并放到/data/adb/modules下。
  4. 重启并等待。开机过程中 post-fs-data 阶段会执行挂载脚本,别在半途强杀系统。
  5. 自查。打开 Module 页面看模块列表,激活的元模块带专属标识(下一节细说)。

也就是说,你只动手两次:装包、重启,其余都是安装器的事。

重启后自查清单:模块挂载不生效就查这三步

重启不等于一定成功,按顺序核对以下三项:

  • 元模块出现在列表里?Manager 的 Module 页面中,当前激活的元模块会显示在模块列表里,带特殊的元模块标识。看不到它,说明安装没落地,回到上一步。
  • 目标模块没有标记文件?模块目录下存在skip_mount表示"该模块跳过挂载",存在disable表示模块已禁用。两个文件有一个在,system目录就不会被挂载。
  • 实际效果符合预期?与系统同名的文件被覆盖、同名目录被合并。注意"删除"和"整目录替换"要额外操作:删除需在模块内用mknod filename c 0 0建同名占位,OverlayFS 会把它当作whiteout(删除标记)处理;整目录替换则对同名目录执行setfattr -n trusted.overlay.opaque -v y <TARGET>,或在customize.sh里声明REMOVE/REPLACE变量交给 KernelSU 自动处理。

为什么删除必须走 mknod?因为 OverlayFS 没有"直接删除"语义,上层只能给文件打"隐藏"标记,字符设备占位就是那个标记,/system分区本身始终不变。

换装与卸载元模块的坑

⚠️ 元模块生命周期里有三个坑,都直说:

  • 同一时间只能装一个。装第二个会被 KernelSU 直接阻止。为什么卡这么死?两套挂载逻辑会争抢同一批分区挂载点,冲突后行为不可预测,干脆从入口拦掉。
  • 卸载的副作用是全局的。卸载元模块影响所有模块:此后所有模块都不会再被挂载,设备能正常开机,但全部文件修改停止生效。也就是说机器能用,模块集体变成"摆设",换装新的元模块前都是这个状态。
  • 切换顺序别省步骤。卸载所有普通模块 → 卸载当前元模块 → 重启 → 安装新元模块 → 重装普通模块 → 再重启。中间两次重启不能省,否则旧挂载状态可能残留。
  • 分不清当前激活的是谁?元模块安装后 KernelSU 会创建符号链接/data/adb/metamodule指向/data/adb/modules/<元模块ID>。这是一条与 ID 无关的稳定路径,排查时看它指向哪里,就知道当前激活的是哪个元模块。

延伸阅读

为什么把链接放最后?因为挂载钩子和生命周期细节展开起来太细,放这里会打断主线:元模块指南 里有metamodule=1属性和metamount.sh等全部开发者钩子;模块指南 讲清目录结构与各脚本阶段;挂载机制的其他疑问可以看 FAQ;还没装完 KernelSU 的新手,先把 安装指南 走一遍。

【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询