老内核也能 Root:KernelSU 非 GKI 设备适配避坑手册
【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU
你的设备内核是 4.14 到 4.19 这一代,装上 KernelSU 管理器后却提示不支持?先别放弃。KernelSU 官方最低支持到 Linux 4.14 内核,只是不再为这类设备提供现成的 boot 镜像——你需要把 KernelSU 集成进自己设备的内核源码里自己编译。本文带你走通老设备适配 KernelSU 的完整路径,并把最容易踩的坑提前讲清楚。
先确认三件事,再决定要不要动手
- ✅内核版本:连上电脑执行下面这条命令,输出的前两段就是你要的版本号:
adb shell uname -r4.14 到 5.3 属于"要自己编"的阵营;如果你的设备能被管理器识别为 GKI 并直接刷官方镜像,那这篇可以不看。
- ✅内核源码能不能拿到、能不能独立编译出可开机的内核。这是硬性前提,厂商不开源源码的话这条路基本走不通。
- ⚠️版本选择:官方自 v1.0 起放弃了对非 GKI 设备的维护,最后一个支持非 GKI 的版本是v0.9.5。所以集成时务必用 v0.9.5 标签,而不是最新代码。
开始动手前把原厂 boot 分区备份一份,新镜像先用fastboot boot临时验证能正常开机,再考虑永久刷写。
一条主线走通:kprobe 自动集成
kprobe 你可以理解成内核自带的"探针"机制——不用改源码,运行时把钩子挂到目标函数上。KernelSU 的默认 hook 模式就依赖它,内核侧的实现放在kernel/hook/目录。只要 kprobe 在你的内核上正常工作,集成基本就是跑一个脚本的事。
先克隆仓库,再回到你的内核源码根目录执行集成脚本(脚本位于kernel/setup.sh),并指定版本:
git clone https://gitcode.com/GitHub_Trending/ke/KernelSU bash /path/to/KernelSU/kernel/setup.sh v0.9.5脚本会自动把 KernelSU 挂到drivers/kernelsu并在 Makefile、Kconfig 里注册构建入口,你不用手动搬文件。
接着打开 menuconfig,确认这几项都启用了(defconfig 常见于arch/arm64/configs/下,不同设备位置可能不同):
CONFIG_KSU=y CONFIG_KPROBES=y CONFIG_HAVE_KPROBES=y CONFIG_KPROBE_EVENTS=y然后正常编译、打包 boot 镜像即可。如果编译期 kprobe 报错,多半是依赖项CONFIG_MODULES没开,进 menuconfig 搜 KPROBES 把缺失的依赖补齐。
kprobe 不通?切手动补丁模式
老内核上 kprobe 经常有 bug,典型症状就是集成后开不了机。这时改走手动集成:在四个关键函数里插入 KernelSU 的调用点。
do_faccessat(fs/open.c):4.17 之前的内核没有这个函数,直接改faccessat系统调用入口do_execveat_common(fs/exec.c)vfs_read(fs/read_write.c)vfs_statx(fs/stat.c):内核里没有它就改用vfs_fstatat
每处插入的都是十几行带#ifdef CONFIG_KSU保护的外部函数调用,官方文档里附了完整 diff,照着改就行,不用自己发明写法。
⚠️ 走手动模式时请顺手关掉CONFIG_KPROBES,否则开机时的按键事件可能误触发安全模式,让人摸不着头脑。
排障矩阵:按症状对号入座
| 症状 | 大概率原因 | 处理 |
|---|---|---|
| 编译期 kprobe 相关报错 | CONFIG_MODULES未开启 | menuconfig 里补齐 kprobe 的依赖项 |
| 集成后无法开机 | kprobe 在你的内核上不工作 | 先按文档方法验证是 kprobe 问题,再切手动集成 |
| 莫名其妙进入安全模式 | 手动集成且没关 KPROBES | 关闭CONFIG_KPROBES重新编译 |
pm命令执行失败 | devpts 未适配 | 按文档给fs/devpts/inode.c打补丁 |
| 模块无法卸载 | 旧内核缺path_umount | 从 5.9 内核 backport 这个函数 |
| 装完模块后变砖 | 模块自身问题 | 开机第一屏连按 3 次音量下进安全模式,或 adb 里用ksud module disable处理 |
按需开启:救砖与模块卸载能力
- 安全模式(强烈建议开启):给
drivers/input/input.c里的input_handle_event打上补丁后,开机第一屏连按 3 次音量下键就能禁用全部模块,是救砖的保底手段。 - 模块卸载:把
path_umount从 5.9 内核移植回来后,旧内核上才能用ksud module unload卸载模块。 - 调试模式:适配阶段打开
CONFIG_KSU_DEBUG=y方便定位问题,稳定后再关掉。
刷完后这样验证
新内核刷进去后,跑这两条命令就够:
adb shell su -c id adb shell ksud module list第一条能返回 root 身份,说明提权链路通了;第二条能列出模块,说明用户空间管理端正常。接着重启两三次,确认模块行为稳定。
你多半还会搜这几个问题
为什么不能用最新版 KernelSU?
v1.0 起官方移除了非 GKI 支持,老内核只能集成 v0.9.5 及更早的版本,用错版本是白忙一场的最常见原因。
怎么判断是不是 kprobe 的问题?
官方文档给了验证思路:临时注释掉 ksud 相关的初始化代码再开机测试,若能正常启动就是 kprobe 的锅。文档已存档不再更新,具体函数位置以你集成的版本源码为准。
开不了机怎么救?
只要你只刷了 boot 分区,恢复原厂 boot 就能回来,这也是备份放第一位的原因;模块导致的变砖走安全模式或ksud module disable。
4.14 以下还能装吗?
理论上可以,但没有适配经验兜底,风险自担,建议先在备用机上试。
建议你先按"临时验证、再永久刷写"的顺序操作,完整的 diff 补丁和救砖细节以官方文档为准:非 GKI 集成指南、救砖手册,项目背景与社区入口见 什么是 KernelSU。
【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考