找回密码
 立即注册
img_loading
智能检测中

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
查看: 9597|回复: 12

安卓手机直接运行Docker,变小NAS,可行?可行!!

[复制链接]
发表于 2024-7-3 16:00 | 显示全部楼层 |阅读模式
本帖最后由 gogoliu 于 2024-7-3 16:18 编辑

n  背景
肯定很多人想过,能不能把旧手机废物利用,变成一个NAS,装上xiaoya等docker,看看电影还是不错的。我即是其中之一。
于是开始了折腾之路,参考了不少文章,终于实现了在Android手机上直接支持了Docker,并成功安装了Portainer、Alist、ddns、Xiaoya等。因为从恩山论坛各位大佬学到很多,所以把自己折腾的一点心得也共享在此,供大家参考和批评。也希望籍此能启发一些更好的玩法。有说的不对的地方,请大家指正。
特别说明:本过程中以三星S9+国行版(SM-G9650,高通骁龙Snapdragon 845芯片,项目代号star2qltechn)为例,手机会清除数据,并且最后是root状态,去除了SELinux功能,所以请提前备份并转移手机中的重要数据,并且放弃以后在手机中存储个人私密信息等重要数据,避免泄漏。本人才疏学浅,不对数据的安全性和文章的完整性负责,请慎重斟酌参考。
需要用到的工具有:
1) ADB(Android Debug Bridge)
2) Odin3三星手机烧写工具
3) ssh工具,比如FinalShell,PuTTY等
4) 一些命令中网络环境需要科学
大部分用到的软件分享在这个网盘地址上: https://pan.baidu.com/s/1WxLDWeaSPQCEEz39lwWTJg 提取码: vvea
主要思路是,Android虽然是基于Linux内核的移动操作系统,但是Android一般默认缺少了支持Docker的一些内核特征,所以需要重新编译手机的Linux内核。为了让修改的内核运行起来,又需要去除一些内核完整性验证功能。另外Docker也需要root权限运行,所以手机也需要root。
因为涉及root和内核编译,所以过程稍显复杂,可以总结为以下几个步骤:
1) 烧写官方固件;
2) 烧写TWRP、临时内核和magisk;
3) 检查内核配置,编译自己的新内核;
4) 烧入新内核;
5) 安装docker环境;
6) 安装docker应用;
7) 其它。
如果你也是SM-G9650,为了减少折腾,我把调整好的内核用TWRP备份出来并共享了,可以简化为以下几个步骤:
1) 烧写官方固件;
2) 烧写TWRP并置换内核;
3) 安装docker环境;
4) 安装docker应用;
5) 其它。
让我们开始吧。

一、烧写官方固件
先给手机下载和我一样的版本的官方固件。
1) OEM解锁
注意:再次提醒,OEM解锁会重置手机,清空所有数据,请一定事先备份手机!请一定事先备份手机!请一定事先备份手机!
请提前移除三星账户和其他账户(设置—账户与备份—账户—移除)。否则可能因为忘记账户密码导致手机整个被锁死。
先开启开发者选项:进入设置—关于手机—软件信息,连续点击编译编号7次。
再开启OEM解锁:进入设置—开发者选项,开启OEM解锁
开启解锁后,手机重启并进行初始化设置,按屏幕提示完成设置过程并激活手机。再次开启开发者选项,并确认OEM解锁,并顺便开启下USB调试。
开启USB调试:进入设置—开发者选项,开启USB调试
建议:每次重置手机初始化设置后,都确认OEM解锁状态和USB调试状态。
2) Windows烧写环境准备
烧写工具下载地址为“网盘/1.烧写工具”。
在Windows环境中安装三星手机驱动SAMSUNG_USB_Driver_for_Mobile_Phones.exe。
解压Odin3_v3.14.1.7z,即准备好了Odin3刷机软件。每次刷机点开就行。
准备ADB工具,解压platform-tools-latest-windows.zip,然后配置环境变量。
Win+R, 输入sysdm.cpl
系统变量path里面点击编辑,弹出窗口中新建路径到自己解压的路径
在终端中,测试adb安装是否成功,adb --version
用USB线连接电脑和手机,使用adb devices,在手机的弹出框中授权,应该能看到有手机型号列出来。
3) 烧写固件
打开Odin3线刷工具,我们仔细查看解压的刷机包文件,将文件和刷机工具上的按钮进行一一对应。BL开头的文件,配置进BL按钮,CP开头的文件,配置进CP按钮,CSC开头的文件,配置进CSC按钮,AP开头的文件,配置到AP按钮上面。因为AP文件特别大,加载起来很慢,耐心等待加载完成。加载这4个就可以了。HOME_CSC和Unpacked暂时不用。

