KernelSU – Android 设备深层次系统控制的内核级 Root 解决方案

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

file

特性

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

官方链接

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注