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

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

码农世界 2024-05-29 前端 127 次浏览 0个评论

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  bash
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform 
    (linux/amd64) and no specific platform was requested
362b7cad732c9471350d697eb5137f00a8108ed7b69741bd0ba749764f0bfca3
~:/ docker  exec  -it  cmi  bash

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

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

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

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

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

export ARCH=arm64
cd  /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_defconfig
make clean
make 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_defconfig
index 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-bak2
mv  /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 -v
origin 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 啤酒。

转载请注明来自码农世界,本文标题:《自定义小米10pro(代号cmi)的kernel内核,并开启安卓支持docker》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,127人围观)参与讨论

还没有评论,来说两句吧...

Top