手机进入线刷模式。手机先关机,“音量下”、“Bixby”和“电源”三键同时按住后过一会放手,就能进入刷机模式(也叫线刷模式、挖煤模式)。进去后提示你刷机影响的信息界面,再按“音量上”确定后就进入刷机待命状态。
在屏幕上方确认OEM LOCK和REACTIVATION LOCK应该都是OFF状态。如果不是,不要贸然刷机。同时按“音量下”和“电源”键超过7秒重启手机,在系统中退出所有账号并开启OEM解锁。
确认无误后插入数据线,观察Odin3工具左上角是否有端口识别(COM开头的),如果有,点击START(开始)就正式刷入手机了,此过程一般5分钟就可以刷好,工具会提示PASS,并且手机自动重启开机进入重置设置界面。
如果Odin3工具未识别端口或者刷入过程中失败,尝试更换1个新的数据线。 如果使用adb devices可以找到手机,但在线刷模式下不能识别端口,可以尝试换到其它USB端口,或者换一台Windows电脑,甚至旧一点的机器。
初始化设置并激活完成后,再次进入开发者模式,确保OEM Lock处于开启状态,并再次开启USB调试。

二、烧写TWRP并置换内核
TWRP是第三方的刷机软件,有方便的GUI操作方式,可以实现刷机、自定义固件安装、备份&恢复、救砖、隔断擦拭、文件删除等功能。你可以从官网地址https://twrp.me下载适合自己手机的版本。三星S9+使用https://dl.twrp.me/star2qltechn/下的twrp-3.7.0_9-0-star2qltechn.img.tar。
Magisk是当前Android社区用来获取root权限的主流方式。发布地址在https://github.com/topjohnwu/Magisk,最新版本是27.0。安装说明在https://topjohnwu.github.io/Magisk/install.html
从以上地址或者“网盘/3.烧入的img”下载这2个文件,同时下载一个我的内核备份“2024-07-03--02-16-28_QP1A190711020G9650ZCU9FUE3.zip”。
先烧入TWRP,方法和烧入官方固件一样。使用Odin3,勾选"AP"并且点击"AP"按钮选中twrp-3.7.0_9-0-star2qltechn.img.tar包,另外点击options并关掉auto reboot选项,手机进入线刷模式,连接PC正常后按下start开始刷机,上面的格子中出现绿色的PASS说明刷机成功。
这个时候,手机并没有自动重启,因为我们关掉了auto reboot选项,关掉的原因是我们不能让手机启动到正常开机模式(即启动到Kernel)。如果手机进入正常开机模式,会把刚烧入的TWRP又恢复成官方的Recovery,你又必须烧写一次。所以,你必须要让手机重启到recovery模式。操作步骤如下:
同时按“音量下”和“电源”键超过7秒重启手机,一旦屏幕熄灭手机开始重启,立即释放按键,改为同时按“音量上”、“Bixby”和“电源”三键,当看到TWRP的启动画面时,你就启动到TWRP了。
在第一个画面,我们先把语言改为中文,我们这次进来什么都不做,点重启选择“重启”到Recovery再进一次Recovery。

第二次进Recovery后,再次设置语言,然后点击“清除”,进入后,先点击“格式化Data分区”,输入yes,清理完成后。多次点击返回后再次进入“清除”,滑动滑块进行双清。不要直接点击重启系统,和第一次一样的方式,返回后点“重启”进入Recovery。

进Recovery后,再次设置语言。现在用TWRP备份当前的内核,记住你备份的位置。然后在TWRP中点击“挂载”,然后选择“启用MTP模式”(如果显示“停用MTP模式”,则已经是启用状态,不用再点),手机通过USB连接电脑,把下载的我的内核备份的文件2024-07-03--02-16-28_QP1A190711020G9650ZCU9FUE3.zip解压后拷入你备份的位置的同级别位置。

再次点击恢复,选择我的内核备份文件,把内核恢复进去。然后点击“重启系统”,重启手机到正常开机模式(Kernel)。因为在TWRP中清除了数据,又是一次重置后的初始化配置,激活手机等操作。再次开启开发者选项和USB调试。
我的内核备份中已经有magisk的基本安装,进入系统后,需要使用apk再安装一次(可从“网盘/5.安装的apk”下载)。安装后启动magisk,按照“需要修复运行环境”的提示,选择“确定”,自动重启手机后,稍等再次运行magisk,可知magisk安装成功。
至此,最新版本的magisk和TWRP都成功安装了。

三、安装docker环境
现在可以直接安装docker环境了,但如果你想检查下内核支持docker运行的情况,有个脚本可以帮助我们。
把“网盘/4.内核编译“目录下的check-config.sh下载到本地Windows上,在终端上用下面的adb命令推送到手机中,比如/sdcard目录
adb push check-config.sh /sdcard/
然后执行
adb shell
/bin/sh /sdcard/check-config.sh
你应该能得到下面这样的输出。如果是原始的内核,应该有不少的missing的,就是老内核缺少的运行docker的特征。
info: reading kernel config from /proc/config.gz ...
Generally Necessary:
--cgroup hierarchy: properly mounted [/dev]
--CONFIG_NAMESPACES: enabled
--CONFIG_NET_NS: enabled
--CONFIG_PID_NS: enabled
--CONFIG_IPC_NS: enabled
--CONFIG_UTS_NS: enabled
。。。。。。

