Skip to content

内核编译流程

  • 拉取适合本机型的内核源码
  • 下载内核编译工具
  • 配置内核编译环境编译
  • 修改编译内核配置
  • 手机刷内核

拉取内核源码

根据手机运行的系统从github上获取内核的源码,一般有官方开源的内核(较难编译)、第三方原生系统的内核。

对应的开源内核版本一般根据处理器型号进行对应。一般在arch/arm64/config 中存在机型对应的配置。

第三方原生系统在xda中一般会连带对应的kernel地址。

小米官方源码地址

下载内核编译工具

内核编译工具有多种,不同的内核可能需要不同的编译工具。推荐下载,其中包含多种gcc编译工具使用。

配置内核编译环境

内核编译需要配置一些环境变量:

sh
export ARCH=arm64
export SUBARCH=arm64
export CROSS_COMPILE=内核编译工具的路径,一般到aarch64-linux-gnu-
export CROSS_COMPILE32=32为内核编译工具的路径,一般到aarch64-linux-gnu-
# 选择内核编译的配置,如小米5:gemini 一般在arch/arm64/config 中存在机型对应的配置。


<NolebasePageProperties />




make O=out 机型代码_defconfig
# 对内核进行编译,一般需要10分钟以上 $(nproc)是多线程,一般cpu数*2
make O=out -j$(nproc)

# 如在编译时环境变量不生效,可将变量带到make中
# 如: make ARCH=arm64 SUBARCH=arm64 gemini_defconfig

修改编译内核配置

sh
# 在选择机型配置之后进行,命令执行后会开启修改配置的页面
# 使用说明: / 可以开启搜索功能,输入配置键名称,可以查询到是否开启 y开启  n关闭 存在多个时有需要,按对应数字和进行跳转
# 部分选项的开启依赖于其他配置项 depends下配置,需要将依赖项开启后该配置项才是开启状态
make menuconfig

# 配置修改后,可对内核进行编译。
# 注意:部分选项开启后可能会导致手机不开机!

手机刷内核

方式一:使用AIK

XDA下載Linux版Android Image Kitchen (點選文中的AIK-Linux-v3.8-ALL.tar.gz附件)

  1. 使用aik需要获取手机的boot.img,提取方式:

手機進入TWRP → Advanced → Terminal,使用dd指令從手機提取原廠的boot.img。

sh
dd if=/dev/block/bootdevice/by-name/boot of=/sdcard/stockboot.img
  1. 将提取到的boot.img文件放到下载的aik解压目录中,将img解包得到split_img目录

    ./unpackimg.sh stockboot.img
  2. 将split_img目录中的stockboot.img-kernel替换成编译完成后的Image.gz-dtb(编译完成后会在arch/arm64/boot 目录中生成该文件)

  3. 在aik的解压目录中,将img重新打包,得到image-new.img刷入到手机boot分区。

    sh
    ./repackimg.sh

内核编译开启docker示例:小米5

内核开启过程需先进行编译,测试是否编译成功,和手机刷入后是否正常启动。

预编译

  1. 下载内核源码,本例子使用的是Floppy Kernel内核,其中存在build.sh脚本,可搭配内核编译以脚本方式直接编译源码。

    注意,内核编译工具是与内核文件夹同一路径的Toolchain文件夹下。

  2. 在内核文件夹执行 ./build.sh 脚本,需先授予执行权限chmod 777 build.sh

  3. 根据脚本选择机型和编译工具,如需编译配置,需要先退出脚本,参考 修改编译内核配置 进行配置,配置后重新执行脚本。(需选择机型)

  4. 第五六步执行完成后,内核编译就完成了,参考 手机刷内核 将编译的内核刷入手机(注意备份原内核)。

开启docker

  1. 手机执行检测脚本,需先安装termux并root。

    安装ssh

    sh
    pkg install openssh
    
    # 设置密码
    passwd
    # 查看用户
    whoami
    # 查看ip
    ip addr
    ifconfig
    # 开启ssh
    sshd
    sh
    pkg install tsu
    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

    脚本执行结果中Generally Necessary下面必须要全部是绿色才有可能安装Docker,其他 尽量保持全绿

    注意:部分选项内核中不存在,部分选项开启后可能会导致手机无法启动。如:测试的小米5的btrfs下配置开启会导致无法开机

  2. 对内核配置进行编译

    在预编译的第三步,将检测脚本中的红色项进行开启,全部开启后进行编译刷入到手机。

  3. 手机安装docker

    sh
    apt update && apt upgrade -y
    pkg install root-repo
    pkg install golang make cmake ndk-multilib tsu tmux docker
  4. 启动docker

    sh
    sudo DOCKER_RAMDISK=true dockerd --iptables=false
    # 后台启动
    sudo dockerd --iptables=false &>/dev/null &
    
    
    # 测试功能
    sudo docker run hello-world
    
    # 如果有需要使用如下指令挂载cgroup
    sudo mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup

    注意事项:

    docker网络需使用 net 模式,访问网络需要带 dns 及在doker运行时添加

    --net=host  --dns=114.114.114.114

    termux安装的服务的路径是在 /data/data/com.termux/files/usr 下,docker 默认的文件格式有可能不支持,需要修改daemon.json 文件中的文件格式,docker才能正常启动

    文件默认位置不在 Termux 数据目录,在系统根目录 data/docker/

  5. 安装服务

    sh
    # 安装Portainer
    sudo docker run -d -p 9000:9000 --name Portainer --net=host --restart=always -v /data/docker/run/docker.sock:/var/run/docker.sock portainer/portainer
    
    # 安装mysql
    sudo docker run -p 3306:3306 --net=host --name mysql --privileged=true -v /data/data/com.termux/files/home/mysql/log:/var/log/mysql -v /data/data/com.termux/files/home/mysql/data:/var/lib/mysql -v /data/data/com.termux/files/home/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql/mysql-server

参考文章

手机搭建docker教程

小米5内核编译

手机运行Docker: 从修改内核到刷入原生Linux | yzddMr6's Blog

獨立編譯Android kernel(核心),以小米手機為例 | Ivon的部落格

小米mix2s的docker支持 来自 微光浮华 - 酷安