AI手机网,短视频直播 硬改改机 一键新机 群控软件 刷机定制

 找回密码
 立即注册
搜索
查看: 1772|回复: 5

红米K40内核KernelSU编译

[复制链接]
发表于 2023-4-6 10:48:05 | 显示全部楼层 |阅读模式
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 能工作更好,毕竟不用手动修改内核源码,省去很多麻烦。
  • kprobe设置
修改 defconfig 文件:

2编译环境搭建
  • 安装基础软件包


  1. sudo apt install -y bc bison build-essential curl flex g++-multilib gcc-multilib \
  2.                     git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev \
  3.                     lib32z1-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev \
  4.                     libssl-dev libxml2 libxml2-utils lzop pngcrush schedtool \
  5.                     squashfs-tools xsltproc zip zlib1g-dev unzip python2 prochains
复制代码
2 配置代理
鉴于目前国内很多地方存在 Github 污染,强烈建议配置好代理,如果你当前地区支持 Github 裸连接则可以跳过这个步骤。这里使用 proxychains 这个终端代理工具配置,代理工具请自行搭建。要看当前区域是否能连接 Github ,不使用代理在浏览器访问 https://github.com 看看能不能正常访问即可。
proxychains 工具配置文件在 /etc/proxychains.conf 文件,使用 vim 编辑文件:

  1. # 查看 Windows 本机IP,显示的 nameserver 即为本机IP,代理服务器需要
  2. cat /etc/resolv.conf
  3. # 编辑 proxychains文件,并添加对应配置
  4. # 格式: 代理协议 代理服务器IP(这里为Windows本机IP) 代理服务器端口(可在自己代理工具查看)
  5. sudo vim /etc/proxychains.conf
复制代码
比如我的配置:
代理配置好之后可以使用:proxychains <command> 执行 command 命令,command是指具体命令,比如使用代理下载文件:proxychains wget xxx.zip
3下载设备能使用的内核源码
这个可以到 [color=var(--color-primary)]Github 自行搜索,如果你的机型有类原生就简单了,到对应类原生项目源码仓库搜索你设备的内核源码即可。
Git 使用可以看这篇:[color=var(--color-primary)]Git基本使用 | TicksBlog
我这里使用 [color=hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.5)]Development - KERNEL (AOSP/MIUI) N0Kernel 2.4 | XDA Forums 为例:
  1. # 导航到用户根目录
  2. cd ~
  3. # 创建目录用来存放内核源码和一些编译工具
  4. mkdir Kernel && cd Kernel
  5. # 克隆 T 分支源码到当前目录下K40-N0目录,--depth=1只包含最近一次的提交信息,可以加快克隆
  6. # 如果你使用代理工具记得在命令前面加上 proxychains
  7. git clone -b T --depth=1 https://github.com/EmanuelCN/kernel_xiaomi_sm8250.git K40-N0
复制代码

4 下载 aarch64 编译工具
这里使用 clang 编译,较老的内核可能无法只使用 clang 编译,需要配合 gcc 编译。
下载 zyc-clang-14
  1. # 确保当前工作区在 ~/Kernel
  2. mkdir toolchains && cd toolchains
  3. # 克隆zyc-clang-14工具, 使用代理记得加 proxychains ,后面不再提示
  4. git clone --depth=1 https://github.com/EmanuelCN/zyc_clang-14.git zyc-clang
复制代码
5下载 KernelSU 源码和 AnyKernel3 工具
  1. # 确保当前在 ~/Kernel 目录
  2. # 进入内核源码目录
  3. cd K40-N0
  4. # 下载 KernelSU脚本并执行
  5. curl -o kernelsu-setup.sh "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh"
  6. bash kernelsu-setup.sh
  7. # 下载Anykernel3工具
  8. git clone --depth=1 https://github.com/osm0sis/AnyKernel3.git
复制代码
现在你工作区目录结构应该是这样
  1. Kernel
  2. ---- K40-N0
  3. -------- AnyKernel3
  4. -------- KernelSU
  5. -------- 内核文件
  6. ---- toolchains
  7. -------- zyc-clang
复制代码

3. KernelSU 非GKI补丁设置
默认情况下,KernelSU 对于 4.x 内核使用 kprobe 机制做内核相关 hook ,不过在一些内核中 kprobe 有问题,会导致内核刷入后无法开机,如果不确定当前内核 kprobe 是否正常工作可以使用官方提供的参考补丁,建议先使用 kprobe 看看是否能开机,如果不能开机再使用补丁方式,kprobe 能工作更好,毕竟不用手动修改内核源码,省去很多麻烦。
  • kprobe设置
修改 defconfig 文件:

  1. # 确保当前在内核源码根目录
  2. # 编辑 defconfig文件
  3. vim arch/arm64/configs/vendor/alioth_defconfig
  4. # 确保有以下配置
  5. CONFIG_KPROBES=y
  6. CONFIG_HAVE_KPROBES=y
  7. CONFIG_KPROBE_EVENTS=y
  8. # kprobe 依赖这个,部分内核没有启用,不启用编译时会报错
  9. CONFIG_MODULES=y