为了安装docker环境,我们先在手机上安装termux,使用“网盘/5.安装的apk”下的com.termux_118.apk安装即可。安装好后进行配置。以下命令在手机上的termux环境中输入:
termux-setup-storage
会有弹出框,点击同意,获得访问本地权限
termux-change-repo
换源,可以换到北大的BFSU。向下移动到BFSU,空格键选择,然后OK。
apt update
apt upgrade
需要选择时一直选择y,并回车。
pkg install openssh
sshd -p 8022
开启ssh
whoami
获得用户账号,一般是u0_axxx格式,
passwd
设置当前用户的密码
有了用户名/密码,就可以在PC下用FinalShell,PuTTY或者在shell下登陆ssh了。

以下命令在ssh环境中执行
  1. pkg install vim
复制代码
顺便编辑下.bashrc,把sshd -p 8022加入,自动开启ssh
  1. pkg install tsu
复制代码
安装超级用户的包
  1. tsu(或者su)
复制代码
手机上有magisk的弹窗,点击允许给予root权限
现在可以安装docker环境了。因为termux的默认路径过长,比如home为/data/data/com.termux/files/home,而导致docker的路径过长,会有一个运行错误的bug,而特定老版本(可以在“网盘/6.docker”下载到)没有这个问题,所以docker的安装使用下面的方法。
ssh到手机后
pkg install root-repo
pkg install docker
pkg uninstall docker
pkg uninstall containerd
dpkg -i containerd_1.6.21-1_aarch64.deb
dpkg -i docker_1: 20.10.24_aarch64. deb
然后编辑配置文件,
  1. vi /data/data/com.termux/files/usr/etc/docker/daemon.json
复制代码
换成下面的内容
{
    "data-root": "/data/docker/lib/docker",
    "exec-root": "/data/docker/run/docker",
    "pidfile": "/data/docker/run/docker.pid",
    "hosts": [
        "unix:///data/docker/run/docker.sock"
    ],
    "storage-driver": "overlay2",
    "dns": ["192.168.31.1","114.114.114.114","8.8.8.8"],
    "experimental": true,
    "registry-mirrors": [      
        "https://ccr.ccs.tencentyun.com"
    ]
}

以上dns部分换成自己的软路由地址/公共dns等,而registry-mirrors可以换上docker的国内源。很遗憾,最近国内公共镜像源都关闭了,好用的不好找。没有国内镜像,你需要科学的方法才能下载docker镜像。
现在重启手机后,运行termux,然后尝试在手机上运行hello-world docker。为了便于看到运行情况,我一般ssh到手机,然后运行
  1. sudo dockerd
复制代码
等dockerd后台进程运行完成,进入等待状态时,再另外开一个ssh,运行
  1. sudo docker version
复制代码
确认Client和Server都正常后,就可以跑自己的docker了,当然你需要科学的方法访问到docker镜像源,比如
  1. sudo docker run --rm hello-world:linux
复制代码
你就应该可以看到Hello from Docker!
你已经成功的在手机上跑起来第一个docker了!
运行dockerd的ssh窗口可以关掉,后台进程仍然在继续,你可以开心的在第二个ssh窗口中安装你更多的docker了。以后重启了手机,你也可以用下面的命令后台运行dockerd。
  1. sudo dockerd &>/dev/null &
复制代码
四、安装docker应用
现在我们可以装一些我们常用的docker了,比如portainer,ddns,alist,xiaoya,xiaoyakeeper等等。具体docker的介绍内容网上很多,就不再细说。因为没有了国内docker镜像源,你需要科学的方法才能下载docker镜像。
另外我们需要知道docker使用网络的方式,一种是桥接模式(bridge),一种是主机模式(host)。在我们这个环境,要让桥接模式工作,需要手动编辑iptable,而且网络变更时也需要重新调整iptable,所以我更推荐主机模式。在这个模式下,容器和手机使用同样的网络接口,比如你的WiFi(wlan0),有同样的IP地址段。这样对于有公网IPV6地址的手机来说,你的容器也有了一个公网IPV6地址,让你可以用ddns把你的容器用域名开放出去。当然你也需要更注意安全问题了。使用主机模式也很简单,在创建容器的时候,加上--net=host即可。
比如运行portainer,你只需要下面的命令即可
  1. sudo docker run -d -p 9000:9000 --restart=always --net=host -v /data/docker/run/docker.sock:/var/run/docker.sock --name portainer portainer/portainer-ce:alpine-sts
复制代码
运行ddns-go,需要下面的命令
  1. sudo docker run -d --name ddns-go --restart=always --net=host -v /sdcard/ddns-go:/root jeessy/ddns-go
