小工具知识网

当前位置: 首页 > 行业知识 > 自定义小米10pro(代号cmi)的kernel内核,并开启安卓支持docker

行业知识

自定义小米10pro(代号cmi)的kernel内核,并开启安卓支持docker

2026-11-10 14:31:43 来源:互联网转载

0. 版本说明

本文提供了小米10pro手机的内核编译方法,小米10pro手机代号是cmi。

我这边基于P404开源项目,打了一个docker内核编译镜像(17380582683/wh:v.1.0),大家可以在容器里,手动修改配置这个project-404-5.0-20220813-104358-SHINKA-cmi.zip包的内核。想打出完整的rom包zip文件,目前还没搞通,有兴趣的同学可以继续深入研究研究。

背景:网上找了一圈,好多只提供了内核源码,但尝试了一下总是编译出错。少有能编译出来的,刷上手机里也没能正常开机。最后还是找到了一个可用的版本,是国外P404组织开源出来的。

开源项目总入口:https://github.com/P-404/android_manifest 

cmi手机的版本总入口:GitHub - P404-Devices/device_xiaomi_cmi 

官方原始成品卡刷包下载地址:https://github.com/P404-Devices/device_xiaomi_cmi/releases/download/5.0/project-404-5.0-20220813-104358-SHINKA-cmi.zip

1. 环境准备

需要一台磁盘容量至少300G,内存32G的x64机器,然后安装好dockerd。

2. 拉取docker容器

拉取命令:docker pull  17380582683/wh:v.1.0

拉取大小:35.52GB,解压镜像后大小:78GB

镜像id:c250097005b8

v.1.0: digest: sha256:57cc3e41436e523551a0855f3c3d755176578e6fc423ea8b36519e7905e14367

3. 启动docker容器,然后进入容器

~:/ docker  run  -itd  --name cmi  17380582683/wh:v.1.0  bashWARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform     (linux/amd64) and no specific platform was requested362b7cad732c9471350d697eb5137f00a8108ed7b69741bd0ba749764f0bfca3~:/ docker  exec  -it  cmi  bash

上面的warning,可以直接忽略。是因为我的镜像就是在小米10pro手机搭的环境上传的,所以把它认为是一个arm64平台的镜像。其实这个镜像只能在x64机器上跑。

4. 修改安卓内核参数的方法

不修改内核,可以直接跳过此步骤,直接开始编译安卓内核。

方法一、直接修改内核配置文件cmi_defconfig
# 最好两个内核的配置文件同步一起修改vi  /root/p-404/kernel/xiaomi/sm8250/arch/arm64/configs/cmi_defconfigvi  /root/p-404/kernel/xiaomi/sm8250-bak/arch/arm64/configs/cmi_defconfig
方法二、先在图形化下修改一个内核配置文件,然后同步覆盖到另一个内核

1. 修改内核配置文件,切换至/root/p-404/kernel/xiaomi/sm8250目录,以旧的cmi_defconfig产生.config

export ARCH=arm64cd  /root/p-404/kernel/xiaomi/sm8250;make cmi_defconfig

2. 进入内核参数选单,开始修改内核配置文件。用上下键盘移动,选中下方Exit返回上一页(退出时记得选Save),Enter确认,空白键选取。找不到特定的CONFIG按/搜索,不然就问...谷歌。

make menuconfig

3. 修改完成后,用.config取代原本的cmi_defconfig。下一步make clean后.config会被删除。

cp .config arch/arm64/configs/cmi_defconfigmake cleanmake mrproper

4. 同步cmi_defconfig覆盖到另一个内核。

cp cmi_defconfig /root/p-404/kernel/xiaomi/sm8250-bak/arch/arm64/configs/cmi_defconfig

5. 修改内核支持docker

现在容器中的内核已经是修改过了,支持docker的版本。我的修改内容记录如下:

