文章参阅:Ivon_Huang(B站)

目前状态:待完工…

请先看一下总结再决定是否看下去。

在termux中进行检查

检查当前kernel缺少的内容

1
2
3
4
5
pkg install wget
wget https://raw.githubusercontent.com/moby/moby/master/contrib/check-config.sh
chmod +x check-config.sh
sed -i '1s_.*_#!/data/data/com.termux/files/usr/bin/bash_' check-config.sh
sudo ./check-config.sh

image-20220920160952509

来到计算机(Centos7 VM虚拟机)

先更新一下软件包

1
yum upgrade -y --skip-broken

创建customkernel文件夹

在文件夹下,下载kernel源代码

1
git clone https://github.com/radcolor/android_kernel_xiaomi_whyred.git

image-20220920183641632

image-20220920183656029

进入源代码目录下

导入环境变量

1
2
3
export ARCH=arm64
export CROSS_COMPILE=~/文档/customkernel/gcc-arm64-gcc-master/bin/aarch64-elf-
export CROSS_COMPILE_ARM32=~/文档/customkernel/gcc-arm-gcc-master/bin/arm-eabi-
1
2
3
4
export ARCH=arm64
export CROSS_COMPILE=/root/customkernel/gcc-arm64-gcc-master/bin/aarch64-elf-
export CROSS_COMPILE_ARM32=/root/customkernel/gcc-arm-gcc-master/bin/arm-eabi-

image-20220920184604785

按照机型_config档案产生设置,该档案通常在arch/arm64/configs

1
2
3
4
#源码目录
cd /root/customkernel/android_kernel_xiaomi_whyred
make whyred_defconfig
#輸出: configuration written to .config

报错解决方案:

1
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
  1. [version `GLIBCXX_3.4.20’ not found](https://www.jianshu.com/p/050b2b777b9d
    )
1
strings /lib64/libc.so.6 | grep GLIBC
  1. [version `GLIBC_2.33’ not found](https://blog.csdn.net/dm569263708/article/details/125201512)
  2. [version `GLIBC_2.34’ not found ](https://blog.csdn.net/dm569263708/article/details/125201512) 这两个花了好久时间
  3. [/lib64/libc.so.6: symbol __tunable_get_val, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference 这个错误很严重,请不要退出ssh会话或重启系统,否则会再也打不开!!!!](/lib64/libc.so.6: symbol __tunable_get_val, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference 这个错误)
  4. A compiler with support for C++11 language features is required.
  5. LINUX These critical programs are missing or too old: make python bison compiler (python直接 yum install python3即可)
  6. LINUX These critical programs are missing or too old: bison (直接yum install bison解决)

更换系统重试(Lubuntu 22.04.1 VM虚拟机)

lubuntu-22.04.1-desktop-amd64

开启sshd,用moba传文件,这样会方便点,就不用再clone那个哈皮源码了,前提是你之前保存了源码在本地。

开始操作

先更新软件包,再安装套件

1
2
3
4
5
apt-get update
sudo apt install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev \
gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev \
x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev \
libxml2-utils xsltproc unzip bc

提取镜像

1
dd if=/dev/block/bootdevice/by-name/boot of=/sdcard/stockboot.img

进入内核源码文件夹

我把文件放在“/home”下了,请根据自己的路径修改下方的export

1
2
3
export ARCH=arm64
export CROSS_COMPILE=/home/customkernel/gcc-arm64-gcc-master/bin/aarch64-elf-
export CROSS_COMPILE_ARM32=/home/customkernel/gcc-arm-gcc-master/bin/arm-eabi-

创建档案

1
2
cd /home/customkernel/android_kernel_xiaomi_whyred
make whyred_defconfig

编译内核

1
2
mv /home/customkernel/android_kernel_xiaomi_whyred/arch/arm64/boot/Image.gz-dtb /home/customkernel/AIK-Linux/boot.img-kernel
make -j 8

报错

终于终于!!!

arch/arm64/boot/Image.gz-dtb

你终于出现了~

image-20220922123636288

接下来将Boot.img和image.gz-dtb档案放在AIK-Linux解压后的文件夹下

image-20220922123846714

在该目录下执行,解开boot.img

1
sudo ./unpackimg.sh boot.img

image-20220922124142593

image-20220922124101024

进入解开后生成的split_img文件,将boot.img-kernel替换成我们编译生成的image.gz-dtb文件(需要改名)

image-20220922124402228

重新打包,生成了一个新的镜像文件

1
./repackimg.sh

image-20220922125451058

接下来只需要将img刷入手机即可!!!!

注意先备份boot分区,失败可以恢复到原来的boot

如果出现反复重启,开不了机,就只能重新debug了。

image-20220922130944849

刷入成功!


开始正事,开放kernel功能!

进入源码目录,开启kconfig菜单(建议在ssh工具中进行)

1
make menuconfig

image-20220922131718702

cgroup

image-20220922133112167

image-20220922183640705

image-20220922133031936

linux内核配置iptables

再次编译报错

  • error: implicit declaration of function ‘vmalloc’; did you mean ‘kmalloc’? [-Werror=implicit-function-declaration]
    237 | *buf = vmalloc(size + ecc_notice_size + 1);
    | ^~~~~~~
    | kmalloc

挂载cgroup

1
sudo mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup

启用docker

1
sudo dockerd --iptables=false

总结

前面使用Centos进行操作,但由于更新glibc库过于困难,所以放弃该系统,如果你的系统满足条件的话,可以直接进行操作。


目前为止(2022/9/25),我自己编译的内核在开启某些特定功能时,输入手机出现反复重启现象。


最终,我采用ivon大佬提供的现成的img镜像,刷入lineageos系统,成功开启了docker。