我在Termux上运行GraalVM JDK22来运行Minecraft服务器,以及使用ZeroTier确保我可以在任何地方通过VPN来很安全地连接我的这台“服务器”。本文将根据我的方案进行详细地说明我是如何配置环境并解决各种遇到的问题的。

我的情况可能会比其他用旧手机搭建服务器的人更极端一点,因为我使用的旧手机的屏幕已经完全报废了,无法触控,所以我刷机都是靠fastboot和adb,操作全靠qtscrcpy。

ZeroTier 链接到标题

这一部分比较简单,就不过多赘述了。Termux里没法装ZeroTier,只能在安卓层面进行安装。

不过为了方便维护,我需要让安卓上的ZeroTier被自动启动。我们在安卓的设置里打开VPN的选项,给ZeroTier One启用Always-on VPN,之后安卓就会让ZeroTier一直被连着,重启之后也会保持连接了。

图片

Termux 链接到标题

安装本体这一部分其实也没什么可以讲的。不过由于我们是做服务器,所以我建议我们同时安装上Termux:Boot这个插件,这样可以在后续维护的时候省事很多。

Termux和这个插件都可以在F-Droid上下载。至于为什么不在Github上直接下载呢,因为Github的Termux:Boot的签名有问题,没办法正确安装。

这是下载地址:

https://f-droid.org/en/packages/com.termux/

https://f-droid.org/en/packages/com.termux.boot/

安装Termux之后该换源的用termux-change-repo命令然后按照提示换源。

之后执行apt upgrade,把所有软件包更新一下。

其实Termux可以选择使用pacman来管理软件包,不过默认是apt,另外配置成pacman比较麻烦,再加上我不会用pacman,所以我使用默认的apt来管理包。本文演示也全都是使用apt。

配置ssh 链接到标题

安装:

pkg install openssh

之后可以使用sshd命令来启动ssh服务器,这不会阻塞你的终端。

默认的端口是8022。

用户的密码请使用 passwd 命令来设置,用户名使用 whoami 命令查看。

之后就可以从别的地方来连接SSH和SFTP了。

设置初始化 链接到标题

上文提到了建议安装Termux:Boot,这个插件是用来让你的手机在开机的时候自动启动Termux并在Termux中执行初始化命令的。

在安装这个插件之后启动它一次,之后就不需要再手动启动了。

我们到/data/data/com.termux/files/home/.termux/boot目录(~/.termux/boot)(这个目录不存在的,你需要手动创建它)里,这个目录里的所有脚本都会被Termux:Boot在启动时运行一遍。你需要在这个目录里创建你的初始化脚本。

我是这样配置的:

创建一个init.sh,里面的内容为:

#!/data/data/com.termux/files/usr/bin/sh
termux-wake-lock
sshd

使用SFTP并且编辑内容的设备是Windows系统的人,注意保存时设置得换行符为LF,否则一定会报错。

这段脚本首先调用了Termux的一个命令,让Termux保持CPU唤醒,避免因熄灭屏幕导致性能降低。然后启动了ssh服务器。

设置环境时区 链接到标题

在Termux中使用date查看到的时间是和手机的时间一样的。但是运行Java程序时会发现里面的时区不正确。

解决办法很简单,我们只需要在 /data/data/com.termux/files/usr/etc/profile 的末尾追加这样一行:

export TZ=Asia/Shanghai

这里示例是把时区改成上海的时间。

glibc 链接到标题

安装 链接到标题

Termux中不包含glibc,这导致很多Linux aarch64程序无法在Termux中运行。好在Termux有glibc的实现可以安装——glibc-packages。官方仓库在:https://github.com/termux-pacman/glibc-packages

这个包是只有在Termux的pacman下有的,不过好在有提供apt格式的包。这个仓库见:https://github.com/termux/glibc-packages/

你要做的是:

pkg install glibc-repo -y
pkg install glibc-runner -y

这样就把要用的包安装好了。

配置 链接到标题

参见:

https://github.com/termux-pacman/glibc-packages/issues/61

https://github.com/termux-pacman/glibc-packages/issues/38

我需要用到grun的是Graal JVM。因为Termux的仓库里提供的JDK只有OpenJDK 17。而GraalVM直接在Termux运行是会报缺少文件的错误的。

把需要用的软件下载并解压出来之后,到二进制文件所在的目录(bin)里,给这里面所有二进制文件设置成使用grun运行。

因为如果只给java本体添加上这个,它依赖的各种动态链接库文件也会需要glibc,然后报错。

这是我cd之后使用的命令(从上面的一个Issue里改的):

for i in ./*; do
    grun -t $i
done

如果你需要打开一个使用glibc-runner的shell,执行: grun --shell

你可以直接把这一段添加到 /data/data/com.termux/files/usr/etc/bash.bashrc 的末尾。

配置Java 链接到标题

就正常地把java的bin目录添加到环境变量里就好了。像我就是在profile.d里创建了一个sh文件,内容为:

PATH="/data/data/com.termux/files/home/graalvm-jdk-22.0.1+8.1/bin:$PATH"

配置自动服务器 链接到标题

我已经配置好了服务器。接下来我创建了一个sh文件,方便我一键运行里面包含的所有服务。

按照我的习惯,我不使用任何第三方面板,而是直接使用screen来管理多个需要同时运行的不同窗口,这是我的示例:

#!/bin/sh

screen -wipe

cd ~/frp
screen -dmS "frp" "./start.sh"

cd ~/redstone
screen -dmS "redstone" "./start.sh"

之后,可以把这个文件链接到~/.termux/boot里,以便在手机开机时自动运行。

ln -F ./server.sh ./.termux/boot/server.sh

Android层面的事情 链接到标题

从爱玩机工具箱里找了几个Magisk模块刷进去,至少看上去是我已经对各方面进行了调优。至于实际表现是否真的有变好,这我就不知道了。

主要是Android本身就不是为服务器准备的。

安装自动启用无线ADB,是因为我不想再来回把这个USB线在连接电脑和插头上反复切换了。

我一开始其实更多是想找能禁用一些安卓上给正常手机使用的模块的,比如负责人脸识别的APP、相册、推送服务、音频服务,不过最后都没有找到,也就放弃了。

这是我的模块列表:

图片

图片