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

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.mzph.cn/news/799190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud Alibaba Sentinel 实现熔断功能

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第十六篇,即使用 Sentinel 实现熔断功能。 二、 Ribbon 系列 首先我们新建两个服务的提供者…

vue3 keep-alive include失效问题

在使用vue3 keep-alive时&#xff0c;发现并没有起作用, 代码如下&#xff1a; <template><div class"app-main"><router-view v-slot"{ Component }"><keep-alive :include"cachedViews && cachedViews.map((x:any) &…

[StartingPoint][Tier1]Pennyworth

Important Jenkins是一个用于自动化构建、测试和部署软件项目的开源持续集成和持续部署&#xff08;CI/CD&#xff09;工具。它允许开发团队自动执行和监控在软件开发过程中的重复性任务&#xff0c;例如构建代码、运行测试、部署应用程序等。Jenkins提供了一个易于使用的Web界…

python使用selenium模拟人工操作

概述 有时候业务中的一些固定流程的测试环境需要重复执行很多次&#xff1b;这种场景其实可以用python的selenium库模拟用户手动点击输入&#xff0c;实现自动化测试&#xff1b; 我这边的python版本是 Python 3.6.7rc2 demo # codingutf-8 import time import logging imp…

Debian 安装 python 3.9.6

安装相关依赖 sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl libbz2-dev 下载Python 源码 wget https://mirrors.aliyun.com/python-release/source/Py…

基于R语言BIOMOD2模型的物种分布模拟

随着生物多样性全球大会的举办&#xff0c;不论是管理机构及科研单位、高校都在积极准备&#xff0c;根据国家林草局最新工作指示&#xff0c;我国将积极整合、优化自然保护地&#xff0c;加快推进国家公园体制试点&#xff0c;构建以国家公园为主体的自然保护地体系。针对我国…

Spring 如何优雅的灵活的Http重试

1、背景说明 在互联网时代&#xff0c; 不同系统之间大多数是通过http调用&#xff0c;调用过程中会超时、异常等过种问题。为了保证业务稳定&#xff0c;http 重试是常用方案。下面列举几种方案。 2、Http重试方案介绍 2.1 传统方案 1、使用传统的递归调用&#xff0c;实现方…

SQL 注入之 Windows/Docker 环境 SQLi-labs 靶场搭建!

在安全测试领域&#xff0c;SQL注入是一种常见的攻击方式&#xff0c;通过应用程序的输入执行恶意SQL查询&#xff0c;从而绕过认证和授权&#xff0c;可以窃取、篡改或破坏数据库中的数据。作为安全测试学习者&#xff0c;如果你要练习SQL注入&#xff0c;在未授权情况下直接去…

深入浅出 -- 系统架构之负载均衡Nginx实现高可用

一、Nginx的高可用 线上如果采用单个节点的方式部署Nginx&#xff0c;难免会出现天灾人祸&#xff0c;比如系统异常、程序宕机、服务器断电、机房爆炸、地球毁灭....哈哈哈&#xff0c;夸张了。但实际生产环境中确实存在隐患问题&#xff0c;由于Nginx作为整个系统的网关层接入…

安卓手机APP开发的音频和视频概述

安卓手机APP开发的音频和视频概述 目录 概述 Jetpack Media3 回放组件 Media3 MediaSession MediaSessionService MediaController MeidaBrowser Media3 Exoplayer 编辑组件 Media3 Transformer Effects EditedMediaItem UI组件 Media3 UI Jetpack MediaRouter…

anylabeling使用和安装

源码地址&#xff1a; git clone https://github.com/vietanhdev/anylabeling.git Auto Labeling with Segment Anything Youtube Demo: https://www.youtube.com/watch?v5qVJiYNX5KkDocumentation: https://anylabeling.nrl.ai Features: Image annotation for polygon, r…

利用Leaflet + React:构建WEBGIS

React是 Facebook 开发的一个开源库&#xff0c;用于构建用户界面。就其本身而言&#xff0c;Leaflet是一个用于将地图发布到网络的JavaScript 库。这两个工具的组合很简单&#xff0c;允许您创建动态网络地图。在本文中&#xff0c;我们将看到这种组合的一些特征以及一些简单的…

查找题(二分解法c++)

文章目录 【深基13.例1】查找题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示代码如下&#xff1a; 【深基13.例1】查找 题目描述 输入 n n n 个不超过 1 0 9 10^9 109 的单调不减的&#xff08;就是后面的数字不小于前面的数字&#xff09;非负整数 a 1 , a…

数据结构DAY3--栈与队列

栈&#xff1a; 是一种只能从一端操作的表&#xff0c;规则为先进后出。 主要操作步骤为&#xff1a;1.建立相关结构体 2.建立栈 3.增加栈 4.获得栈顶值 5.删除 6.修改 7.销毁 1.建立两个结构体 一个为链栈&#xff0c;一个为结点&#xff0c;链栈包括栈头&#xff08;指针…

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络…

java数据结构与算法刷题-----LeetCode367. 有效的完全平方数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 自实现Math.sqrt()函数&#xff1a;牛顿迭代法 自实现Math.sqrt(…

Redis单线程 VS 多线程

一、Redis 为什么选择单线程&#xff1f; 这种说法其实并不严谨&#xff0c;为什么这么说呢&#xff1f; Redis的版本有很多 3.x、4.x、6.x&#xff0c;版本不同架构也不同的&#xff0c;不限定版本问是否单线程也是不太严谨。 版本3.x&#xff0c;最早版本&#xff0c;也就…

项目架构MVC,DDD学习

写在前面 本文一起看下项目架构DDD&#xff0c;MVC相关的内容。 1&#xff1a;MVC 不管我们做什么项目&#xff0c;自己想想其实只是做了三件事&#xff0c;如下&#xff1a; 其实&#xff0c;这三件事完全在一个类中做完也可以可以正常把项目完成的&#xff0c;就像下面这…

【MacBook系统homebrew镜像记录】

安装 使用Homebrew 国内源安装脚本,贼方便&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"切换至清华大学镜像源&#xff1a; 命令合并&#xff1a; 分别切换了 brew.git、 homebrew-core.git、 homebrew-…

逆向案例十二——看准网企业信息json格式的信息

网址&#xff1a;【全国公司排行|排名榜单|哪家好】-看准网 打开开发者工具——刷新——网络——XHR——下滑页面加载新的页面——找到数据包 发现参数加密&#xff0c;返回的数据也进行了加密 按关键字在下方搜索 kiv进入第一个js文件 ctrlf打开文件里面的搜索框继续搜kiv找到…