抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

闲置的安卓手机不要扔,裹上鸡蛋液,粘上面包糠,下锅炸至金黄酥脆,隔壁小孩都馋哭了…

前言

咕咕咕…

环境

termux

这玩意不用多说了…可以多看看 wiki

推荐配置好 termux-boot 自启, 以及 termux-api 来调用系统硬件

adb

作为一个服务器肯定得有用于控制服务器的服务(例如: linux常用的ssh, windows常用的rdp)

这里需要注意一下开机自启无线adb的问题

可以在 /system/build.prop 的末尾加入

1
service.adb.tcp.port=5555

frp

服务器肯定得有办法公网访问呀, 我这里用的是 masgik + frpc 的方案 Magisk-FRPCadb 等服务端口转发到公网

配置完成后, 就可以使用 adb 远程连接安卓设备了, 也可以通过 scrcpy 方案远程控制安卓的图形界面

acc

这是一个充电控制的模块 (防止过充导致电池鼓包啥的)

Advanced Charging Controller (ACC)

docker

昨天搞定了这玩意, 咱先写它吧..虽然还有许多不完美..

上电开机

当安卓手机关机再通上电源后会进入充电动画的模式…

这显然是咱打造 安卓服务器 的小弱点

为了实现 上电自动开机 一般通过

fastboot 命令修改bl充电模式 (Nexus设备)

1
$ fastboot oem off-mode-charge 0

修改 boot 分区 ramdisk 中的 init.rc

1
2
3
4
5
6
7
...

on charger
class_start charger #这段自带不用删也可以,而且听说某些系统需要先进入charger流程,否则会卡第一屏
setprop sys.powerctl reboot #添加进这段

..

通过修改 system 分区中的某些二进制可执行文件 (三星设备)

例如, 我的设备为 Samsung Galaxy S7 Edge 则无法使用以上两种方法

经过研究, 在关机充电的时候, 会执行 /system/bin/lpm 的文件

所以咱只要写一个简单的 shell 脚本替换掉它即可

1
2
#!/system/bin/sh
/system/bin/reboot

准备

手机需要 root 且在这里假定你有编译安卓 kernel(内核) 的能力

根据大佬们的尝试: Docker on Android, 咱现在可以简单地在 termux 上直接安装

1
2
$ pkg install root-repo
$ pkg install docker

内核

因为 docker 的主要功能依赖于内核, 所以我们的安卓内核需要进行一番定制

首先检查目前的手机运行的内核针对 docker 开启的配置支持程度

1
2
3
4
5
$ pkg install wget
$ wget https://raw.githubusercontent.com/moby/moby/master/contrib/check-config.sh
$ chmod +x check-config.sh
$ sed -i '1s_.*_#!/data/data/com.termux/files/usr/bin/bash_' check-config.sh
$ sudo ./check-config.sh

asciicast

可以看到有很多 CONFIG 都处于 missing 的状态

我们需要去针对必要内核配置的缺失, 去做补全

首先开启 Generally Necessary 列表中的全部(能开多少开多少), 再开启 Network Drivers 中的一些配置

为了让 overlay 可用, 咱还得开启 Storage Drivers 中的一些配置

我在这里是这样修改的: ea8285b

除此之外, 我们还需给内核些 patch

做完这些之后再编译内核…最后刷入手机

启动

如果你已经内核让内核成功支持了 docker 所需特性, 那么我们可以启动 dockerd 试试看了 (iptables 需要禁用)

1
$ sudo dockerd --iptables=false

如果没有任何报错

可以简单运行一个容器试试看

1
$ sudo docker run hello-world   

你可以会遇到此类错误

1
2
3
$ sudo docker run hello-world                  
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: process_linux.go:459: container init caused: rootfs_linux.go:117: jailing process inside rootfs caused: pivot_root invalid argument: unknown.
ERRO[0001] error waiting for container: context canceled

这是因为安卓内核使用了 ramdisk 导致的

我们只需要在 dockerd 启动的时候, 使用以下命令即可

1
$ sudo DOCKER_RAMDISK=true dockerd --iptables=false

此时再运行容器, 惊喜出现!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ sudo docker run hello-world 

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm64v8)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

网络

我们可以简单的启动一个 debian 容器试试看 (使用 host 因为 bridge 不太支持, 具体请参考这里)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sudo docker run -ti --net=host arm64v8/debian
root@localhost:/# apt update
Err:1 http://deb.debian.org/debian buster InRelease
Temporary failure resolving 'deb.debian.org'
Err:2 http://security.debian.org/debian-security buster/updates InRelease
Temporary failure resolving 'security.debian.org'
Err:3 http://deb.debian.org/debian buster-updates InRelease
Temporary failure resolving 'deb.debian.org'
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
W: Failed to fetch http://deb.debian.org/debian/dists/buster/InRelease Temporary failure resolving 'deb.debian.org'
W: Failed to fetch http://security.debian.org/debian-security/dists/buster/updates/InRelease Temporary failure resolving 'security.debian.org'
W: Failed to fetch http://deb.debian.org/debian/dists/buster-updates/InRelease Temporary failure resolving 'deb.debian.org'
W: Some index files failed to download. They have been ignored, or old ones used instead.

你会发现没有网络, 无法进行 apt update

此时, 在容器内执行以下命令, 即可使用网络

1
2
# echo “nameserver 8.8.8.8” > /etc/resolv.conf
# groupadd -g 3003 aid_inet && usermod -G nogroup -g aid_inet _apt

最后

你会发现 arm64v8 的容器并不多…能用的也基本不需要使用容器运行

但生命在于折腾, 这个经历让我对 docker 的底层有了比较浅显的了解

不由得感叹现代计算机这迷人的魅力凝聚了多少人的心血啊

实在是太浪漫了~

评论