安装Termux App
开源项目地址:https://github.com/termux/termux-app
下载地址,直接下载termux,不要下载成了f-droid:
https://f-droid.org/en/packages/com.termux/
安装Ubuntu
在 Termux 里安装 Ubuntu,标准且推荐的方法是通过 proot-distro 工具。整个过程不需要 Root 权限,跟着下面的步骤操作即可。
📋 准备工作
确保 Termux 是从 F-Droid 下载的(Google Play 版本已废弃),手机剩余存储空间建议在 4GB 以上。
🚀 安装步骤
1. 更新 Termux 包列表
bash
pkg update && pkg upgrade -y
过程中如果提示配置文件冲突,直接按回车或输入 N 即可。
2. 安装 proot-distro
bash
pkg install proot-distro -y
3. 安装 Ubuntu
bash
proot-distro install ubuntu
这会下载 Ubuntu 24.04 LTS 的 rootfs 文件,大小约 200-400MB,耐心等待完成。
4. 登录 Ubuntu 环境
bash
proot-distro login ubuntu
看到命令提示符变成 root@localhost:~# 就说明成功了。
5. 初始化 Ubuntu(在 Ubuntu 环境内执行)
bash
apt update && apt upgrade -y
apt install sudo nano -y
🔄 日常使用
以后每次打开 Termux 想进入 Ubuntu,只需执行:
bash
proot-distro login ubuntu
如果希望打开 Termux 自动进入 Ubuntu,可以把这条命令追加到 ~/.bashrc 文件中。
💡 小提示
proot 环境不支持 systemd ,所以像 systemctl 这类命令用不了。需要后台运行服务时,可以直接用 nohup 或 & 来启动进程。
安装Open SSH服务
要让外部设备远程登录你 Termux 里的 Ubuntu,需要在 Ubuntu 内部单独装一个 SSH 服务,并换一个和 Termux 自带的 SSH 不冲突的端口。
🛠️ 操作步骤
在 Ubuntu 环境内(也就是你现在所在的 root@localhost:~# 提示符下)执行以下操作:
-
安装 OpenSSH 服务端
bashapt update && apt install -y openssh-server -
生成主机密钥(必须执行)
bashssh-keygen -A -
设置 root 密码(用于远程登录)
bashpasswd输入并确认一个新密码。
-
修改 SSH 配置,换到新端口
bashnano /etc/ssh/sshd_config找到
Port那一行(如果被注释了就去掉#),把它改成 2222 (或者任何其他不冲突的端口,比如 10022)。不要用 8022,因为那是 Termux 自己用的。 -
启动 SSH 服务
bash/usr/sbin/sshd注意:Ubuntu 里不能用
service ssh start或systemctl,直接用这个绝对路径启动即可。 -
保持 Termux 会话不要关闭
sshd是作为当前 proot 会话的子进程运行的,一旦你退出这个 Termux 会话,它就会被终止。
💻 从电脑连接测试
现在在你的电脑上(确保和手机在同一个 Wi-Fi 下),执行:
bash
ssh -p 2222 root@手机IP
手机 IP 可以在 Termux(不是在 Ubuntu 里)用 ifconfig 或 ip addr 查看,通常是以 192.168. 开头的那一串。
如果连接被拒绝,先检查 sshd 是否在运行:在 Ubuntu 里执行 ss -tln | grep 2222,看看端口有没有在监听。
到此,你可以远程登录手机上的ubuntu系统了
远程登录时,拒绝密码登录解决方案
这个错误在 Termux + Ubuntu 的环境里很常见,主要原因是 Ubuntu 的 SSH 服务默认禁止 root 用户直接登录 ,或者 密码认证方式没打开。
核心原因:Ubuntu 默认不允许 root 密码登录
你的 Termux Ubuntu 里,你用的账号是 root。大多数 Linux 发行版的 SSH 服务出于安全考虑,默认不允许 root 用户通过密码远程登录。所以即使密码输对了,服务器也会直接拒绝。
解决方法:修改 SSH 配置
在手机上的 Ubuntu 环境里操作(也就是你现在 root@localhost:~# 的那个窗口):
1. 编辑 SSH 配置文件
bash
nano /etc/ssh/sshd_config
2. 找到并修改以下两行
如果行首有 #,去掉它。确保最终是这两个值:
PermitRootLogin yes
PasswordAuthentication yes
PermitRootLogin yes:明确允许 root 用户登录。PasswordAuthentication yes:确保允许用密码认证,而不是只认密钥。
3. 额外检查一项(Termux 环境特有)
在同一文件里找到 UsePAM,把它改成 no:
UsePAM no
因为 Termux 的 proot 容器里没有完整的 PAM 环境,开着它可能导致 sshd 启动失败或认证异常。
4. 保存退出
按 Ctrl+O 保存,回车确认,再按 Ctrl+X 退出。
5. 重启 SSH 服务
先杀掉旧的 sshd 进程,再重新启动:
bash
pkill sshd
/usr/sbin/sshd
注意:Ubuntu 里不能用
systemctl restart sshd,那在 proot 环境里无效。
如果还是不行,检查这几点
- 确认 Xshell 里填的端口 :必须是你设置的
2222(或你改的其他端口),不是默认的 22。 - 确认密码已设置 :在 Ubuntu 里执行
passwd root重新设一次,输入时屏幕不显示字符是正常的。 - 确认 IP 正确 :在 Termux(不是 Ubuntu)里执行
ifconfig,确认手机 Wi-Fi 的 IP 地址。 - 确认 Termux 会话没关 :
sshd是依附在当前 Termux 会话上的,Termux 关掉服务就停了。
安装Docker
ubuntu里不能直接装Docker,需要在Termux里装
核心思路是:在 Termux 主机(而非 proot Ubuntu 内部)运行 udockerd,让 proot Ubuntu 里的 docker 客户端通过网络连接到它。 这样绕过了 proot 无法运行 Docker 守护进程的限制。
🧐 架构原理
udockerd 是一个用 Python 写的 Docker Engine API 兼容守护进程,底层由 udocker 驱动,无需 root、namespaces 或 cgroups。它运行在 Termux 主机 上,监听一个 TCP 端口(默认 2375)。然后你的 proot Ubuntu 里的 docker 客户端,通过设置 DOCKER_HOST=tcp://127.0.0.1:2375,就能和它通信。
📦 操作步骤
第一步:在 Termux 主机(不是 proot 内)安装 udockerd
打开 Termux(就是你平时打开的那个终端,不要 用 proot-distro login ubuntu 进去),执行:
bash
# 安装 Python 和必要依赖
pkg update && pkg upgrade
pkg install python python-pip curl tar
# 安装 udockerd
pip install udockerd
udockerd 需要 Python 3.12+ 和 curl/tar。安装完成后,udockerd 命令应该就可以用了。
第二步:启动 udockerd 守护进程
在 Termux 主机上,让它后台运行:
bash
# 后台启动 udockerd,监听默认的 127.0.0.1:2375
nohup udockerd > ~/udockerd.log 2>&1 &
如果想让日志更详细便于排查,可以加 -v:
bash
nohup udockerd -v > ~/udockerd.log 2>&1 &
udockerd 首次运行时,udocker 会自动下载它需要的 proot/fakechroot 执行后端,可能需要一点时间。
验证是否启动成功:
bash
ps aux | grep udockerd
# 或者看端口是否在监听
netstat -tlnp 2>/dev/null | grep 2375
第三步:进入 proot Ubuntu,配置 DOCKER_HOST
现在进入你的 Ubuntu 环境:
bash
proot-distro login ubuntu
在里面设置环境变量,指向 Termux 主机上运行的 udockerd:
bash
export DOCKER_HOST=tcp://127.0.0.1:2375
为了让这个设置永久生效,可以写入 ~/.bashrc:
bash
echo 'export DOCKER_HOST=tcp://127.0.0.1:2375' >> ~/.bashrc
source ~/.bashrc
注意 :
127.0.0.1在这里是可行的,因为 proot 环境共享 Termux 主机的网络命名空间,localhost 是互通的。
第四步:测试 docker 命令
bash
docker ps # 应该不再报 socket 错误,而是显示空列表
docker pull alpine
docker run --rm alpine echo hello
⚠️ 重要限制
使用 udockerd 时,有几个明确的边界需要知道:
docker build 仅支持经典构建器 :如果你的 Docker CLI 默认使用 BuildKit,需要设置 export DOCKER_BUILDKIT=0 才能正常 build。
无进程隔离:udocker 的容器和 Termux 主机共享 PID namespace,不是真正的隔离环境,只适合单租户场景(也就是你自己用)。
无 docker compose:udockerd 不直接支持 docker compose,如果需要编排多个容器,只能手动用脚本管理。
仅限 Linux:udockerd 依赖 proot,只能在 Linux 内核上运行。
💡 后续建议
udockerd 启动后,终端关闭它可能会被终止。如果想让它长期稳定运行,可以考虑结合 termux-wake-lock 防止 Termux 被系统休眠,或者用 nohup + 后台方式确保进程存活。
如果你后续想跑一些实际的镜像(比如 Home Assistant、Jellyfin、Nextcloud 等),社区有现成的 Termux-Udocker 脚本可以参考,能省去手动配置端口映射和挂载的麻烦。