复制代码
首次登陆没有密码,端口9876,5分钟内完成配置即可。
运行alist,需要下面的命令
  1. sudo docker run -d --name="alist" --restart=always -v /sdcard/alist:/opt/alist/data --network host --pid host --privileged xhofe/alist
复制代码
可以查看启动log获得密码
  1. sudo docker logs alist
复制代码
或者设置下自己的密码
  1. sudo docker exec -it alist ./alist admin set NEW_PASSWORD
复制代码
安装xiaoya hostmode就有点波折了,在/sdcard/xiaoya目录下准备好配置文件,就是要求的3个文件(mytoken,myopentoken,temp_transfer_folder_id),然后
  1. sudo docker run -d --restart=always --net=host -v /sdcard/xiaoya:/data -v /sdcard/xiaoya/data:/www/data   -v /sdcard/xiaoya/alist:/opt/alist/data -e PUID=0 -e PGID=0 -e UMASK=022 -e "TZ=Asia/Shanghai" --name="xiaoya-hostmode" xiaoyaliu/alist:hostmode
复制代码
安装后用以下命令查看log,确保正常启动
  1. sudo docker logs -f xiaoya-hostmode
复制代码
然而发现5678端口并不能打开,出现500 Internal Server Error。在手机上的浏览器访问127.0.0.1:5234是可以正常打开的。容器中的nginx的error.log显示:
[alert] 10393#10393: *1 socket() failed (13: Permission denied) while connecting to upstream, client: 192.168.31.241, server: _, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:5234/", host: "192.168.31.168:5678”

使用下面的命令进入容器,
  1. sudo docker exec -it xiaoya-hostmode /bin/sh
复制代码
在容器中执行下面命令,也是同样的错误
  1. curl -sI 127.0.0.1:5678
复制代码
HTTP/1.1 500 Internal Server Error
Server: nginx
Date: Sun, 16 Jun 2024 02:25:07 GMT
Content-Type: text/html
Content-Length: 170
Connection: close

从错误log可以看出,因为权限问题,小雅中的nginx反向代理不正常,编辑容器中的nginx的配置文件,
  1. vi /etc/nginx/nginx.conf
复制代码
把第3行的user nginx改为user root
然后重新加载nginx
  1. nginx -s reload
复制代码
xiaoya就正常了。
安装xiaoya的清除脚本xiaoyakeeper也有不同,因为一键脚本在这个环境不好用,基本上是按照脚本手搓一个xiaoyakeeper出来。里面要用到aliyun_clear.sh可以在“网盘/6.docker”下面下载.
sudo docker run --name xiaoyakeeper --restart=always --network=host --privileged -v /data/docker/run/docker.sock:/var/run/docker.sock -e TZ="Asia/Shanghai" -d alpine:3.18.2 sh -c "if [ -f /etc/xiaoya/aliyun_clear.sh ];then sh /etc/xiaoya/aliyun_clear.sh 55;else sleep 60;fi"
sudo docker exec xiaoyakeeper touch /docker-entrypoint.sh
sudo docker exec xiaoyakeeper mkdir /etc/xiaoya
sudo docker cp ./aliyun_clear.sh xiaoyakeeper:/etc/xiaoya/
sudo docker exec xiaoyakeeper chmod +x "/etc/xiaoya/aliyun_clear.sh"
sudo docker restart xiaoyakeeper
用命令查看安装情况
  1. sudo docker logs -f xiaoyakeeper
