把手机变成 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)