KernelSU 是一款为 Android 设备提供深层次系统控制的内核级 Root 解决方案。通过在内核层面授予用户最高权限,实现了对设备的深度定制,同时保证了操作的安全性。

特性
KernelSU 是一款适用于 Android GKI 设备的 root 方案,它在内核模式下运行,并直接在内核空间向用户空间应用程序授予 root 权限。
KernelSU 的主要特点是基于内核模式运行。 这使得 KernelSU 可以提供以前无法实现的内核接口。例如,我们可以向内核模式中的任何进程添加硬件断点;我们可以访问任何进程的物理内存,而不会被任何人察觉;我们可以拦截内核空间中的任何系统调用等等。
此外,KernelSU 还通过 overlayfs 提供了一个模块系统,允许您将自定义插件加载到系统中。它还提供了一种修改 /system 分区中的文件的机制。
与 Magisk 的区别
虽然 KernelSU 模块和 Magisk 模块有很多相似之处,但由于它们实现机制完全不同,不可避免地存在一些差异。如果希望模块同时在 Magisk 和 KernelSU 上运行,就必须了解这些差异。
相似之处
- 模块文件格式:都使用 zip 格式组织模块,模块的格式几乎相同。
- 模块安装目录:都位于
/data/adb/modules。 - 系统化:都支持通过模块以一种非系统化方式修改
/system目录。 - post-fs-data.sh:执行时间和语义完全相同。
- service.sh:执行时间和语义完全相同。
- system.prop:完全相同。
- sepolicy.rule:完全相同。
- BusyBox:在启用 “独立模式” 的情况下,脚本都可以在 BusyBox 中运行。
差异
在理解差异之前,您需要知道如何区分您的模块是在 KernelSU 还是 Magisk 中运行。可以在所有可以运行模块脚本的地方(customize.sh、post-fs-data.sh、service.sh)使用环境变量 KSU 进行区分。在 KernelSU 中,此环境变量将设置为 true。
以下是一些差异:
- KernelSU 模块无法在 Recovery 模式下安装。
- KernelSU 模块没有内置对 Zygisk 的支持(但您可以通过 ZygiskNext 使用 Zygisk 模块)。
- KernelSU 模块替换或删除文件的方法与 Magisk 完全不同。KernelSU 不支持 .replace 方法。相反,您需要创建同名文件,使用 mknod filename c 0 0 命令来删除相应的文件。
- BusyBox 的目录不同。KernelSU 的内置 BusyBox 位于
/data/adb/ksu/bin/busybox,而 Magisk 位于/data/adb/magisk/busybox。请注意,这是 KernelSU 的内部行为,将来可能会更改! - KernelSU 不支持 .replace 文件;但是,KernelSU 支持 REMOVE 和 REPLACE 变量来删除或替换文件和文件夹。
- KernelSU 添加了 boot-completed 阶段,以便在启动完成时运行一些脚本。
- KernelSU 添加了 post-mount 阶段,以便在挂载 overlayfs 后运行一些脚本。
安装须知
检查设备是否支持
从 GitHub Releases 下载 KernelSU 管理器应用程序并将其安装到设备上:
- 如果应用程序显示“不支持”,则意味着应该自己编译内核,KernelSU 不会也不会为提供引导镜像以供刷入。
- 如果应用程序显示“未安装”,则设备由 KernelSU 官方支持。
对于显示“不支持”的设备,这里有一个非官方支持设备列表,可以自己编译内核。
备份原版 boot.img
在刷入之前,必须先备份原版 boot.img。如果遇到任何引导循环问题,可以随时使用 fastboot 将系统恢复到原版出厂引导。
刷入可能会导致数据丢失,请务必在继续下一步之前做好此步骤!也可以在必要时备份手机上的所有数据。
KMI
内核模块接口(KMI),具有相同 KMI 的内核版本是兼容的。这就是 GKI 中“通用”的含义;相反,如果 KMI 不同,则这些内核彼此不兼容,刷入与设备 KMI 不同的内核镜像可能会导致引导循环。
具体来说,对于 GKI 设备,内核版本格式应如下所示:
KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w .x .y -zzz -k -something
w.x-zzz-k 是 KMI 版本。例如,如果设备内核版本为 5.10.101-android12-9-g30979850fc20,则其 KMI 为 5.10-android12-9;理论上,它可以与其他 KMI 内核正常启动。
请注意,内核版本中的 SubLevel 不是 KMI 的一部分!这意味着 5.10.101-android12-9-g30979850fc20 与 5.10.137-android12-9-g30979850fc20 具有相同的 KMI!
安全补丁级别
较新的 Android 设备可能具有防止回滚的机制,这些机制不允许刷入具有旧安全补丁级别的引导镜像。例如,如果设备内核是 5.10.101-android12-9-g30979850fc20,其安全补丁级别为 2023-11;即使刷入与 KMI 相对应的内核,如果安全补丁级别低于 2023-11(例如 2023-06),则可能会导致引导循环。
因此,为了维护与 KMI 的对应关系,首选具有最新安全补丁级别的内核。
内核版本与 Android 版本
请注意:内核版本和 Android 版本不一定相同!
如果发现内核版本是 android12-5.10.101,但 Android 系统版本是 Android 13 或其他版本,请不要惊讶,因为 Android 系统的版本号不一定与 Linux 内核的版本号相同。 Linux 内核的版本号通常与设备出厂时附带的 Android 系统的版本相对应。如果 Android 系统稍后升级,内核版本通常不会更改。因此,在刷入任何内容之前,请始终参考内核版本!
如果设备是手机,建议优先考虑 LKM 模式;如果设备是模拟器、WSA 或 Waydroid,建议优先考虑 GKI 模式。
LKM 安装
获取官方固件
要使用 LKM 模式,需要获取官方固件并在官方固件的基础上进行修补;如果使用第三方内核,可以使用第三方内核的 boot.img 作为官方固件。
有许多方法可以获取官方固件。如果设备支持 fastboot boot,那么我们推荐最推荐且最简单的方法是使用 fastboot boot 临时启动 KernelSU 提供的 GKI 内核,然后安装管理器,最后直接在管理器中安装;这种方法不需要手动下载官方固件,也不需要手动提取 boot。
如果设备不支持 fastboot boot,那么可能需要手动下载官方固件包,然后从中提取 boot。
与 GKI 模式不同,LKM 模式将修改 ramdisk,因此在 Android 13 的设备上,它需要修补 init_boot 分区而不是 boot 分区;同时,GKI 模式始终操作 boot 分区。
使用管理器
打开管理器,点击右上角的安装图标,将出现几个选项:
- 选择并修补文件: 如果手机没有 root 权限,可以选择此选项,然后选择官方固件,管理器将自动修补它;只需要将这个修补后的文件刷入即可永久获得 root 权限。
- 直接安装: 如果手机已经获得 root 权限,可以选择此选项,管理器将自动获取设备信息,然后自动修补官方固件并将其刷入;可以考虑使用 fastboot boot KernelSU 的 GKI 内核来获取临时 root 并安装管理器,然后使用此选项;这也是升级 KernelSU 的主要方法。
- 安装到另一个分区: 如果设备支持 A/B 分区,可以选择此选项,管理器将自动修补官方固件,然后将其安装到另一个分区;这种方法适用于 OTA 后设备,可以在 OTA 后直接将其安装到另一个分区,然后重启设备。
使用命令行
如果不想使用管理器,也可以使用命令行来安装 LKM;KernelSU 提供的 ksud 工具可以帮助快速修补官方固件并将其刷入。
此工具支持 macOS、Linux 和 Windows。可以从 GitHub Release 下载相应的版本。
用法:ksud boot-patch
可以查看命令行帮助以获取特定选项。
oriole:/ # ksud boot-patch -h
Patch boot or init_boot images to apply KernelSU
Usage: ksud boot-patch [OPTIONS]
Options:
-b, --boot <BOOT> boot image path, if not specified, will try to find the boot image automatically
-k, --kernel <KERNEL> kernel image path to replace
-m, --module <MODULE> LKM module path to replace, if not specified, will use the builtin one
-i, --init <INIT> init to be replaced
-u, --ota will use another slot when boot image is not specified
-f, --flash Flash it to boot partition after patch
-o, --out <OUT> output path, if not specified, will use current directory
--magiskboot <MAGISKBOOT> magiskboot path, if not specified, will use builtin one
--kmi <KMI> KMI version, if specified, will use the specified KMI
-h, --help Print help
需要解释的几个选项:
--magiskboot选项可以指定 magiskboot 的路径。如果没有指定,ksud 将在环境变量中查找它;如果不知道如何获取 magiskboot,可以参考此。--kmi选项可以指定 KMI 版本。如果设备的内核名称不遵循 KMI 规范,可以通过此选项指定它。- 最常见的用法是:
ksud boot-patch -b <boot.img> --kmi android13-5.10