diff --git a/arch/arm64/configs/cmi_defconfig b/arch/arm64/configs/cmi_defconfigindex a0a7ffd4a906..d7efc88aedb9 100644--- a/arch/arm64/configs/cmi_defconfig+++ b/arch/arm64/configs/cmi_defconfig@@ -1,3 +1,82 @@+CONFIG_NAMESPACES=y+CONFIG_NET_NS=y+CONFIG_PID_NS=y+CONFIG_IPC_NS=y+CONFIG_UTS_NS=y+CONFIG_CGROUPS=y+CONFIG_CGROUP_CPUACCT=y+CONFIG_CGROUP_DEVICE=y+CONFIG_CGROUP_FREEZER=y+CONFIG_CGROUP_SCHED=y+CONFIG_CPUSETS=y+CONFIG_MEMCG=y+CONFIG_KEYS=y+CONFIG_VETH=y+CONFIG_BRIDGE=y+CONFIG_BRIDGE_NETFILTER=y+CONFIG_IP_NF_FILTER=y+CONFIG_IP_NF_TARGET_MASQUERADE=y+CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y+CONFIG_NETFILTER_XT_MATCH_IPVS=y+CONFIG_NETFILTER_XT_MARK=y+CONFIG_NETFILTER_XT_SET=y+CONFIG_IP_NF_NAT=y+CONFIG_NF_NAT=y+CONFIG_POSIX_MQUEUE=y+CONFIG_NF_NAT_IPV4=y+CONFIG_NF_NAT_NEEDED=y+CONFIG_CGROUP_BPF=y+CONFIG_USER_NS=y+CONFIG_SECCOMP=y+CONFIG_SECCOMP_FILTER=y+CONFIG_CGROUP_PIDS=y+CONFIG_MEMCG_SWAP=y+CONFIG_MEMCG_SWAP_ENABLED=y+CONFIG_IOSCHED_CFQ=y+CONFIG_CFQ_GROUP_IOSCHED=y+CONFIG_BLK_CGROUP=y+CONFIG_BLK_DEV_THROTTLING=y+CONFIG_CGROUP_PERF=y+CONFIG_CGROUP_HUGETLB=y+CONFIG_NET_CLS_CGROUP=y+CONFIG_CGROUP_NET_PRIO=y+CONFIG_CFS_BANDWIDTH=y+CONFIG_FAIR_GROUP_SCHED=y+CONFIG_RT_GROUP_SCHED=y+CONFIG_IP_NF_TARGET_REDIRECT=y+CONFIG_IP_VS=y+CONFIG_IP_VS_NFCT=y+CONFIG_IP_VS_PROTO_TCP=y+CONFIG_IP_VS_PROTO_UDP=y+CONFIG_IP_VS_RR=y+CONFIG_SECURITY_SELINUX=y+CONFIG_SECURITY_APPARMOR=y+CONFIG_EXT4_FS=y+CONFIG_EXT4_FS_POSIX_ACL=y+CONFIG_EXT4_FS_SECURITY=y+CONFIG_VXLAN=y CONFIG_BRIDGE_VLAN_FILTERING=y+CONFIG_CRYPTO=y CONFIG_CRYPTO_AEAD=y+CONFIG_CRYPTO_GCM=y+CONFIG_CRYPTO_SEQIV=y+CONFIG_CRYPTO_GHASH=y CONFIG_XFRM=y+CONFIG_XFRM_USER=y+CONFIG_XFRM_ALGO=y+CONFIG_INET_ESP=y+CONFIG_INET_XFRM_MODE_TRANSPORT=y+CONFIG_IPVLAN=y+CONFIG_MACVLAN=y+CONFIG_DUMMY=y+CONFIG_NF_NAT_FTP=y+CONFIG_NF_CONNTRACK_FTP=y+CONFIG_NF_NAT_TFTP=y+CONFIG_NF_CONNTRACK_TFTP=y+CONFIG_AUFS_FS=y+CONFIG_BTRFS_FS=y+CONFIG_BTRFS_FS_POSIX_ACL=y+CONFIG_BLK_DEV_DM=y+CONFIG_DM_THIN_PROVISIONING=y+CONFIG_OVERLAY_FS=y CONFIG_LOCALVERSION="-perf" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_AUDIT=y@@ -236,6 +315,24 @@ CONFIG_NETFILTER_XT_MATCH_STATISTIC=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TIME=y CONFIG_NETFILTER_XT_MATCH_U32=y+CONFIG_IP_SET=y+CONFIG_IP_SET_MAX=256+CONFIG_IP_SET_BITMAP_IP=y+CONFIG_IP_SET_BITMAP_IPMAC=y+CONFIG_IP_SET_BITMAP_PORT=y+CONFIG_IP_SET_HASH_IP=y+CONFIG_IP_SET_HASH_IPMARK=y+CONFIG_IP_SET_HASH_IPPORT=y+CONFIG_IP_SET_HASH_IPPORTIP=y+CONFIG_IP_SET_HASH_IPPORTNET=y+CONFIG_IP_SET_HASH_IPMAC=y+CONFIG_IP_SET_HASH_MAC=y+CONFIG_IP_SET_HASH_NETPORTNET=y+CONFIG_IP_SET_HASH_NET=y+CONFIG_IP_SET_HASH_NETNET=y+CONFIG_IP_SET_HASH_NETPORT=y+CONFIG_IP_SET_HASH_NETIFACE=y+CONFIG_IP_SET_LIST_SET=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y@@ -777,3 +874,5 @@ CONFIG_SCHEDSTATS=y CONFIG_DEBUG_LIST=y CONFIG_IPC_LOGGING=y CONFIG_DEBUG_ALIGN_RODATA=y+CONFIG_NAMESPACES=y+CONFIG_PID_NS=y

