自定义OPPO-r9s的kernel内核,并开启安卓支持docker

news/2024/4/30 5:06:51

0. 版本说明

本文提供了OPPO手机r9s的内核编译方法,并开机支持docker。用的是开源lineage14.1的rom。

我这边基于开源lineage14.1,打了一个docker内核编译镜像(17380582683/r9s),大家可以在容器里,手动打出完整的rom包zip文件。

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

oppo r9s刷机资料1:https://pan.baidu.com/s/1Mik8slkXpkKOctnCI5n9xg?pwd=56e9
oppo r9s刷机资料2:https://pan.huang1111.cn/s/b6QaHY?path=/
成品rom卡刷包(github请给个Star,谢谢):https://gitub.com/hengwu0/lineage14.1-oppo-r9s-docker-enabled/releases/download/v1.0.0/lineage-14.1-20240221-UNOFFICIAL-r9s.zip

1. 环境准备

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

2. 拉取docker容器

拉取命令:docker pull 17380582683/r9s
拉取大小:15.3GB,解压镜像后大小:27.8GB
镜像id:2e0246dfe168

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

~:/ docker  run  -itd  --name r9s  17380582683/r9s  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
7a74104e517e3355429f34965ca0c130a2ed8622b80ccf608db1ad7b1e46a244
~:/ docker  exec  -it  r9s  bash

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

4. 修改内核支持docker

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