复制代码
确认下载安装等命令正常,出现“小雅缓存清理(ver=202404270924)运行中”字样,即安装完成了。安装的是模式5,即实时清理,只要产生了播放缓存一分钟内立即清理。
所以,一般docker都是比较容易安装的,但一些一键脚本等不能直接执行的,需要做一些调整来安装。另外注意很多docker常用的/etc目录在手机环境是不可写的,需要调整成别的可写目录,比如/sdcard,就像上面的xiaoya-hostmode那样。
我相信以手机的CPU能力,弄个大容量SD卡,安装个小雅Emby全家桶或者Jellyfin全家桶也是可能的,不过我没有试。
五、其它
到这里,手机docker服务器已经完美的运行起来了。我们要考虑下供电问题了。
手机自带电池这个UPS,所以不用担心突然断电,倒是大家顾虑长期充电会不会电池鼓包等危险。幸运的是,手机有root权限,也有众多的apk可以用。我们可以安装一个软件AccA,这个软件是个高级充电控制器,你可以自定义设置电池恢复充电和停止充电的阈值。这样虽然你一直插着充电器,但也只是在必要的情况下才充电的,不用担心一直充电啦。当然你还是把手机放在合适的地方,避免过热环境。这个软件是“网盘/5.安装的apk”下的acca_v1.0.35_danji100.com.apk。虽然安装时报错,再试就可以了,功能是正常的。这个主意来自bilibili的“极客小新Brilliant”,你也可以参考他的视频“小米6旧手机改造,外接硬盘一机多用,内网穿透私有云,ZeroTier详解”(https://www.bilibili.com/video/B ... 74943935263756e9e81),再给手机安装一个“翻页时钟”,运行起来如下图。这样,你就拥有了一个带有时间显示的能运行docker的ARM服务器了。


n  参考文献或网站

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 1恩山币 +1 收起 理由
dddv + 1 你好,久仰卧龙大名,在下凤雏! ...

查看全部评分

只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
发表于 2024-7-3 18:58 | 显示全部楼层
就是比较折腾  还是值得试下
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-3 19:25 来自手机 | 显示全部楼层
搞复杂了。
手机上直接安装alist,aliyundrive-webdav,或者xlist,或者Alclient不就行了吗?
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-12 21:56 | 显示全部楼层
牛蛙牛蛙~mark以下
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-16 18:19 | 显示全部楼层
技术贴,帮忙顶了
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-7-22 22:13 | 显示全部楼层
很实用 感谢大佬分享
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-11-1 00:52 | 显示全部楼层
本帖最后由 kknnnyy 于 2024-11-1 01:02 编辑

太厉害了,大佬可以看看RK3399的盒子的安卓可以修改内核运行docker吗,这样保留了电视功能,还能用docker运行一些服务,还能运行旁路由docker的openwrt容器,安卓系统的大量应用和docker应用都能兼顾,这个开发板闲鱼也不贵,就是编译太复杂了,自己搞了好久也不行,这是开发板的资料,有安卓源码:
https://wiki.friendlyelec.com/wiki/index.php/NanoPC-T4/zh

点评

我想应该是可以的。原来文章太长,我把编译的部分去掉了。现在把这部分摘抄到下面。还是针对三星手机的,对于RK3399,按照类似方法应该也是可以的。但是编译链的准备,其他一些细节部分等,相应用厂家提供的调整即可  详情 回复 发表于 2024-11-9 09:11
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-9 09:11 | 显示全部楼层
kknnnyy 发表于 2024-11-1 00:52
太厉害了,大佬可以看看RK3399的盒子的安卓可以修改内核运行docker吗,这样保留了电视功能,还能用docker运 ...

我想应该是可以的。原来文章太长,我把编译的部分去掉了。现在把这部分摘抄到下面。还是针对三星手机的,对于RK3399,按照类似方法应该也是可以的。但是编译链的准备,其他一些细节部分等,相应用厂家提供的调整即可。
~~~~~~
一、检查内核配置,编译自己的新内核
这个部分比较费事,如果你想简单点,可以跳过这个步骤,直接从“网盘/4.内核编译“下载我编译好的img,名字为Image.gz-dtb。如果你继续编译,我就假定你有一定的Linux知识等,步骤说明简单一些。
这个部分有两步,首先我们要知道内核缺少了哪些docker要运行的必要的特征,有个脚本可以帮助我们。接下来就是准备源代码、编译工具链和环境等,配置好项目参数,修改掉已知的bug,交叉编译生成img了。
1) 检查内核缺少的特征
把“网盘/4.内核编译“目录下的check-config.sh下载到本地Windows上,在终端上用下面的adb命令推送到手机中,比如/sdcard目录
adb push check-config.sh /sdcard/
然后执行
adb shell
/bin/sh /sdcard/check-config.sh
你应该能得到下面这样的输出,其中missing的,就是当前内核缺少的运行docker的特征,有必须的,也有可选的,在后面的配置中尽量开启。
info: reading kernel config from /proc/config.gz ...
Generally Necessary:
--cgroup hierarchy: properly mounted [/dev]
--CONFIG_NAMESPACES: enabled
--CONFIG_NET_NS: enabled
--CONFIG_PID_NS: enabled
--CONFIG_IPC_NS: enabled
--CONFIG_UTS_NS: enabled
--CONFIG_CGROUPS: enabled
--CONFIG_CGROUP_CPUACCT: enabled
--CONFIG_CGROUP_DEVICE: enabled
--CONFIG_CGROUP_FREEZER: enabled
--CONFIG_CGROUP_SCHED: enabled
--CONFIG_CPUSETS: enabled
--CONFIG_MEMCG: enabled
--CONFIG_KEYS: enabled
--CONFIG_VETH: enabled
--CONFIG_BRIDGE: enabled
--CONFIG_BRIDGE_NETFILTER: enabled (as module)
--CONFIG_IP_NF_FILTER: enabled
--CONFIG_IP_NF_MANGLE: enabled
--CONFIG_IP_NF_TARGET_MASQUERADE: enabled
--CONFIG_NETFILTER_XT_MATCH_ADDRTYPE: missing
--CONFIG_NETFILTER_XT_MATCH_CONNTRACK: enabled
--CONFIG_NETFILTER_XT_MATCH_IPVS: missing
--CONFIG_NETFILTER_XT_MARK: enabled
--CONFIG_IP_NF_NAT: enabled
--CONFIG_NF_NAT: enabled
--CONFIG_POSIX_MQUEUE: enabled
--CONFIG_NF_NAT_IPV4: enabled
--CONFIG_NF_NAT_NEEDED: enabled
Optional Features:
--CONFIG_USER_NS: enabled
--CONFIG_SECCOMP: enabled
--CONFIG_SECCOMP_FILTER: enabled
--CONFIG_CGROUP_PIDS: enabled
--CONFIG_MEMCG_SWAP: enabled
--CONFIG_MEMCG_SWAP_ENABLED: enabled
--CONFIG_IOSCHED_C购物: enabled
--CONFIG_C购物_GROUP_IOSCHED: missing
--CONFIG_BLK_CGROUP: missing
--CONFIG_BLK_DEV_THROTTLING: missing
--CONFIG_CGROUP_PERF: missing
--CONFIG_CGROUP_HUGETLB: missing
--CONFIG_NET_CLS_CGROUP: enabled
--CONFIG_CGROUP_NET_PRIO: missing
--CONFIG_CFS_BANDWIDTH: enabled
--CONFIG_FAIR_GROUP_SCHED: enabled
--CONFIG_IP_NF_TARGET_REDIRECT: enabled
--CONFIG_IP_VS: missing
--CONFIG_IP_VS_NFCT: missing
--CONFIG_IP_VS_PROTO_TCP: missing
--CONFIG_IP_VS_PROTO_UDP: missing
--CONFIG_IP_VS_RR: missing
--CONFIG_SECURITY_SELINUX: enabled
--CONFIG_SECURITY_APPARMOR: missing
--CONFIG_EXT3_FS: enabled
--CONFIG_EXT3_FS_XATTR: missing
--CONFIG_EXT3_FS_POSIX_ACL: missing
--CONFIG_EXT3_FS_SECURITY: missing
    (enable these ext3 configs if you are using ext3 as backing filesystem)
