# Android Ubuntu 手机服务器脚本

这些脚本已经删除设备地址、账号、Wi-Fi、DNS 和监控凭据。使用前需要准备：

- Android 已 Root，Magisk 会执行 `/data/adb/service.d/`；
- 已安装 BusyBox NDK 与 chroot-distro，并安装名为 `ubuntu` 的 chroot；
- Termux 包名默认为 `com.termux`，已安装 Termux:API 和 `termux-api`；
- Ubuntu 内已经安装 OpenSSH Server；
- 每次重启后会人工解锁一次手机。

整理这些脚本时，手机使用 BusyBox NDK v1.36.1、chroot-distro v2.1.0 和 Ubuntu 24.04.3 LTS。模块版本不同时，先查看对应版本的帮助和更新说明。

不同厂商的 Android、电源管理、SELinux 策略和 `cmd wifi` 行为可能不同。换到其他手机后，需要逐项检查。

## 每个文件放在哪里

| 附件 | 目标路径 | 说明 |
| --- | --- | --- |
| `60-termux-wake-keeper.sh` | `/data/adb/service.d/60-termux-wake-keeper.sh` | 启动 wake keeper |
| `termux-wake-keeper.sh` | `/data/local/termux-wake-keeper/termux-wake-keeper.sh` | 定期刷新 wake lock |
| `stop-termux-wake-keeper.sh` | `/data/local/termux-wake-keeper/stop-termux-wake-keeper.sh` | 手动停止并释放 wake lock |
| `94-ubuntu-services.sh` | `/data/adb/service.d/94-ubuntu-services.sh` | 首次挂载 Ubuntu 后启动 chroot 内 supervisor；supervisor 退出只重启，不再重复挂载 |
| `phone-server-services` | Ubuntu 的 `/usr/local/sbin/phone-server-services` | chroot 内服务管理脚本 |
| `98-termux-sshd.sh` | `/data/adb/service.d/98-termux-sshd.sh` | 解锁后恢复 Termux 8022 |
| `99-phone-server.sh` | `/data/adb/service.d/99-phone-server.sh` | 启动 Wi-Fi keeper |
| `wifi-keeper.config.example` | 合并进 `wifi-keeper.sh` | Wi-Fi 与 DDNS 的脱敏配置片段 |
| `ipv6-ddns-cloudflare.sh.example` | `/data/local/ipv6-ddns/ipv6-ddns.sh` | 可选的 Cloudflare AAAA 更新脚本 |

Android 侧脚本复制完成后，在 Android 的 root shell 中执行：

```sh
chmod 755 /data/adb/service.d/60-termux-wake-keeper.sh
chmod 755 /data/adb/service.d/94-ubuntu-services.sh
chmod 755 /data/adb/service.d/98-termux-sshd.sh
chmod 755 /data/adb/service.d/99-phone-server.sh
chmod 755 /data/local/termux-wake-keeper/termux-wake-keeper.sh
chmod 755 /data/local/termux-wake-keeper/stop-termux-wake-keeper.sh
chmod 755 /data/local/wifi-keeper/wifi-keeper.sh
chmod 755 /data/local/ipv6-ddns/ipv6-ddns.sh
```

`phone-server-services` 在 Ubuntu 文件系统内，进入 Ubuntu chroot 后执行：

```sh
chmod 755 /usr/local/sbin/phone-server-services
```

不要直接执行一条覆盖整个 `service.d` 的复制命令。保留设备上已有的 Magisk 脚本，只复制本附件列出的文件。

## 按顺序安装

1. 安装 BusyBox NDK 与 chroot-distro，重启，再安装 Ubuntu。
2. 在 Ubuntu 内创建普通用户并配置公钥；确认 22 端口的新连接可用后，再关闭密码与 root 登录。
3. 将 `phone-server-services` 放入 Ubuntu。默认只启动 sshd；rsyslog、fail2ban、Beszel 的开关保持为 0。
4. 部署 `94-ubuntu-services.sh`，然后关闭 Android 根目录绑定：

   ```sh
   chroot-distro android-bind disable
   ```

   该命令管理 `/data/local/chroot-distro/.config/android_bind`。不要手工猜测其他配置路径。

   `94-ubuntu-services.sh` 只在首次成功时执行一次 mount。之后 supervisor 退出时，脚本只重新启动 chroot 内的 `phone-server-services`，不再重复挂载，避免挂载逐次累积；只有初次 mount 失败时才会等待 30 秒重试。
5. 部署 Termux SSH 与 wake keeper。`98-termux-sshd.sh` 会根据 Termux 数据目录读取 UID；使用其他 Termux 分支时要改 `TERMUX_PACKAGE`。
6. 从原始第四期文章取得完整 `wifi-keeper.sh`，用附件中的 `wifi-keeper.config.example` 替换配置区，再部署 `99-phone-server.sh`。填入真实 Wi-Fi 后，不要把该文件提交到公开仓库。
7. 不需要公网 IPv6 DDNS 时，把 `DDNS_ON_FIRST_IP` 设为 0，并把 `DDNS_SCRIPT` 留空。需要 Cloudflare 时，填写 `.example` 中的三个变量再改名部署。
8. 重启后先解锁，再检查 Termux 8022、Ubuntu 22、挂载数量和日志。脚本进程存在不等于端口已经可以连接。

## 可选服务

`phone-server-services` 里的 rsyslog、fail2ban 和 Beszel 默认关闭。启用前需要满足：

- rsyslog 能创建并写入 `/var/log/auth.log`；
- fail2ban 能读取该日志，并将 Tailnet 与管理网段加入 `ignoreip`；
- `/etc/default/beszel-agent` 已由 Beszel Hub 生成，且不把 token 或 key 提交到仓库。

这台手机的 rsyslog、fail2ban 和高负载问题还没有处理完，因此这些服务默认关闭。

## 来源

- 第一期，设备与公网条件：<https://linux.do/t/topic/2157272>
- 第二期，ACC 与供电：<https://linux.do/t/topic/2177558>
- 第四期，Wi-Fi/IPv6 keeper 与 DDNS：<https://linux.do/t/topic/2245634>
- 第五期，Termux 与 Ubuntu chroot：<https://linux.do/t/topic/2250359>
- chroot-distro Magisk 模块命令与配置：<https://github.com/Magisk-Modules-Alt-Repo/chroot-distro>

`99-phone-server.sh` 和 `wifi-keeper.config.example` 配合第四期文章中的 Wi-Fi keeper 使用。其他文件负责启动 Termux、Ubuntu 和选中的 Ubuntu 服务。
