把手机变成 Linux 服务器:Termux 上手指南
2026-08-15 22:25:05
[[toc]]
## 引言
想象一下:你口袋里的一部 Android 手机,随时可以化身为一台完整的 Linux 服务器——能跑 Ubuntu、能开 SSH、能通过浏览器远程执行命令、甚至能运行 VS Code 网页版。这不是科幻,这就是 Termux 能做到的事情。
本文将从零开始,带你了解 Termux 是什么、它的工作原理,然后一步步搭建 SSH 远程访问、ttyd 网页终端、Ubuntu 子系统,以及 code-server 在线 IDE。读完这篇,你的手机就不再只是手机了。
> **⚠️ 重要提示**:本文所有操作**不需要 root 权限**,普通 Android 手机即可完成。将服务暴露到外网时务必设置密码,注意安全。
---
## 一、Termux 是什么?
Termux 是一个运行在 Android 上的高级终端模拟器和 Linux 环境,无需 root 权限即可提供近乎完整的 Linux 命令行体验。通过 `pkg` 包管理器,你可以安装大量 Linux 软件包——从 Python、Node.js 到 Nginx、PostgreSQL,应有尽有。
### Termux 的原理
Termux 能在未 root 的 Android 上运行 Linux 程序,核心在于它利用了 Android 的 **bionic libc** 兼容层和 **proot** 技术:
1. Termux 本身是一个 Android 应用,运行在用户空间。
2. 它提供了一个经过修改的 Linux 文件系统布局(`/data/data/com.termux/files/usr`),所有软件包安装在此目录下。
3. 通过 `proot` 工具,Termux 可以模拟出 `chroot` 环境,让 Linux 程序认为自己运行在标准的 Linux 根文件系统中。
具体而言,proot 通过 Linux 的 `ptrace` 机制拦截 guest 进程的系统调用,动态重写文件系统路径,从而创建一个无需 root 权限的虚拟根文件系统。性能损失很小,**并非虚拟机**那种重量级方案。
---
## 二、准备工作:安装 Termux
### 下载安装
**请务必从 F-Droid 或 Termux GitHub Releases 下载安装**,Google Play 上的版本可能已过时。
- F-Droid:https://f-droid.org/en/packages/com.termux/
- GitHub Releases:https://github.com/termux/termux-app/releases
### 基础更新
打开 Termux,首先更新软件包:
```bash
pkg update && pkg upgrade -y
```
### 关于后台运行限制(Android 12+)
在新版 Android 系统上使用 Termux,有两个与“后台存活”相关的限制需要留意:
- **电池优化(Doze 模式)**:系统为省电,会在 Termux 切到后台后冻结其 CPU 活动,导致任务暂停(如 SSH 连接断开、下载中断)。
- **幽灵进程限制(Android 12+)**:系统限制所有应用的后台“幽灵”进程总数不超过 32 个,Termux 的后台任务超限时会被直接杀死(终端提示 `[Process completed (signal 9)]`)。
**简要应对方法**:
1. **关闭电池优化**:在系统设置中找到 Termux 的“电池”或“省电策略”,设为 **“无限制”**(不同品牌路径不同,常见于“应用管理”→“Termux”→“省电策略”);同时在多任务界面下拉锁定 Termux 卡片。
2. **获取唤醒锁**:Termux 在后台运行时,通知栏会常驻一条通知。展开该通知,长按其中的“Acquire wake lock”按钮即可获取唤醒锁,防止 CPU 被深度休眠挂起;任务结束后可再次长按释放。
**针对“幽灵进程限制”**:进入手机 **开发者选项**,找到与“子进程限制”或“幽灵进程监控”相关的开关(例如 Android 14 的“停用子进程限制”),将其开启即可。不同系统版本和厂商的路径及名称略有差异,请根据你的手机型号自行检索具体位置。
---
## 三、设置密码
开启 SSH 前,需先设置用户密码:
```bash
passwd
```
系统会提示输入并确认密码。该密码将用于 SSH 登录的认证。
---
## 四、远程访问方式一:OpenSSH
在手机上直接操作 Termux 不够方便——屏幕小、虚拟键盘体验不佳。开启 SSH 后,即可用电脑终端远程连接手机。
### 安装与启动
```bash
pkg install openssh
sshd
```
Termux 的 sshd 默认监听 **8022 端口**(而非标准的 22 端口)。
### 查看 IP 并连接
```bash
ifconfig
```
记下手机 IP 地址,在电脑上执行:
```bash
ssh 用户名@手机IP -p 8022
```
用户名为 Termux 中 `whoami` 命令的输出结果。
---
## 五、远程访问方式二:ttyd(网页终端)
若不想安装 SSH 客户端,或希望在任何有浏览器的设备上访问终端,ttyd 是一个高性能、低延迟的选择。
### 什么是 ttyd?
ttyd 是一个基于 HTML5 WebSocket 协议的轻量级命令行终端共享工具,它把终端会话以网页形式呈现,用户通过浏览器即可获得完整的终端体验。ttyd 采用 WebSocket 全双工通信,相比传统的 HTTP 轮询方式,延迟更低、交互更流畅,且该项目维护活跃,兼容性好。
### 安装与启动
```bash
pkg install ttyd
```
ttyd 默认将 bash 作为终端程序,可直接启动:
```bash
ttyd -p 7681 --writable bash
```
- `-p 7681` 指定监听端口(默认即为 7681)。
- `--writable` 允许终端写入(即允许用户输入命令)。
- 默认监听所有网络接口(`0.0.0.0`),从任意设备均可访问。
若只需本地访问,可加上 `-i 127.0.0.1` 仅监听本机。
### 设置密码(可选但推荐)
ttyd 支持基本认证,使用 `-c` 参数指定用户名和密码:
```bash
ttyd -p 7681 --writable -c 用户名:你的密码 bash
```
这样浏览器访问时会弹出登录框,输入用户名和密码即可。
### 浏览器访问
在浏览器中打开 `http://手机IP:7681`,即可看到终端界面,输入命令操作。
**注意**:ttyd 默认使用 HTTP 协议,如需 HTTPS,可借助 Nginx 反向代理或使用 `--ssl` 参数指定证书(需手动生成)。
### 关于会话持久化
ttyd 页面刷新后会断开当前会话并启动新会话,适合一次性任务或临时远程操作。若需要保持会话不断,可搭配 `tmux` 或 `screen` 在终端内运行。
---
## 六、在 Termux 中安装 Ubuntu(proot-distro)
Termux 基于 Android 的 bionic libc,与标准 GNU/Linux 发行版(如 Ubuntu)存在差异——某些库、工具链和系统调用行为不同。若需要**完整的 Ubuntu 体验**,可通过 `proot-distro` 实现。
### proot-distro 的原理
proot-distro 是 Termux 官方开发的 rootless Linux 容器管理工具,核心是 **proot**——一种用户空间的 `chroot`、`mount --bind` 和 `binfmt_misc` 实现。
**与 Docker 的关键区别**:
- **Docker** 依赖 Linux 内核的命名空间(namespaces)、Cgroups 等隔离机制,提供强隔离。
- **proot** 仅通过 `ptrace` 拦截系统调用并重写路径,**无内核级别的隔离**。
因此,proot-distro 的容器**不能当作安全隔离沙箱使用**——容器内进程与 Termux 共享部分资源,并非完全隔离。优点是**无需 root 权限**,且性能开销极小。
> **关键信息**:从 **v5.0** 开始,proot-distro 底层完全用 Python 重写,**直接支持从 Docker Hub 拉取 OCI/Docker 镜像**创建容器。这意味着可安装的 Linux 发行版不限于官方预置的几个,而是**任何在 Docker Hub 上能找到的镜像**——Ubuntu、Debian、Alpine、Arch、openSUSE 等。v5.1 进一步扩展了 OCI 镜像支持,可从 Docker Hub、GitHub Container Registry(ghcr.io)等任意兼容仓库拉取。此外,proot-distro 还可**直接从 Dockerfile 构建 OCI 镜像**,完全不需要 Docker 守护进程。
### 安装 proot-distro
```bash
pkg install proot-distro
```
安装时会自动将 `proot` 作为依赖一并安装。proot-distro 同时提供了 `proot-distro` 和短别名 `pd` 两个命令。
### 安装 Ubuntu
```bash
proot-distro install ubuntu
```
等待镜像下载和安装完成即可。
> **注意**:从 v5.0 开始,proot-distro 直接从 Docker Hub 拉取官方镜像,不再自己维护 rootfs 压缩包。因此获得的 Ubuntu 是“原汁原味”的官方镜像。
### 列出已安装的容器
```bash
proot-distro list
```
### 列出本地缓存的 OCI 镜像
```bash
proot-distro list --image
```
### 进入 Ubuntu
```bash
proot-distro login ubuntu
```
默认以 root 身份登录。如需以普通用户登录:
```bash
proot-distro login ubuntu --user 用户名
```
进入 Ubuntu 后,即可像操作正常 Ubuntu 服务器一样使用 `apt`:
```bash
apt update && apt upgrade -y
apt install sudo vim git
```
### 退出 Ubuntu
按 `Ctrl + D` 退出 Ubuntu 环境,回到 Termux。
---
## 七、proot-distro 的高级参数
proot-distro 提供了一些高级参数,在特定场景下使用:
### `--isolated`
跳过非必要的宿主绑定挂载,Android 系统目录、Termux 应用路径、`/sdcard` 等不会自动挂载到容器内部。但 proot 的 `link2symlink`、`sysvipc`、`kill-on-exit` 等扩展功能及内核版本覆盖(`--kernel-release`)仍然保留。**与 `--minimal` 互斥**,不能同时使用。
### `--minimal`
提供最精简的 proot 环境:仅绑定 `/dev`、`/proc`、`/sys` 三个基本文件系统,禁用 `--sysvipc`,不创建假的 `/proc` 存根(stubs),不设置 `--kernel-release`。容器内环境变量仅包含用户通过 `--env` 指定的条目,外加 `TERM` 和 `COLORTERM`。**与 `--isolated` 互斥**,不能同时使用。
**使用场景**:
- 测试某软件在“纯净”环境中的行为。
- 怀疑 Termux 的绑定挂载干扰了容器内程序的运行时。
**一般用户保持默认即可**,不建议随意使用这两个参数。
### `--detach`
让容器进程在后台运行,脱离当前终端。
---
## 八、code-server:在浏览器中写代码
code-server 是 VS Code 的网页版,通过浏览器即可获得完整的 VS Code 编辑体验。proot-distro v5.0 支持直接从 Docker Hub 拉取 OCI 镜像,而 code-server 官方在 Docker Hub 上发布了现成镜像,因此可直接通过 proot-distro 安装 `codercom/code-server`,无需手动在 Ubuntu 容器内安装。
### 安装 code-server 容器
```bash
proot-distro install codercom/code-server
```
该命令从 Docker Hub 拉取 `codercom/code-server` 镜像,并在本地创建一个名为 `code-server` 的容器。
> **注意**:如遇网络问题,可配置 Termux 代理或更换镜像源。proot-distro v5.1 支持从 Docker Hub、GitHub Container Registry(ghcr.io)等多个仓库拉取镜像。
### 启动 code-server
通过 `run` 命令启动容器内的 code-server 服务。`run` 命令执行容器镜像中定义的 Entrypoint 和 Cmd:
```bash
proot-distro run code-server -e PASSWORD=你的密码
```
> **提示**:从 v5.4.0 开始,`login` 和 `run` 命令支持 `--detach` 选项,可将进程启动为后台永久运行。
### 后台运行
```bash
proot-distro run code-server --detach
```
### 浏览器访问
code-server 默认监听 `127.0.0.1:8080`。在浏览器中打开 `http://127.0.0.1:8080`(如从其他设备访问,将 127.0.0.1 替换为手机 IP),输入密码即可开始 coding。
### 查看与管理容器
```bash
# 查看已安装的容器
proot-distro list
# 查看正在运行的会话(v5.4.0+)
proot-distro ps
```
### 注意事项
- 暴露到外网时**务必设置密码**,或使用 SSH 隧道转发。
- `codercom/code-server` 镜像支持 arm64 和 amd64 架构,在 Android 手机(通常为 arm64)上可正常运行。
---
## 九、进阶玩法:proot-distro + Docker 镜像
proot-distro v5.0 最激动人心的特性就是**直接支持 Docker/OCI 镜像**:
### 安装任意 Docker Hub 镜像
```bash
# 安装 Alpine Linux
proot-distro install alpine:latest
# 安装特定版本的 Ubuntu
proot-distro install ubuntu:22.04
# 安装 Arch Linux
proot-distro install archlinux/archlinux:base-20260517.0.530531
```
### ⚠️ 安全提醒
**proot-distro 的容器没有内核级别的隔离**,容器内进程与 Termux 共享内核资源,**不能当作安全的沙箱使用**。若在容器中运行不可信代码或将服务暴露到公网,务必做好防护:
1. 设置强密码(SSH、ttyd、code-server 均需)。
2. 使用防火墙或 SSH 隧道限制访问。
3. 敏感数据不要放在容器中。
4. 定期更新 Termux 和 proot-distro。
---
## 十、补充:ttyd 的实用技巧
ttyd 除了基本启动外,还有一些灵活用法,可适应不同场景。
### 指定不同的 shell
默认使用 `bash`,你可以换成 `zsh`、`fish` 或直接运行程序:
```bash
ttyd -p 7681 zsh
ttyd -p 7681 python3
```
### 启用 SSL(HTTPS)
若需要加密传输,可使用 `--ssl` 和 `--ssl-cert`/`--ssl-key` 指定证书文件:
```bash
ttyd -p 443 --ssl --ssl-cert /path/to/cert.pem --ssl-key /path/to/key.pem bash
```
自签名证书可自行生成,但浏览器会提示不安全,生产环境建议使用 Let's Encrypt 等正规证书。
### 配合 tmux 实现会话持久化
由于 ttyd 刷新页面会重新创建终端进程,可以结合 `tmux` 让命令在后台持续运行,即使网页断开也不影响:
```bash
ttyd -p 7681 --writable tmux new -A -s mysession
```
这样每次打开浏览器都会自动连接到同一个 tmux 会话,命令不会丢失。
### 限制访问来源
若不想暴露到整个网络,可使用 `-i 127.0.0.1` 仅监听本地,再配合 SSH 隧道转发。
### 与 proot-distro 容器结合
你甚至可以让 ttyd 直接进入 proot-distro 的容器内部:
```bash
ttyd -p 7681 --writable proot-distro login ubuntu
```
这样网页打开就直接是 Ubuntu 环境的终端。
---
## 十一、总结
通过 Termux,你可以把一部普通 Android 手机变成功能完备的 Linux 服务器:
| 工具 | 用途 | 端口 |
|------|------|------|
| OpenSSH | 命令行远程访问 | 8022 |
| ttyd | 高性能浏览器终端访问 | 7681 (HTTP/HTTPS) |
| proot-distro | 运行完整 Linux 发行版 | - |
| code-server | 浏览器 VS Code | 8080 |
**这一切均无需 root 权限**。无论是用旧手机做家庭服务器,还是在平板上临时搭建开发环境,Termux + proot-distro 的组合都提供了无限可能。
**最后提醒**:将服务暴露到公网前,务必设置好密码认证,并了解 proot 容器并非安全沙箱。安全第一,玩得开心!
---
*本文信息基于 Termux、proot-distro v5.0/v5.1 及相关工具的最新文档编写,部分命令和参数可能随版本更新而变化。*
分类:分享 关键词:termux, proot-distro
评论(0) 浏览(25)