--CONFIG_EXT4_FS: enabled
--CONFIG_EXT4_FS_POSIX_ACL: enabled
--CONFIG_EXT4_FS_SECURITY: enabled
- Network Drivers:
  - "overlay":
    --CONFIG_VXLAN: missing
    --CONFIG_BRIDGE_VLAN_FILTERING: missing
      Optional (for encrypted networks):
      --CONFIG_CRYPTO: enabled
      --CONFIG_CRYPTO_AEAD: enabled
      --CONFIG_CRYPTO_GCM: enabled
      --CONFIG_CRYPTO_SEQIV: enabled
      --CONFIG_CRYPTO_GHASH: enabled
      --CONFIG_XFRM: enabled
      --CONFIG_XFRM_USER: enabled
      --CONFIG_XFRM_ALGO: enabled
      --CONFIG_INET_ESP: enabled
      --CONFIG_NETFILTER_XT_MATCH_BPF: enabled
      --CONFIG_INET_XFRM_MODE_TRANSPORT: enabled
  - "ipvlan":
    --CONFIG_IPVLAN: missing
  - "macvlan":
    --CONFIG_MACVLAN: missing
    --CONFIG_DUMMY: enabled
  - "ftp,tftp client in container":
    --CONFIG_NF_NAT_FTP: enabled
    --CONFIG_NF_CONNTRACK_FTP: enabled
    --CONFIG_NF_NAT_TFTP: enabled
    --CONFIG_NF_CONNTRACK_TFTP: enabled
- Storage Drivers:
  - "btrfs":
    --CONFIG_BTRFS_FS: missing
    --CONFIG_BTRFS_FS_POSIX_ACL: missing
  - "overlay":
    --CONFIG_OVERLAY_FS: missing
  - "zfs":
    - /dev/zfs: missing
    - zfs command: missing
    - zpool command: missing
