For the complete documentation index, see llms.txt. This page is also available as Markdown.

使用Termux把Android变成一台服务器

起因

我之前的Pixel4因为电池鼓包了,把手机的背板微微顶起来了。顶起来以后NFC接触不良,所以我发现了。换电池的时候,可能我手上的静电打坏了什么东西,反正信号差了,前置摄像头也不能用了。就这样,这个手机在我的柜子里吃灰了几年。

最近我冒出了一些俺寻思之力:既然Android的底层也是Linux,虽说这个Linux和我们日常使用的Debian之类的发行版又有少许不同,那么能否让Android成为一台服务器呢?

诶!还真行。站在Termux巨人的肩膀上,几乎没什么要做的事情。

但是也有一些限制,这里整理一下。

如何操作

安装Termux

首先是操作系统,我的操作系统是CalyxOS 5.14.2,一个开源的、真正自由的Android。里面没有Google原装Android那么多鬼东西。 我之所以用它,是因为几年前我刷机刷了它,懒得刷回去了。再者,我也更喜欢这种简洁干净的系统。

不过如果只是运行Termux的话,相信别的Android系统应该也基本都可以安装。不一定要使用CalyxOS。

我用F-Droid安装了Termux和Termux:Boot两个App,一个是核心,一个负责开机启动。

多余的话

这里我得为F-Droid(和任何期待自由的人)来『广告』一下,Google即将在Android实施限制,任何Google认证的Android设备安装的App,其开发者必须在Google缴费注册。

这也意味着,想要自己写一个apk分发到世界各地,不太可能了。 当然,Google假惺惺的提供了绕过限制的方法,但是操作路径之复杂,还要等24小时(等我们自己忘了操作吗?),让分发应用受到极大的限制。 而且Google也可以任意修改这些规则。

我们这些用户,只是想要在自己买的设备上安装任何自己想要的应用,却要费千辛万苦。

而且我不负责任的说,垄断收费只是最小的副作用。这个功能给了各国政府(中国是个例外,中国基本没有Google认证Android,是以另外的方式——比如反诈中心——来控制)以屏蔽某个应用的手段,以后就可以以“国家安全”的名义来封禁任何不想要的应用,对于许多国家来说,这会强化独裁。

更多详细信息,请看Keep Android Open

连接到手机

如果下载慢,可能需要你termux-change-repo来换个源。

然后我们运行whoami获取当前用户,比如我是u0_a219。这里是个有点神奇的地方,这里的u0应该是指用户的编号,我这个系统当然支持多租户,但是我只创建了一个用户。a219则是指app+编号。

随后我们可以新增一个authorized_key来进行ssh的登录,也可以先设置密码通过密码登录。这部分和标准的Linux一样我就不再赘述了。

唯一需要注意的是,请使用sshd启动服务器。

重启sshd的方式是

和一般Linux的区别

路径不一样,因为我们只是有用户的权限,所以文件夹也是/data/data/com.termux/files/usr而不是挂在根目录下。手机存储的路径在/storage/emulated/0/,这个老Android用户肯定都熟。

其次也没有systemd这种东西,所以服务器是作为一个正常的App来运行的。比如我之后运行Prometheus,就是直接用二进制启动的。

开机启动请编辑 ~/.termux/boot/start-server 里面写

申请端口开放的时候只能申请8000以上的端口,不过一般都够用了。

最大的区别其实是glibc没有了朋友!Android的C库是Bionic。至于为什么要费劲搞一个C库,只能说glibc的历史包袱太多了。而且Android本身也不是服务器,对userspace的要求也不一样。

可是大多数标准的Linux App(特别是C/C++开发的那些)都会用到glibc,所以它们大多得重新编译。

但是自带Runtime的语言就没事了,比如你可以安装Python,Golang,rust,前者是解释器,后面两个则可以跨平台编译,只要你不是调用了C库,事情就很简单了。

但是考虑到大多数软件都不会闲到构建一个Android的版本,很多时候还是得自己编译,比如我使用pipx安装uv的时候,就得重新用rust编译uv,rust的编译工作量大家都懂,我觉得我的Pixel4都要冒火星子了。

多余的话

  • 也没有Root权限,所以docker这种东西是想都不要想(当然可以Root但是我只打算运行),如果有兴趣,请确认这个文档:Docker on Android

  • 如果你想要真正的 Debian 用户空间,可以试试pkg install proot-distro然后proot-distro install debian + proot-distro login debian,我这次是探索直接在Android下面运行App能到什么程度,不管这个。

跑Prometheus

为什么我决定用Pixel跑Prometheus呢?主要是下面几个原因。

  • Prometheus完全用Go写成,Go有自己的Runtime,不依赖glibc,所以我不用重新编译(有空还是重新编译的好)

    • 顺便一提,编译的时候配合GOOS=android GOARCH=arm64即可。

  • 我的手机的存储跑Prometheus正好,而且还是SSD,速度快。

  • 手机自带电池,作为监控和系统,这很完美了。

  • 最近我运行在别处的Prometheus有一点死了(主要是外接硬盘的寿命差不多了)

直接到官网下载给Linux ARM64准备的Prometheus的二进制文件,解压下来就能跑。要是没有Termux,我可能就得用gomobile先把Prometheus编译成AAR,然后再用Kotlin写一个简单的控制和配置界面了,那么会麻烦特别多。

之后我可能会把Loki之类的服务也放到这里。

安装uv

我也是没有特别期待它能运行多少Python的应用,因为很多Python的程序都有C扩展,安装要么慢,要么干脆不能安装。 但是uv用了rust的依赖,所以用来解释一下rust编译的问题是再合适不过了。

首先就是确保你的Termux里面安装了rust:pkg i rust

其次要设置正确的ANDROID_API_LEVEL,可以这么获取:export ANDROID_API_LEVEL=$(getprop ro.build.version.sdk)

还能干什么?

其实它可以作为一个很好的干杂活的服务器。由于缺失了systemd这些关键的系统组件,其应用还是受到了不小的限制。运行也不是很稳定,比如负载重的时候sshd都可能被挤崩。

话虽如此,我们都开始拿手机当服务器玩儿了,最重要的肯定是开心咯?谁会在乎可靠性和性能呢?

最后更新于

这有帮助吗?