KernelSU 模块不生效?meta-overlayfs 元模块安装与 systemless 覆盖 /system 完全指南
【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU
KernelSU 装好之后,不少新手会撞上同一个现象:模块装上了、也重启了,可/system里的文件纹丝不动。十有八九,卡点不在模块本身,而在于你的设备还没有安装元模块——最典型的就是官方参考实现meta-overlayfs。这篇指南带你搞懂元模块的来龙去脉、用五步装好meta-overlayfs,并讲清重启后如何验证、模块system目录的覆盖规则,以及换装、排错时的正确姿势。
动手前先判断:你的模块真的需要元模块吗
KernelSU 的架构和传统方案有个关键差异:模块挂载逻辑被从内核核心剥离出来,放进了可插拔的元模块里。打个白话比方——普通模块负责"改什么",元模块负责"怎么盖上去"。没装元模块时,KernelSU 根本不会执行挂载动作,于是所有依赖system目录的模块,装完等于白装,涉及/system文件修改的部分自然无法生效。
但并不是每个模块都得依赖它。如果你的模块只用到下面这些能力:
- 开机脚本(
post-fs-data.sh、service.sh等) sepolicy.rule追加 SELinux 策略system.prop注入系统属性
那么这些功能由 KernelSU 核心直接处理,不装元模块也能照常工作。换句话说:"模块不生效"是否要归咎于元模块,先看模块是不是要动/system里的文件。更多边界说明可参考模块指南。
meta-overlayfs 凭什么能"动" /system 又不动 /system
先解释一下systemless:不往分区里写任何字节,而是在系统启动时把一层挂载"盖"在/system之上,你看到的文件是模块版本,磁盘上的分区却原封不动。
meta-overlayfs正是干这件事的官方参考实现:
- 它基于内核自带的 OverlayFS完成叠加挂载,而不是自己发明一套文件系统;
- 支持把模块的实际文件存放在 ext4 镜像
modules.img中,用镜像承载内容、目录承载元数据,节省空间也便于管理; - 生效时机在开机的post-fs-data 阶段:该阶段元模块执行挂载脚本,把每个已启用模块的
system目录逐一分区叠加上去。覆盖范围不止system,还包括vendor、product、system_ext、odm、oem五个分区。
简单说:只要模块处于启用状态,重启进桌面时,你已经在"盖好层"的/system上运行了。
🛠️ KernelSU 元模块怎么装:五步装好 meta-overlayfs
元模块的安装路径和普通模块完全一样,不需要任何额外命令:
- 下载元模块的 ZIP 包(例如
meta-overlayfs.zip)——和普通模块的安装包是同一物种; - 打开 KernelSU Manager 应用——就是你平时管理模块、审批授权的那个应用;
- 点击界面右下角的悬浮按钮(➕)——这是手动安装模块的统一入口;
- 在文件选择器中选中刚才下载的 ZIP——确认后内核侧会自动完成安装;
- 重启设备——挂载动作发生在启动流程里,不重启就永远等不到它生效。
重启之后,怎么确认元模块真的在工作
确认动作都在应用内完成,无需翻命令行日志:
- 进入 Manager 的Module 页面,当前激活的元模块会出现在模块列表里,并带有专门的元模块标识——你看到它,就说明挂载职责已经有人接管了。
另外有一条命令行线索可以交叉验证:元模块安装后,KernelSU 会创建一个符号链接
/data/adb/metamodule -> /data/adb/modules/<metamodule_id>
这个固定路径指向的就是当前激活的元模块,不管它的 ID 叫什么,排查时看一眼链接落在哪个目录即可。
模块 system 目录的 4 种行为:覆盖 /system 前必懂
装好元模块后,模块system目录里的内容与系统分区之间会发生下面四种关系,做模块或核对效果时都要心里有数:
| 你想要的效果 | 模块里怎么做 | 重启后的结果 |
|---|---|---|
| 覆盖同名文件 | 在system/下放一个同名文件 | 系统里的同名文件被模块版本取代 |
| 合并同名目录 | 放一个同名目录 | 两侧目录合并呈现,互不丢失 |
| "删掉"原系统文件 | 执行mknod filename c 0 0生成同名占位 | OverlayFS 将其 whiteout,视同已删除,/system分区本身不变 |
| 整目录换掉 | 对目录执行setfattr -n trusted.overlay.opaque -v y <目标路径>;或在customize.sh中声明REMOVE/REPLACE变量,由 KernelSU 自动完成对应的占位或 opaque 设置 | 该目录被模块版本整体替换 |
换句话说,验证"装没装对"最直接的办法,就是看模块声明的这些覆盖、删除、替换在重启后是否逐一兑现。
⚠️ 一台设备只容得下一个元模块:换装与卸载的规矩
唯一性是硬约束:KernelSU 同一时间只允许存在一个元模块。若你尝试安装第二个,会被直接拦截,避免两套挂载逻辑打架。
卸载的副作用要掂量清楚:元模块一旦移除,所有模块都不会再被挂载——所有模块修改集体失效。设备本身照常开机,只是改动静默退场;在换上新的元模块之前,这个状态会一直持续。
所以想换元模块时,不要图省事直接覆盖安装,走下面的完整切换流程:
| 步骤 | 操作 |
|---|---|
| 1 | 卸载所有普通模块 |
| 2 | 卸载当前元模块 |
| 3 | 重启设备 |
| 4 | 安装新的元模块 |
| 5 | 重新安装普通模块 |
| 6 | 再次重启 |
顺序的意义在于:先让旧挂载关系彻底消失,再让新元模块从干净状态接管,最后把普通模块放回来,中间用两次重启保证每一层都落到正确状态。
装好了还是不生效?按顺序查这两处
如果你已经走完上面的流程、也重启过,模块修改却依然缺席,按这个顺序排查:
- 回 Module 页面看元模块在不在列——激活的元模块应当带着标识出现在列表里。看不到它,说明安装环节就没成功,一切挂载无从谈起;
- 检查目标模块目录里有没有
skip_mount或disable标记文件——这两个标记只要存在其一,该模块的system目录就会被跳过,不会被挂载。确认无误后移除对应标记再重启。
这两步走完仍不解决的话,FAQ 里"全新安装后模块不工作"一条的结论和本文一致:要改/system文件的模块必须依赖元模块,其余能力则不依赖,先把模块类型和元模块状态对应上再谈后续。
延伸方向
- 元模块并非只有一种玩法:除
meta-overlayfs外,还存在无挂载(纯脚本型模块设备可以完全跳过挂载开销)、Magic Mount(Magisk 兼容风格)、以及完全自定义的实现。各自取舍与开发要求,见元模块指南。 - 如果你想自己开发元模块,指南里还覆盖了识别属性
metamodule=1、钩子脚本metamount.sh(挂载处理器)等完整机制。 - 装好元模块后如何组织模块目录、编写
customize.sh、配置各类脚本与属性文件,继续对照模块指南 逐项落地即可。
【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考