Limits:
- /proc/sys/kernel/keys/root_maxkeys: 1000000
2) 代码编译
编译安卓内核需要有a)稳定且合适的内核源码;b)合适的gcc工具链。
官方源代码可以从三星网站获得,最新版本G9650ZCU9FUE3。工具链可从android.googlesource.com获得,比如https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
我们前面也讨论过,官方固件和源代码都有校验功能,所以我们要去掉这个功能,再开启缺少的内核特征。幸运的是,我们上一步使用的临时内核的提供者klabit87大佬同时也共享了自己修改过的源代码,这样就省去我们部分的修改工作。https://github.com/klabit87/android_kernel_samsung_sdm845/archive/refs/tags/V6.5.zip。如果你想研究大佬修改了什么,可以对比这两份代码。两个版本小版本号应该不同,所以代码上有一些小的可忽略的不同。你也可以从“网盘/4.内核编译”里面下载到这两份代码。
三星官方代码:SM-G9650_CHN_QQ_Opensource.zip
klabit87代码:android_kernel_samsung_sdm845-6.5.zip
工具链也可以使用源代码中自带的prebuilt版本。
本文继续以klabit87的代码为基准继续进行。
我们要在Linux环境工作一段时间了。把klabit87的代码上传到你的Linux(下面以Ubuntu为例)环境中,解压到合适的路径中备用。
我们需要安装编译所需要的依赖包
sudo apt install libssl-dev
sudo apt install libncurses5-dev
sudo apt install build-essential
如果你安装中碰到了版本不匹配报错,可以
sudo apt install aptitude
aptitude install libssl-dev
按照提示先选n,再选y,纠正依赖。
环境基本准备好了。开始配置内核。
约定解压后源代码根目录为当前目录,则先把./arch/arm64/configs/star2qlte_chn_open_defconfig这个config文件备份,然后cp到当前目录下并改名为.config
然后执行make menuconfig
以开启CONFIG_NETFILTER_XT_MATCH_ADDRTYPE为例。在这个图形界面下,输入/进行搜索,输入上面的关键字后回车,得到下面的画面
其中1是表示找到的特征以及当前的状态(Yes/No),你可以按照3这个路径,找到2这样的提示词,表示的就是1这个特征。然后就可以用空格键来切换状态了。如果你在3路径下找不到,则就要检查下4这个前提条件了,如果4中有某个特征不满足条件,则3路径下并不显示出2这个提示词,表示它是不可用的不能被修改的状态的。你需要把4中的所有依赖的特征首先调整为Yes的状态,才可以修改1这个特征。
根据check-config.sh的输出结果逐个开启支持docker缺少的(missing)的特征,依赖于其它特征的,需要先开启被依赖的特征,然后再开启本特征,直到全部完成。这也是我们为什么不直接用vi编辑config文件的原因,确保依赖关系都是正确的。
最终因为编译不过或者找不到等原因,保留了以下missing的未修改
--CONFIG_CGROUP_HUGETLB: missing (这个通过图形界面找不到,强行vi修改config文件实现了支持)
--CONFIG_EXT3_FS_XATTR: missing
--CONFIG_BTRFS_FS: missing
--CONFIG_BTRFS_FS_POSIX_ACL: missing
- Storage Drivers:
  - "zfs":
    - /dev/zfs: missing
    - zfs command: missing
    - zpool command: missing
除了以上为了docker的config文件的修改,还建议修改以下2项内容
CONFIG_FRAME_WARN=4096
(路径:kernel hacking->Comlipe-time checks and complier options -> warn for stack frames larger than 的数值,将其修改为4096,解决编译错误)
CONFIG_LOCALVERSION=“-GogoLiuV0.1”
这个可以改成你的名字和版本号,这样在你替换完手机的内核后,可以通过这个本地版本号来确认是否替换成功。另外,看到自己名字的内核在运行也有点小骄傲。
把改好的.config拷贝回原来的地方原来的名字,理论上再运行./build_kernel.sh进行编译就可以了。你可以从“网盘/4.内核编译”下载我修改好的config文件star2qlte_chn_open_defconfig。
但是,build_kernel.sh文件还需要修改,增加环境变量
export PLATFORM_VERSION=10
这样可以保证编译出来的内核WIFI工作正常。
另外,build_kernel.sh中的PATH的值,要改为你的源代码中的./tools/prebuilts/gcc-cfp-single/aarch64-linux-android-4.9/bin,使用绝对路径更好。第一个make的最后一个参数也修改为你编辑好的defconfig文件,即star2qlte_chn_open_defconfig。
编译中还会报错,做以下代码级别修改
scripts/dtc/dtc-parser.tab.c_shipped 1199行的yylloc定义前添加extern
给net/netfilter/xt_qtaguid.c,函数iface_stat_fmt_proc_show,打一个补丁
@@ -737,7 +737,7 @@
{
        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};
@@ -745,13 +745,8 @@
        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.
现在可以编译了,如果以前编译过,或者修改了config文件,则需要使用
make mrproper
彻底清除后重新再编译。
我不太喜欢一次性执行build_kernel.sh文件,而是设置好以下环境变量,
export PLATFORM_VERSION=10
export ARCH=arm64
export PATH=/home/lewis/shared/android_kernel_samsung_sdm845-6.5/tools/prebuilts/gcc-cfp-single/aarch64-linux-android-4.9/binPATH
在kernel目录下执行一次
mkdir out

