碎碎念
本文记录了在闲置旧手机(realme GT Neo,天玑 1200,已 Root)上通过 Chroot 部署 Ubuntu 后,解决系统服务无法开机自启的具体过程。
最近稍微闲下来了,又开始折腾我的那个root后的小手机了。想当年,之前的话,在本科期间山医大,在寝室里用着舍友的wifi成功的获取了动态公网IP,用着退役的小旧手机,使用proot部署我的个人网站和其他的web服务。想想还是很开心的,最近开始重新折腾起来了。因为之前这小旧手机电池鼓包了,实在是太大了,所以就给他重新换了一个电池,重新折腾起来了。

之前的话,以及部署了chroot的ubuntu,但是由于没有重启,和systemctl等底层服务,所以只能重新想办法实现自动启动了。
由于 Android 系统底层内核被大幅精简,缺少 systemd (systemctl) 等基础组件,直接在 Chroot 环境中配置自启通常会失效。起初尝试在 Magisk/KernelSU 的开机脚本目录(/data/adb/service.d/)直接使用 chroot 命令强拉 Linux 服务,但由于 /data 分区的 nosuid 限制以及环境变量未正常注入,会导致容器内的 sudo 权限直接失效,且部分二进制文件无法被识别。同时,现代 Android 系统的后台拦截机制(BAL)也会限制后台静默拉起应用。
所以我现在需要一些思路解决一个问题,怎么实现开机自动拉起chroot环境的ubuntu,以及怎么在没有底层服务的基础上实现自动开启ssh等服务?
为了规避上述问题,最终采取了一种链式唤醒的方案。整体逻辑为:Android 开机触发底层脚本 ➔ 模拟亮屏并解锁 ➔ 前台唤醒 Termux ➔ Termux 触发进入 Ubuntu 容器 ➔ 运行 Ubuntu 内的服务守护脚本 ➔ 服务就绪后自动息屏。
以下是具体的配置步骤。
1. 编写 Ubuntu 环境的服务守护脚本
在 Ubuntu 容器内新建 /opt/autostart.sh 脚本,用于检测并启动需要的服务。逻辑是检查 SSH(22 端口)和 Teleport(内网穿透)的状态,若未运行则清理进程并重新拉起。
总之就是作为自动启动脚本和守护进程。后续只需要想办法自启动,或者循环执行这个脚本即可。
Bash
#!/bin/bash
# 文件路径:/opt/autostart.sh
LOG_FILE="$HOME/tunnel_watchdog.log"
TELEPORT_LOG="$HOME/teleport.log"
TELEPORT_WATCHDOG_LOG="$HOME/teleport_watchdog.log"
# 1. 检查 SSH 22 端口状态
if ! ss -tln | grep -q :22; then
echo "[$(date '+%F %T')] 检测到 22 端口未监听,正在启动 sshd..." >> "$LOG_FILE"
# 补全运行目录
mkdir -p /run/sshd
chmod 0755 /run/sshd
# 清理死进程并启动服务
pkill -f /usr/sbin/sshd
sudo service ssh start >> "$LOG_FILE" 2>&1 &
fi
# 2. 检查 Teleport 穿透服务状态
if ! pgrep -f "/usr/local/bin/teleport" >/dev/null 2>&1; then
echo "[$(date '+%F %T')] 检测到 Teleport 掉线,正在重新拉起..." >> "$TELEPORT_WATCHDOG_LOG"
nohup sudo /usr/local/bin/teleport start --config=/etc/teleport.yaml --pid-file=/run/teleport.pid >> "$TELEPORT_LOG" 2>&1 &
fi
exit 0
配置完成后,赋予脚本执行权限:
Bash
chmod +x /opt/autostart.sh
2. 配置 bashrc 级联触发
通过修改配置文件,使终端启动时自动执行上下游的调用。
Ubuntu 容器侧: 在 Ubuntu 用户的 ~/.bashrc 末尾追加以下内容,使其在进入 Shell 时自动触发守护脚本:
Bash
sudo /opt/autostart.sh

Termux 侧: 在 Termux 本地的 ~/.bashrc 末尾追加以下内容,使得 Termux 启动时开启自带的 SSH,并切入 Ubuntu 容器(这里的 debian 为进入 chroot 环境的别名或脚本):
Bash
sshd
debian

3. 配置 Android 开机触发脚本
在 Android 的 /data/adb/service.d/ 目录下创建 launch_termux.sh,利用 Root 权限监控开机状态并执行前台操作。
该脚本主要实现:轮询等待系统加载完成 ➔ 突破锁屏 ➔ 将 Termux 强行拉至前台 ➔ 预留时间等待 Linux 服务初始化 ➔ 模拟按键息屏。
Bash
#!/system/bin/sh
# 文件路径:/data/adb/service.d/launch_termux.sh
exec > /data/local/tmp/boot_chroot.log 2>&1
set -x
echo "=== [$(date)] 启动 Termux 强拉流程 ==="
# 1. 等待 Android 系统完成 Boot
while [ "$(getprop sys.boot_completed)" != "1" ]; do
sleep 2
done
# 2. 等待 Package Manager 与 ActivityManager 加载完毕
while ! pm path com.termux >/dev/null 2>&1; do
sleep 2
done
# 避开开机初期的负载峰值
sleep 8
# 3. 模拟操作亮屏并解锁
input keyevent 26 # 亮屏
sleep 1
wm dismiss-keyguard 2>/dev/null
input keyevent 82 # Menu 键解锁
input keyevent 3 # Home 键切回桌面
sleep 2
# 4. 唤醒 Termux
export LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib
export PATH=/data/data/com.termux/files/usr/bin:$PATH
am start-foreground-service \
-a com.termux.service_execute \
-d com.termux.execute.path:/data/data/com.termux/files/usr/bin/bash \
-n com.termux/.app.TermuxService 2>/dev/null
sleep 2
# 拉起 Termux 前台 Activity(触发 Termux .bashrc ➔ 进入 Ubuntu ➔ 触发 autostart.sh)
am start -n com.termux/.app.TermuxActivity \
-a android.intent.action.MAIN \
-c android.intent.category.LAUNCHER
# 5. 检测进程并执行息屏保护
for i in $(seq 1 5); do
if ps -ef | grep -v grep | grep -q "com.termux"; then
echo "=== Success: Termux 进程已建立 ==="
# 预留 5 秒等待内层 .bashrc 完成服务启动
sleep 5
echo "=== 执行息屏 ==="
input keyevent 26 # 模拟按下电源键,关闭屏幕
break
else
echo "=== Warning: 第 $i 次重试... ==="
am start -n com.termux/.app.TermuxActivity
sleep 3
fi
done
在 Android 宿主机的 root 环境下赋予权限:
Bash
su -c "chmod 755 /data/adb/service.d/launch_termux.sh"

测试
重启手机。系统启动就绪后,屏幕会自动亮起并解锁,随后前台拉起 Termux 界面。大约十秒后,内层脚本执行完毕,系统会自动熄灭屏幕。
此时通过 PC 已经可以直接利用 SSH 或 Teleport 连入这台设备。同时也避免了屏幕长时间常亮造成的发热和损耗,实现了旧手机作为微型服务器的完全自动化运行。
