kernelsu 中文文档 下载 App

KernelSU 模块机制与 systemless——不改系统分区也能改系统

模块是干什么的

模块(module)让你在保持系统分区完整的前提下修改系统文件、注入脚本、加 SELinux 规则——这种机制叫 systemless。卸载模块或停用后,系统原样如初,OTA 与保修状态不受影响。

KernelSU 的模块运作机制与 Magisk 几乎一样:熟悉 Magisk 模块的用户可以直接沿用认知,主要差异集中在挂载架构与文件替换方式上(见 元模块是什么)。

模块在磁盘上长什么样

模块就是 /data/adb/modules/ 下的一个文件夹,核心成员:

/data/adb/modules/<模块ID>/
├── module.prop        # 模块身份证:id、name、version 等
├── system/            # 要叠加进 /system 的内容
├── post-fs-data.sh    # 挂载前的阻塞阶段脚本
├── post-mount.sh      # 挂载完成后的脚本
├── service.sh         # 大多数模块该用的非阻塞脚本
├── boot-completed.sh  # 系统启动完毕后执行
├── uninstall.sh       # 卸载时执行
├── system.prop        # 以 resetprop 修改系统属性
├── sepolicy.rule      # 追加 SELinux 规则
├── disable / remove / skip_mount   # 状态标记文件

三个标记文件值得记住:出现 disable 模块被禁用;出现 remove 下次重启被移除;出现 skip_mount 则其 system 目录不参与挂载。

system 目录如何生效

模块的 system 目录会以 overlayfs 方式叠加在真实 /system 之上:同名文件被覆盖、同名目录合并;想「删除」系统文件用 mknod 创建同名节点触发 whiteout。这一切不写物理分区。

五个启动阶段与脚本的对应

阶段特点对应脚本
post-fs-data阻塞,最长 10 秒,Zygote 之前post-fs-data.sh
post-mount挂载完成后post-mount.sh
late_start 服务非阻塞并行service.sh(推荐)
boot-completed系统启动完毕boot-completed.sh

通用脚本放在 /data/adb/service.d 等目录,需可执行权限;模块脚本则随模块启停。脚本一律运行在 KernelSU 内置 BusyBox 的 ash 独立模式下,环境行为可预期。

重要前提:要让模块的 system 目录真正挂上,需要先安装元模块——这正是很多新装用户「模块不生效」的原因,下一页展开。