KernelSU 出来已经有一段时间,从原来只支持 5.x 内核的GKI内核到现在支持 4.x 内核,更多手机(特别是非GKI)可以通过自行编译内核获得体验。本文就以红米K40手机(内核版本4.19)为例,简单记录一下在 Windows 下通过 WSL2 编译内核,并支持 KernelSU 的大致步骤。
本文不是小白文章,按照这篇文章操作不一定能够成功,但是自己一步步操作,并通过百度等途径学习比如 Linux 命令行操作、Shell脚本编写等技能,最终编译出自己的内核是很有成就感的,或许就是这一次的成功,你将成为下一个内核高手!记住善于搜索引擎、ChatGPT、Github等。
1. WSL2环境搭建Windows下 WSL2 环境搭建不在本文章范围内,请参考微软官方教程 。 安装好 WSL2 后,到微软商店下载 Ubuntu 并安装初始化完成,Ubuntu尽量选择新一点的版本,软件包更新,之后可以在 Windows Terminal 直接使用 wsl -d Ubuntu 进入 WSL2 Ubuntu系统:
[color=var(--color-contrast-higher)]3. KernelSU 非GKI补丁设置默认情况下,KernelSU 对于 4.x 内核使用 kprobe 机制做内核相关 hook ,不过在一些内核中 kprobe 有问题,会导致内核刷入后无法开机,如果不确定当前内核 kprobe 是否正常工作可以使用官方提供的参考补丁,建议先使用 kprobe 看看是否能开机,如果不能开机再使用补丁方式,kprobe 能工作更好,毕竟不用手动修改内核源码,省去很多麻烦。 修改 defconfig 文件:
2编译环境搭建
- sudo apt install -y bc bison build-essential curl flex g++-multilib gcc-multilib \
- git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev \
- lib32z1-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev \
- libssl-dev libxml2 libxml2-utils lzop pngcrush schedtool \
- squashfs-tools xsltproc zip zlib1g-dev unzip python2 prochains
复制代码2 配置代理 鉴于目前国内很多地方存在 Github 污染,强烈建议配置好代理,如果你当前地区支持 Github 裸连接则可以跳过这个步骤。这里使用 proxychains 这个终端代理工具配置,代理工具请自行搭建。要看当前区域是否能连接 Github ,不使用代理在浏览器访问 https://github.com 看看能不能正常访问即可。 proxychains 工具配置文件在 /etc/proxychains.conf 文件,使用 vim 编辑文件:
- # 查看 Windows 本机IP,显示的 nameserver 即为本机IP,代理服务器需要
- cat /etc/resolv.conf
- # 编辑 proxychains文件,并添加对应配置
- # 格式: 代理协议 代理服务器IP(这里为Windows本机IP) 代理服务器端口(可在自己代理工具查看)
- sudo vim /etc/proxychains.conf
复制代码比如我的配置: 代理配置好之后可以使用:proxychains <command> 执行 command 命令,command是指具体命令,比如使用代理下载文件:proxychains wget xxx.zip 。 3下载设备能使用的内核源码 这个可以到 [color=var(--color-primary)]Github 自行搜索,如果你的机型有类原生就简单了,到对应类原生项目源码仓库搜索你设备的内核源码即可。 - # 导航到用户根目录
- cd ~
- # 创建目录用来存放内核源码和一些编译工具
- mkdir Kernel && cd Kernel
- # 克隆 T 分支源码到当前目录下K40-N0目录,--depth=1只包含最近一次的提交信息,可以加快克隆
- # 如果你使用代理工具记得在命令前面加上 proxychains
- git clone -b T --depth=1 https://github.com/EmanuelCN/kernel_xiaomi_sm8250.git K40-N0
复制代码
4 下载 aarch64 编译工具 这里使用 clang 编译,较老的内核可能无法只使用 clang 编译,需要配合 gcc 编译。 下载 zyc-clang-14 : - # 确保当前工作区在 ~/Kernel
- mkdir toolchains && cd toolchains
- # 克隆zyc-clang-14工具, 使用代理记得加 proxychains ,后面不再提示
- git clone --depth=1 https://github.com/EmanuelCN/zyc_clang-14.git zyc-clang
复制代码5下载 KernelSU 源码和 AnyKernel3 工具 - # 确保当前在 ~/Kernel 目录
- # 进入内核源码目录
- cd K40-N0
- # 下载 KernelSU脚本并执行
- curl -o kernelsu-setup.sh "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh"
- bash kernelsu-setup.sh
- # 下载Anykernel3工具
- git clone --depth=1 https://github.com/osm0sis/AnyKernel3.git
复制代码现在你工作区目录结构应该是这样 - Kernel
- ---- K40-N0
- -------- AnyKernel3
- -------- KernelSU
- -------- 内核文件
- ---- toolchains
- -------- zyc-clang
复制代码
3. KernelSU 非GKI补丁设置默认情况下,KernelSU 对于 4.x 内核使用 kprobe 机制做内核相关 hook ,不过在一些内核中 kprobe 有问题,会导致内核刷入后无法开机,如果不确定当前内核 kprobe 是否正常工作可以使用官方提供的参考补丁,建议先使用 kprobe 看看是否能开机,如果不能开机再使用补丁方式,kprobe 能工作更好,毕竟不用手动修改内核源码,省去很多麻烦。 修改 defconfig 文件:
- # 确保当前在内核源码根目录
- # 编辑 defconfig文件
- vim arch/arm64/configs/vendor/alioth_defconfig
- # 确保有以下配置
- CONFIG_KPROBES=y
- CONFIG_HAVE_KPROBES=y
- CONFIG_KPROBE_EVENTS=y
- # kprobe 依赖这个,部分内核没有启用,不启用编译时会报错
- CONFIG_MODULES=y
复制代码建议先使用 vim 自带搜索功能查看是否有配置,没有配置则添加,如果有类似 # CONFIG_KPROBES is not set 文本,则取消注释变为:CONFIG_KPROBES=y 。
[color=var(--color-contrast-higher)]编译脚本编写由于内核编译时参数和环境变量较多,通常都会写一个脚本文件,每次编译只需要简单修改下脚本,然后一键编译即可,编译 N0 内核配置文件如下,可以参考,不能照搬! 这个脚本可以编译内核并自动生成刷机包,Anykernel3 需要自行修改脚本文件,并不是所有手机都能使用官方脚本,使用方法可以参考:[color=var(--color-primary)]Anykernel3 Github 。 K40 可以这样配置,我参考的 crdroid 内核的 Anykernel3 配置:
- ### AnyKernel3 Ramdisk Mod Script
- ## osm0sis @ xda-developers
- ### AnyKernel setup
- # begin properties
- properties() { '
- kernel.string=N0Kernel-KSU by ticks
- do.devicecheck=1
- do.modules=0
- do.systemless=1
- do.cleanup=1
- do.cleanuponabort=0
- device.name1=alioth
- device.name2=aliothin
- device.name3=
- device.name4=
- device.name5=
- supported.versions=
- supported.patchlevels=
- '; } # end properties
- ### AnyKernel install
- # begin attributes
- attributes() {
- set_perm_recursive 0 0 750 750 $ramdisk/*;
- } # end attributes
- ## boot shell variables
- block=/dev/block/bootdevice/by-name/boot;
- is_slot_device=1;
- ramdisk_compression=auto;
- # import functions/variables and setup patching - see for reference (DO NOT REMOVE)
- . tools/ak3-core.sh && attributes;
- # boot install
- dump_boot; # use split_boot to skip ramdisk unpack, e.g. for devices with init_boot ramdisk
- if [ -d $ramdisk/overlay ]; then
- rm -rf $ramdisk/overlay;
- fi;
- write_boot; # use flash_boot to skip ramdisk repack, e.g. for devices with init_boot ramdisk
- ## end boot install
复制代码 [color=var(--color-contrast-higher)]内核编译脚本文件写好后编译就很方便了,执行 chmod +x build.sh && ./build.sh ,等待内核编译完成,没有报错就可以将 zip刷机包 移动到Windows目录刷入了。 Windows c、d、e盘都挂载在 /mnt/c 、/mnt/d 等目录,比如移动文件到 D盘根目录:mv ./N0-KSU_Alioth.zip /mnt/d/ 。
|