ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

KernelSU 旧内核适配实战:4.14 到 5.3 设备手动集成到拿到 root 的完整路径

KernelSU 旧内核适配实战:4.14 到 5.3 设备手动集成到拿到 root 的完整路径 KernelSU 旧内核适配实战4.14 到 5.3 设备手动集成到拿到 root 的完整路径【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSUKernelSU 是一个基于 Linux 内核的 Android root 方案权限判定、模块加载、SU 提权全部发生在内核里而不依赖系统分区的可写性。它的非 GKI 分支已经 backport 到 4.14所以 4.14–5.3 的老设备仍然可以集成只是官方不再提供现成 boot 镜像。这篇文章解决的就是这一类问题管理器提示不支持之后从源码集成、改补丁、编译到刷写验证的完整走法。成本先说清楚你需要有能力从自己设备的内核源码编译出一个能正常开机的内核全程至少留 3 小时并接受一次 fastboot 刷机风险。 KernelSU 支持到哪个内核4.14 是分水岭先给结论5.10 走 GKI/LKM 路线直接刷镜像即可4.14–5.3 的非 GKI 内核需要把 KernelSU 源码集成进自己的内核树重新编译低于 4.14 只能参考社区移植补丁做深度 backport难度陡增。内核区间能不能用集成方式你需要做什么5.10GKI官方支持LKM 可加载模块下载官方 boot 刷入4.14–5.3非 GKI已 backport源码集成进内核改 defconfig 打补丁 编译打包4.14 以下实验性手动 backport 核心模块逐处移植 API自担风险一个绕不开的版本红线KernelSU v1.0 起已放弃非 GKI 支持最后支持旧内核的版本是v0.9.5。主线分支的源码对 4.19 这类设备已经不能直接用下文所有集成步骤都锁定在这个 tag 上。⏱️ 动手编译前必须确认的三件事不满足任何一条就不要点编译省下的都是反复救砖的时间。内核版本。连接设备执行adb shell uname -r输出例如4.19.191-android11-8-gb2f41e6只看主版本号落在 4.14–5.3 区间就属于本文的适配对象。管理器侧确认。安装 KernelSU 管理器后如果状态直接显示不支持说明它检测不到 GKI 内核这正是要走手动集成的信号。内核源码可编译。你的设备内核必须开源、且你或社区已经能从源码编出可开机的 boot。这条不满足时先解决把原版内核编译通过的问题再谈加 KernelSU——官方集成文档 how-to-integrate-for-non-gki.md 也把它列为前提该文档现已转为存档参考仅供旧设备查档。 把 v0.9.5 源码挂进内核树这一步对设备无侵入做坏了可以用脚本自带的--cleanup回滚。获取 KernelSU 源码并锁定到最后一个支持非 GKI 的版本git clone https://gitcode.com/GitHub_Trending/ke/KernelSU cd KernelSU git checkout v0.9.5进入你的内核源码根目录执行仓库内的集成脚本kernel/setup.sh把kernel/以软链接挂到drivers/kernelsu并自动追加Makefile与Kconfig条目sh /path/to/KernelSU/kernel/setup.sh v0.9.5打开设备的 defconfig——多数放在arch/arm64/configs/设备代号_defconfig部分厂商放在arch/arm64/configs/vendor/设备代号_defconfig——加入# KernelSU CONFIG_KSUy适配期间建议同时打开调试开关方便出问题时看日志CONFIG_KSU_DEBUGy对应开关在 kernel/Kconfig 中定义y编进内核、M编成kernelsu.ko模块n关闭。挂好之后有两条路按顺序尝试先试 kprobe 路径不通再改手动路径。路径一kprobe 集成优先KernelSU 默认用 kprobe 机制挂内核 hook只要你的内核里 kprobe 工作正常就什么都不用改直接编译。确认以下配置已打开CONFIG_KPROBESy CONFIG_HAVE_KPROBESy CONFIG_KPROBE_EVENTSy如果 KPROBES 编译后仍未生效十有八九是它的依赖CONFIG_MODULES没开还不行就进make menuconfig搜索 KPROBES把其余未满足的依赖逐项启用。路径二手动改内核源码kprobe 不工作常见原因是厂商内核的上游 bug 或版本过低时改用显式调用点。必须修改四个系统调用处理函数各自的位置和补丁如下1.fs/exec.c—do_execveat_common#ifdef CONFIG_KSU extern bool ksu_execveat_hook __read_mostly; extern int ksu_handle_execveat(int *fd, struct filename **filename_ptr, void *argv, void *envp, int *flags); extern int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr, void *argv, void *envp, int *flags); #endif static int do_execveat_common(int fd, struct filename *filename, struct user_arg_ptr argv, struct user_arg_ptr envp, int flags) { #ifdef CONFIG_KSU if (unlikely(ksu_execveat_hook)) ksu_handle_execveat(fd, filename, argv, envp, flags); else ksu_handle_execveat_sucompat(fd, filename, argv, envp, flags); #endif return __do_execve_file(fd, filename, argv, envp, flags, NULL); }2.fs/open.c—do_faccessat#ifdef CONFIG_KSU extern int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode, int *flags); #endif long do_faccessat(int dfd, const char __user *filename, int mode) { /* ...原有局部变量... */ #ifdef CONFIG_KSU ksu_handle_faccessat(dfd, filename, mode, NULL); #endif /* ...原有权限检查逻辑... */内核早于 4.17、没有do_faccessat时改为直接在SYSCALL_DEFINE3(faccessat, ...)定义内部插入同样的调用。3.fs/read_write.c—vfs_read#ifdef CONFIG_KSU extern bool ksu_vfs_read_hook __read_mostly; extern int ksu_handle_vfs_read(struct file **file_ptr, char __user **buf_ptr, size_t *count_ptr, loff_t **pos); #endif ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) { #ifdef CONFIG_KSU if (unlikely(ksu_vfs_read_hook)) ksu_handle_vfs_read(file, buf, count, pos); #endif /* ...原有读取逻辑... */4.fs/stat.c—vfs_statx#ifdef CONFIG_KSU extern int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags); #endif int vfs_statx(int dfd, const char __user *filename, int flags, struct kstat *stat, unsigned int query_flags) { #ifdef CONFIG_KSU ksu_handle_stat(dfd, filename, flags); #endif /* ...原有属性查询逻辑... */若你的内核还没有vfs_statx4.16 及更早把同样的调用挂进vfs_fstatat代替。两个强烈建议追加的补丁安全模式救砖入口修改drivers/input/input.c的input_handle_event开机按住音量下可进入安全模式对旧设备用户是保命功能#ifdef CONFIG_KSU extern bool ksu_input_hook __read_mostly; extern int ksu_handle_input_handle_event(unsigned int *type, unsigned int *code, int *value); #endif static void input_handle_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) { #ifdef CONFIG_KSU if (unlikely(ksu_input_hook)) ksu_handle_input_handle_event(type, code, value); #endif /* ...原有输入处理逻辑... */ }注意一个反直觉的坑如果走手动集成路径却没关闭CONFIG_KPROBES开机后按音量下反而可能误触发安全模式。手动路径下建议把 KPROBES 关掉只用显式调用点。pm 命令修复su -c pm ...执行失败时给fs/devpts/inode.c的devpts_get_priv加一行调用extern int ksu_handle_devpts(struct inode*); void *devpts_get_priv(struct dentry *dentry) { ksu_handle_devpts(dentry-d_inode); /* ...原有逻辑... */ }⚙️ 编译、打包 boot 镜像与临时验证编译前先确认 overlayfs 相关配置齐了模块挂载系统依赖它CONFIG_OVERLAY_FSy CONFIG_OVERLAY_FS_INDEXy CONFIG_OVERLAY_FS_REDIRECT_DIRy然后照你的设备既有流程配置、编译、打包arm64 示例工具链前缀按你自己的环境替换make ARCHarm64 CROSS_COMPILEaarch64-linux-android- menuconfig make ARCHarm64 CROSS_COMPILEaarch64-linux-android- -j$(nproc) mkbootimg --kernel arch/arm64/boot/Image.gz \ --ramdisk ramdisk.img \ --output boot-ksu.img永远先临时启动不直接刷写adb reboot bootloader fastboot boot boot-ksu.img设备正常进入系统、管理器状态变为已支持后再刷永久分区。root 成功的验证命令adb shell su -v # 输出 KernelSU 版本信息 adb shell su -c id # 输出 uid0(root) gid0(root) 刷进去起不来按这个顺序排查三类故障占了绝大多数翻车现场现象和解法对照着看现象一卡在开机 logo 直接重启——kprobe 异常。验证方法很干脆注释掉 kernel/core/init.c 里的ksu_sucompat_init()和ksu_ksud_init()重新编译如果就能正常开机说明内核的 kprobe 本身有病。要么修厂商内核里这个 bug要么切回手动改源码的路径二。现象二卡 logo日志里有 SELinux 拒绝。adb logcat里出现avc: denied { module_load }一类记录是策略与模块加载冲突需要按 kernel/selinux/ 下的策略逻辑调整对应规则后重编。现象三能开机、root 正常但模块挂载无效。OverlayFS 没启用或选项不全系统分区的叠加修改写不进去。回到编译前检查里那三项CONFIG_OVERLAY_FS*配置补齐重编。稳定性别只测一次连续重启 5 次都正常再跑一段时间压力测试最后过一遍常用的 root 应用兼容性才算真正落地。 适配检查清单与下一步刷之前逐条对照全部打勾再动 fastbootadb shell uname -r落在 4.14–5.3且管理器显示不支持原版内核源码已能独立编译并开机KernelSU 锁在v0.9.5集成脚本执行成功、软链接已挂到drivers/kernelsudefconfig 中CONFIG_KSUy调试期加CONFIG_KSU_DEBUGykprobe 路径KPROBES/HAVE_KPROBES/KPROBE_EVENTS三项已开且CONFIG_MODULES未漏手动路径exec/open/read_write/stat 四处调用点全部打上vfs_statx缺失时改用vfs_fstatat安全模式补丁已加手动路径下CONFIG_KPROBES已关闭CONFIG_OVERLAY_FS三项配置完整fastboot boot临时验证通过su -c id返回 root下一步你可以做的事把CONFIG_KSU_DEBUG关掉出正式版镜像若旧内核上需要卸载模块能力可以从 Linux 5.9 向fs/namespace.c移植path_umount官方存档文档里有完整参考补丁遇到 pm 失效再补fs/devpts/inode.c那一行。完整背景资料见仓库内的 非 GKI 集成文档 与 设备支持 FAQ。【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表