然后执行一步以下命令,确保out/.config被成功生成
make -C $(pwd) O=$(pwd)/out CROSS_COMPILE=aarch64-linux-android- KCFLAGS=-mno-android star2qlte_chn_open_defconfig
然后再执行下面的语句编译,
make -j8 -C $(pwd) O=$(pwd)/out CROSS_COMPILE=aarch64-linux-android- KCFLAGS=-mno-android
如果出现代码级编译错误,修改后只是重新执行最后一个命令即可。
编译成功后,生成的image位置在kernel/out/arch/arm64/boot/Image.gz-dtb。
二、烧入新内核
生成的img一般用AnyKernel3(https://github.com/osm0sis/AnyKernel3)来生成TWRP可刷的zip包,klabit87的内核包就是这个形式,然而我用这种方式并未成功,也许是一些安装脚本需要修改的问题。但我发现Android Image Kitchen(简称AIK,相关介绍可参考网址https://xdaforums.com/t/tool-android-image-kitchen-unpack-repack-kernel-ramdisk-win-android-linux-mac.2073775/)可用,所以本文使用了这个方案。
我们先在手机上安装termux,使用“网盘/5.安装的apk”下的com.termux_118.apk安装即可。安装好后进行配置。以下命令在手机上的termux环境中输入:
termux-setup-storage
会有弹出框,点击同意,获得访问本地权限
termux-change-repo
换源,可以换到北大的BFSU。向下移动到BFSU,空格键选择,然后OK。
apt update
apt upgrade
需要选择时一直选择y,并回车。
pkg install openssh
sshd -p 8022
开启ssh
whoami
获得用户账号,一般是u0_axxx格式,
passwd
设置当前用户的密码
有了用户名/密码,就可以在PC下用FinalShell,PuTTY或者在shell下登陆ssh了。
以下命令在ssh环境中执行
pkg install vim
顺便编辑下.bashrc,把sshd -p 8022加入,自动开启ssh
pkg install tsu
安装超级用户的包
tsu(或者su)
手机上有magisk的弹窗,点击允许给予root权限
ls -al /dev/block/bootdevice/by-name
得到如下输出,即可知boot分区的实际位置
lrwxrwxrwx 1 root root   16 2018-01-09 00:26 boot -> /dev/block/sda20
dd if=/dev/block/sda20 of=/sdcard/boot.img
这样就获得手机当前的boot区img
把这个img传回到PC上,可以使用scp命令
scp username@ip_address:/sdcard/boot.img .
或者adb命令
adb pull /sdcard/boot.img .
如果你想简单点,可以跳过下面这个AIK步骤,直接从“网盘/4.内核编译“下载我生成好的image-new.img。
AIK有Windows版本和Linux版本,我使用了Linux版本AIK-Linux-v3.8-ALL.tar.gz(可以从“网盘/4.内核编译”获得),它需要python3的支持。
解压到合适的位置,然后把boot.img也放到同目录下,执行
./unpackimg.sh boot.img
会有类似的输出,
Splitting image to "split_img/"...
ANDROID! magic found at: 0
……
进入split_img目录,将boot.img-kernel文件删掉,然后将自己生成的Image.gz-dtb文件拷贝到./split_img目录下,并重命名为boot.img-kernel。
执行./repackimg.sh,生成image-new.img文件,即我们可以刷入的boot.img文件。
把image-new.img用adb push传入手机/sdcard,在手机上用termux的或者ssh连接手机,输入tsu获得root权限,然后使用dd命令烧入新的img
dd if=/sdcard/image-new.img of=/dev/block/sda20
现在重启手机,时间稍长,启动后可发现kernel已被更换,在设置-关于手机-软件信息-内核版本处可看到你自己打的CONFIG_LOCALVERSION的标记。
如果你现在在adb shell下再次检查docker所需特征,
/bin/sh /sdcard/check-config.sh
你会发现基本上都支持了。
因为内核更换,所以magisk打的补丁没有了,在TWRP中再次安装magisk的zip包。重启后系统中再次运行magisk的apk,按提示选择直接安装并重启后,恢复了magisk的权限。
你可以进入TWRP,再次备份一个当前的boot区到SD卡上,折腾时出现任何意外就可以救砖了。
~~~~~~~~~~~~~

到此和文章原来的位置就可以链接上了。如果有点乱的话,可以去B站搜索“安卓手机直接运行Docker,可行?可行!!”,找到我另外发的完整的版本。
希望对你有些帮助

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-11-14 15:27 | 显示全部楼层
专业性太强,技术牛人,小白只能仰望
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-11-21 08:59 | 显示全部楼层
思路不错,非常感谢分享
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-12-14 16:18 | 显示全部楼层
66666666
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2024-12-30 08:53 | 显示全部楼层
思路不错,非常感谢分享
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2025-1-14 00:57 来自手机 | 显示全部楼层
看了开头,安卓手机可以,那么安卓电视盒子也又可能吧!!
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛

只谈技术、莫论政事!切勿转播谣言!为了你也为了他人。
只谈技术、莫论政事!(点击见详情) 切记不要随意传播谣言,把自己的日子过安稳了就行,为了自己好也为了大家好。 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。

查看 »

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2025-6-6 06:37

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

快速回复 返回顶部 返回列表