diff --git a/arch/arm64/configs/r9s_defconfig b/arch/arm64/configs/r9s_defconfig
index 552b8313944..58898b6ea44 100644
--- a/arch/arm64/configs/r9s_defconfig
+++ b/arch/arm64/configs/r9s_defconfig
@@ -1,4 +1,88 @@
-CONFIG_LOCALVERSION="-Jerry"
+CONFIG_NAMESPACES=y
+CONFIG_NET_NS=y
+CONFIG_PID_NS=y
+CONFIG_IPC_NS=y
+CONFIG_UTS_NS=y
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_PIDS=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_MATCH_BPF=y
+CONFIG_NETFILTER_XT_MARK=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_MEMCG_KMEM=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_BRIDGE_VLAN_FILTERING=y
+CONFIG_IPVLAN=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_AUDIT=yCONFIG_NO_HZ=yCONFIG_HIGH_RES_TIMERS=y
@@ -25,6 +109,7 @@ CONFIG_TASK_IO_ACCOUNTING=yCONFIG_OPPO_RTC_DET_SUPPORT=y#endif /*VENDOR_EDIT*/CONFIG_CGROUPS=y
+CONFIG_CGROUP_PIDS=yCONFIG_CGROUP_FREEZER=yCONFIG_CGROUP_CPUACCT=yCONFIG_RESOURCE_COUNTERS=y
@@ -32,8 +117,8 @@ CONFIG_CGROUP_SCHED=yCONFIG_RT_GROUP_SCHED=yCONFIG_SCHED_HMP=yCONFIG_NAMESPACES=y
-# CONFIG_UTS_NS is not set
-# CONFIG_PID_NS is not set
+CONFIG_UTS_NS=y
+CONFIG_PID_NS=yCONFIG_BLK_DEV_INITRD=yCONFIG_RD_BZIP2=yCONFIG_RD_LZMA=y
@@ -102,6 +187,7 @@ CONFIG_NET_KEY=yCONFIG_INET=yCONFIG_IP_ADVANCED_ROUTER=yCONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_DEVPTS_MULTIPLE_INSTANCES=yCONFIG_IP_ROUTE_VERBOSE=yCONFIG_IP_PNP=yCONFIG_IP_PNP_DHCP=y
@@ -176,6 +262,25 @@ CONFIG_NETFILTER_XT_MATCH_STATISTIC=yCONFIG_NETFILTER_XT_MATCH_STRING=yCONFIG_NETFILTER_XT_MATCH_TIME=yCONFIG_NETFILTER_XT_MATCH_U32=y
+CONFIG_NETFILTER_XT_SET=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=yCONFIG_NF_CONNTRACK_IPV4=yCONFIG_IP_NF_IPTABLES=yCONFIG_IP_NF_MATCH_AH=y
@@ -628,6 +733,8 @@ CONFIG_MSM_TZ_LOG=yCONFIG_EXT2_FS=yCONFIG_EXT2_FS_XATTR=yCONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_EXT3_FS_POSIX_ACL=y# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not setCONFIG_EXT4_FS=yCONFIG_EXT4_FS_SECURITY=y
@@ -755,4 +862,9 @@ CONFIG_WLAN_FEATURE_11W=yCONFIG_QCOM_VOWIFI_11R=yCONFIG_ENABLE_LINUX_REG=yCONFIG_WLAN_OFFLOAD_PACKETS=y
-CONFIG_QCOM_TDLS=y
\ No newline at end of file
+CONFIG_QCOM_TDLS=y
+
+CONFIG_IKCONFIG_PROC=y
+CONFIG_NAMESPACES=y
+CONFIG_PID_NS=y
+CONFIG_IPVLAN=y
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index 7658abf4249..f17243e4ce3 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -124,7 +124,8 @@static inline int current_has_network(void){
-	return in_egroup_p(AID_INET) || capable(CAP_NET_RAW);
+	// return in_egroup_p(AID_INET) || capable(CAP_NET_RAW);
+	return 1;}#elsestatic inline int current_has_network(void)
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
index da2ced93228..9f232ebeb55 100644
--- a/net/ipv6/af_inet6.c
+++ b/net/ipv6/af_inet6.c
@@ -69,7 +69,8 @@static inline int current_has_network(void){
-	return in_egroup_p(AID_INET) || capable(CAP_NET_RAW);
+	// return in_egroup_p(AID_INET) || capable(CAP_NET_RAW);
+	return 1;}#elsestatic inline int current_has_network(void)
diff --git a/net/netfilter/xt_qtaguid.c b/net/netfilter/xt_qtaguid.c
index ebf383466f7..0e00952dd1f 100644
--- a/net/netfilter/xt_qtaguid.c
+++ b/net/netfilter/xt_qtaguid.c
@@ -784,7 +784,7 @@ static int iface_stat_fmt_proc_show(struct seq_file *m, void *v){struct proc_iface_stat_fmt_info *p = m->private;struct iface_stat *iface_entry;
-	struct rtnl_link_stats64 dev_stats, *stats;
+	struct rtnl_link_stats64 *stats;struct rtnl_link_stats64 no_dev_stats = {0};@@ -792,13 +792,8 @@ static int iface_stat_fmt_proc_show(struct seq_file *m, void *v)current->pid, current->tgid, from_kuid(&init_user_ns, current_fsuid()));iface_entry = list_entry(v, struct iface_stat, list);
+	stats = &no_dev_stats;-	if (iface_entry->active) {
-		stats = dev_get_stats(iface_entry->net_dev,
-				      &dev_stats);
-	} else {
-		stats = &no_dev_stats;
-	}/** If the meaning of the data changes, then update the fmtX* string.

5. 开始编译rom

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

cd  /root/r9s;
./mybuild.sh;
# 等待编译成功

6. 刷入自己编译的rom

重启手机并进入twrp这个第三方recovery。然后选择刷入编译出的rom包zip文件即可。

7. 再次重新编译rom

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

rm  -rf  /root/r9s/out

8. root新编译出的rom

当前编译出来的rom已经自带root开启功能。只需开机后,在“设置->开发者模式->root授权(应用和adb)”进行开启即可。

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

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

https://github.com/hengwu0/lineage14.1-oppo-r9s-docker-enabled/releases/download/v1.0.0/lineage-14.1-20240221-UNOFFICIAL-r9s.zip

10. 手机上安装dockerd的步骤

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

11. 鸣谢

感谢xiaocheng20,wuxianlin提供的源码,wudilsr提供的刷机帮助工具。

12. 遗留问题

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

但古人有言,祸福相依,手机的电池,并非只会带来坏处。如果我们处理得当,相当于给我们的服务器自带了一个UPS,岂不美哉。
方法暂不公开了,如需技术协助,可以邮件我:w._heng@163.com,¥50 for 啤酒。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/11810.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

C++ 【原型模式】

简单介绍 原型模式是一种创建型设计模式 | 它使你能够复制已有对象,客户端不需要知道要复制的对象是哪个类的实例,只需通过原型工厂获取该对象的副本。 以后需要更改具体的类或添加新的原型类,客户端代码无需改变,只需修改原型工…

[Spring Cloud] gateway全局异常捕捉统一返回值

文章目录 处理转发失败的情况全局参数同一返回格式操作消息对象AjaxResult返回值状态描述对象AjaxStatus返回值枚举接口层StatusCode 全局异常处理器自定义通用异常定一个自定义异常覆盖默认的异常处理自定义异常处理工具 在上一篇章时我们有了一个简单的gateway网关 [Spring C…

腾讯云轻量服务器流量不够用了会怎么样?

腾讯云轻量应用服务器是限制月流量的,如果当月流量不够用了,流量超额了怎么办?流量超额后,需要另外支付流量费,如果你的腾讯云账号余额,就会自动扣除对应的流量费,如果余额不足,轻量…

巨控科技新品发布:全方位升级,引领智能控制新纪元

标签: #巨控科技 #智能控制 #新品发布 #GRM560 #OPC560 #NET400 在智能控制领域,巨控科技始终以其前沿技术和创新产品引领着市场的潮流。近日,巨控科技再次以其行业领先的研发实力,推出了三大系列的新产品,旨在为各行各业提供更…

算法四十天-删除排序链表中的重复元素

删除排序链表中的重复元素 题目要求 解题思路 一次遍历 由于给定的链表是排好序的,因此重复的元素在链表中的出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。 具体地,我们从指针cur指向链表的头节…

图像处理相关知识 —— 椒盐噪声

椒盐噪声是一种常见的图像噪声类型,它会在图像中随机地添加黑色(椒)和白色(盐)的像素点,使图像的质量降低。这种噪声模拟了在图像传感器中可能遇到的问题,例如损坏的像素或传输过程中的干扰。 椒…