复制代码
建议先使用 vim 自带搜索功能查看是否有配置,没有配置则添加,如果有类似 # CONFIG_KPROBES is not set 文本,则取消注释变为:CONFIG_KPROBES=y 。
  • 打补丁(kprobe无法开机时才需要使用)
如果只使用 kprobe 能开机则不需要手动修改源码,已知 N0Kernel v2.4 需要手动打补丁,补丁可以参考 [color=var(--color-primary)]如何为非 GKI 内核集成 KernelSU | KernelSU

[color=var(--color-contrast-higher)]编译脚本编写
由于内核编译时参数和环境变量较多,通常都会写一个脚本文件,每次编译只需要简单修改下脚本,然后一键编译即可,编译 N0 内核配置文件如下,可以参考,不能照搬!
  1. #!/bin/bash
  2. ###########################
  3. #  a kernel build script
  4. ###########################

  5. ##
  6. #  some color setting
  7. ##
  8. cinfo="\x1b[38;2;79;155;250m"
  9. cwarn="\x1b[38;2;255;200;97m"
  10. cerror="\x1b[38;2;240;96;96m"
  11. cno="\x1b[0"


  12. echo -e "${cinfo}=============== Setup Some Export ===============${cno}"
  13. # 内核工作目录
  14. export KERNEL_DIR=$(pwd)
  15. # 内核 defconfig 文件
  16. export KERNEL_DEFCONFIG=vendor/alioth_defconfig
  17. # 编译临时目录,避免污染根目录
  18. export OUT=out
  19. # anykernel3 目录
  20. export ANYKERNEL3=${KERNEL_DIR}/AnyKernel3
  21. # 内核 zip 刷机包名称
  22. export KERNEL_ZIP_NAME="N0-KSU_Alioth_2.4.0.zip"
  23. # 刷机包打包完成后移动目录
  24. export KERNEL_ZIP_EXPORT="/home/ticks/Kernel"
  25. # clang 绝对路径
  26. export CLANG_PATH=/home/ticks/Kernel/toolchains/zyc-clang
  27. export PATH=${CLANG_PATH}/bin:${PATH}
  28. export CLANG_TRIPLE=aarch64-linux-gnu-
  29. # arch平台,这里时arm64
  30. export ARCH=arm64
  31. export SUBARCH=arm64
  32. # 只使用clang编译需要配置
  33. export LLVM=1
  34. export BUILD_INITRAMFS=1

  35. # 编译时线程指定,默认单线程,可以通过参数指定,比如4线程编译
  36. # ./build.sh 4
  37. TH_COUNT=1
  38. if [[ "" != "$1" ]]; then
  39.         TH_NUM=$1
  40. fi

  41. # 编译参数
  42. export DEF_ARGS="O=${OUT} \
  43.                                 CC=clang \
  44.                                 CXX=clang++ \
  45.                                 ARCH=${ARCH} \
  46.                                 CROSS_COMPILE=${CLANG_PATH}/bin/aarch64-linux-gnu- \
  47.                                 CROSS_COMPILE_ARM32=${CLANG_PATH}/bin/arm-linux-gnueabi- \
  48.                                 LD=ld.lld "
  49. export BUILD_ARGS="-j${TH_COUNT} ${DEF_ARGS}"

  50. echo -e "${cwarn}kernel workspace dir is => ${KERNEL_DIR}"
  51. echo -e "kernel build defonfig is => ${KERNEL_DEFCONFIG}"
  52. echo -e "build tmpdir is => ${KERNEL_DIR}/${OUT}"
  53. echo -e "anykernel3 workspace dir is => ${ANYKERNEL3}"
  54. echo -e "kernel zip name is => ${KERNEL_ZIP_NAME}"
  55. echo -e "kernel zip export dir is => ${KERNEL_ZIP_EXPORT}"
  56. echo -e "clang path is => ${CLANG_PATH}"
  57. echo -e "build arch/subarch is => ${ARCH} / ${SUBARCH}${cno}"
  58. # 等待10s,查看配置文件信息是否正确,不正确 Ctrl + C 及时取消
  59. sleep 10s

  60. echo -e "${cinfo}=============== Make defconfig ===============${cno}"
  61. # make defconfig
  62. make ${DEF_ARGS} ${KERNEL_DEFCONFIG}
  63. # 如果命令没有出错,继续执行,否则退出编译
  64. if [[ "0" != "$?" ]]; then
  65.         echo -e "${cerror}>>> make defconfig error, build stop!${cno}"
  66.         exit 1
  67. fi

  68. echo -e "${cinfo}=============== Make Kernel  ===============${cno}"
  69. make ${BUILD_ARGS}
  70. if [[ "0" != "$?" ]]; then
  71.         echo -e "${cerror}>>> build kernel error, build stop!${cno}"
  72.         exit 1
  73. fi
  74. echo -e "${cwarn}>>> build kernel success${cno}"
  75. sleep 3s

  76. # 使用 Anykernel3 制作刷机包
  77. echo -e "${cinfo}=============== Make Kernel Zip ==============="
  78. if test -e ${ANYKERNEL3}; then
  79.         if test -e ${KERNEL_DIR}/${OUT}/arch/${ARCH}/boot/dtbo.img; then
  80.                 if test -e ${KERNEL_DIR}/${OUT}/arch/${ARCH}/boot/Image.gz-dtb; then
  81.                         echo -e "${cwarn}move kernel files . . .${cno}"
  82.                         cp ${KERNEL_DIR}/${OUT}/arch/${ARCH}/boot/dtbo.img ${ANYKERNEL3}/
  83.                         cp ${KERNEL_DIR}/${OUT}/arch/${ARCH}/boot/Image.gz-dtb ${ANYKERNEL3}/
  84.                         echo -e "${cwarn}into anykernel3 workdir. . ."
  85.                         cd ${ANYKERNEL3}
  86.                         if test -e ./Image.gz-dtb; then
  87.                                 zip -r ${KERNEL_ZIP_NAME} ./*
  88.                                 test -e ./${KERNEL_ZIP_NAME} && mv ./${KERNEL_ZIP_NAME} ${KERNEL_ZIP_EXPORT}
  89.                                 echo -e "${cwarn} clean kernel files. . .${cno}"
  90.                                 test -e ./Image.gz-dtb && rm ./Image.gz-dtb
  91.                                 test -e ./dtbo.img && rm ./dtbo.img
  92.                         else
  93.                                 echo -e "${cerror}stopmake => kernel file not found!${cno}"
  94.                                 exit 1
  95.                         fi
  96.                 else
  97.                         echo -e "${cerror}stop make => Image.gz-dtb not found${cno}"
  98.                         exit 1
  99.                 fi
  100.         else
  101.                 echo -e "${cerror}stop make => dtbo.img not found${cno}"
  102.                 exit 1
  103.         fi
  104. else
  105.         echo -e "${cerror}stop build => anykernel3 dir not found${cno}"
  106.         exit 1
  107. fi
  108. exit 0
复制代码
这个脚本可以编译内核并自动生成刷机包,Anykernel3 需要自行修改脚本文件,并不是所有手机都能使用官方脚本,使用方法可以参考:[color=var(--color-primary)]Anykernel3 Github
K40 可以这样配置,我参考的 crdroid 内核的 Anykernel3 配置:

  1. ### AnyKernel3 Ramdisk Mod Script
  2. ## osm0sis @ xda-developers

  3. ### AnyKernel setup
  4. # begin properties
  5. properties() { '
  6. kernel.string=N0Kernel-KSU by ticks
  7. do.devicecheck=1
  8. do.modules=0
  9. do.systemless=1
  10. do.cleanup=1
  11. do.cleanuponabort=0
  12. device.name1=alioth
  13. device.name2=aliothin
  14. device.name3=
  15. device.name4=
  16. device.name5=
  17. supported.versions=
  18. supported.patchlevels=
  19. '; } # end properties

  20. ### AnyKernel install
  21. # begin attributes
  22. attributes() {
  23. set_perm_recursive 0 0 750 750 $ramdisk/*;
  24. } # end attributes


  25. ## boot shell variables
  26. block=/dev/block/bootdevice/by-name/boot;
  27. is_slot_device=1;
  28. ramdisk_compression=auto;

  29. # import functions/variables and setup patching - see for reference (DO NOT REMOVE)
  30. . tools/ak3-core.sh && attributes;

  31. # boot install
  32. dump_boot; # use split_boot to skip ramdisk unpack, e.g. for devices with init_boot ramdisk

  33. if [ -d $ramdisk/overlay ]; then
  34.   rm -rf $ramdisk/overlay;
  35. fi;

  36. write_boot; # use flash_boot to skip ramdisk repack, e.g. for devices with init_boot ramdisk
  37. ## 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/




发表于 2023-4-6 10:48:05 | 显示全部楼层
感谢客服指导
发表于 2023-4-6 10:48:16 | 显示全部楼层
这是真的吗
发表于 2023-4-6 10:48:31 | 显示全部楼层
可以解决了我的问题
发表于 2023-4-6 10:48:43 | 显示全部楼层
气氛不算太好,不过也可以
发表于 2023-4-6 10:48:59 | 显示全部楼层
感谢客服指导
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

技术交流售后群

QQ|小黑屋|手机版|站点找错-建议|AI手机网 |Sitemap



GMT+8, 2024-4-30 13:51 , Processed in 0.149191 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表