6. 开始编译内核

目前的这个编译内核的环境,稍微有点点问题,需要编译两次内核才行(这也是为啥上一步中,要求2个内核的配置文件一起同时修改)。但是编译后的内核已确认是可以在手机上正常运行的。后面有时间后,再做优化修复。

进入容器内部,执行如下命令进行内核编译。

cd  /root/p-404;./mybuild.sh;# 然后等待编译失败,然后修改kernel目录mv  /root/p-404/kernel/xiaomi/sm8250  /root/p-404/kernel/xiaomi/sm8250-bak2mv  /root/p-404/kernel/xiaomi/sm8250-bak  /root/p-404/kernel/xiaomi/sm8250# 上面的两个动作,就是将现在的LineageOS的内核,换为P404-Devices的内核# 然后再次编译,即可编译成功./mybuild.sh;  
补充:如何确认当前编译的内核是LineageOS的内核,还是P404-Devices的内核?

我们可以进入内核目录,执行命令 git  remote  -v,可以看到当前的内核分支来源。示例如下:

root@67ba4c3d3c19:~/p-404/kernel/xiaomi/sm8250# git remote -vorigin https://github.com/P404-Devices/kernel_xiaomi_sm8250.git (fetch)origin https://github.com/P404-Devices/kernel_xiaomi_sm8250.git (push)

7. root新编译出的内核

使用 magisk面具 app来将新编译的boot.img植入开放root。方法网上有很多教程,大致是:

1. 将boot.img传入手机;

2. 打开magisk面具app,点击 Magisk 卡片中的“安装”按钮,接下来点击“选择并修补一个文件”。

3. 选择之前编译出来的 boot.img,然后等待生成修补文件。

4. 将生成的修补文件复制到电脑上(修补文件默认保存在手机内部存储 Download 目录)。

8. 刷入自己编译的内核

0. 小米10pro手机最好提前刷入好了这个rom:project-404-5.0-20220813-104358-SHINKA-cmi.zip 。

1. 重启手机,进入fastboot模式。有两种方法进入fastboot模式:

        方法一.  手机连上电脑adb,然后再adb里输入reboot recovery,手机自动重启进入recovery模式。

        方法二.  正常关机,然后同时按住开机键和音量上键,手机开机进入recovery模式。

2. 手机连接电脑,执行命令fastboot.exe flash boot new-boot.img,刷入刚编译出来的新内核文件new-boot.img。

3. 执行命令fastboot.exe  reboot,手机重启正常开机。

9. 再次重新编译内核

因为一般修改内核会频繁的进行重编、刷机、测试、再重编的反复过程。所以想再次重编内核可以删除此目录,即可清理掉之前的编译中间文件。命令为:

rm  -rf  /root/p-404/out

10. 已经改造好的,支持docker功能的卡刷包

考虑到有些同学只需要最终结果包就行了,也不会去折腾编内核。这边贴上,我已改造好,支持docker的rom包:(github请给个Star,谢谢)

https://github.com/hengwu0/cmi-p404-docker-enabled/releases

11. 手机上安装dockerd的步骤

这个请看下一篇文章:安卓手机部署ubuntu的lxc容器,并安装好dockerd

12. 遗留问题

如果要拿手机当服务器来跑docker,还需要解决电池的问题。因为既然是跑服务,肯定是24小时接电源适配器的,这样时间长了,手机电池绝对遭不住。轻则鼓包漏气、后盖起翘,重则起火就得不偿失了。本人可不承担,请自行承担后果哦。

但古人有言,祸福相依,手机的电池,并非只会带来坏处。如果我们处理得当,相当于给我们的服务器自带了一个UPS,岂不美哉。

方法暂不公开了,如需技术协助,可以邮件我:w._heng@163.com,¥50 for 啤酒。

上一篇:【linux c多线程】线程的创建,线程信息的获取,获取线程返回值

下一篇:jq图片路径替换秘籍,轻松搞定图片链接修改!