Android手机上部署Linux服务器 在Termux里安装Ubuntu

安装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:~# 提示符下)执行以下操作:

  1. 安装 OpenSSH 服务端

    bash 复制代码
    apt update && apt install -y openssh-server
  2. 生成主机密钥(必须执行)

    bash 复制代码
    ssh-keygen -A
  3. 设置 root 密码(用于远程登录)

    bash 复制代码
    passwd

    输入并确认一个新密码。

  4. 修改 SSH 配置,换到新端口

    bash 复制代码
    nano /etc/ssh/sshd_config

    找到 Port 那一行(如果被注释了就去掉 #),把它改成 2222 (或者任何其他不冲突的端口,比如 10022)。不要用 8022,因为那是 Termux 自己用的。

  5. 启动 SSH 服务

    bash 复制代码
    /usr/sbin/sshd

    注意:Ubuntu 里不能用 service ssh start 或 systemctl,直接用这个绝对路径启动即可。

  6. 保持 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 脚本可以参考,能省去手动配置端口映射和挂载的麻烦。

相关推荐
IT利刃出鞘1 小时前
Linux权限--adduser和useradd的区别
linux·运维·服务器
Ruiery1 小时前
Linux 6.6内核内存管理深度解析(五):page cache(页缓存)— 读缓存在内存、写延迟回写
linux·运维·服务器·缓存
星恒随风1 小时前
Linux进程信号(一):从Ctrl+C到kill、raise、alarm,深入理解信号的概念与产生原理
linux·c语言·笔记·学习·状态模式
恋猫de小郭1 小时前
Flutter Android 改动:APK 不再允许通过 Intent 动态修改 Engine 参数
android·前端·flutter
honsor1 小时前
机房动环监控:以太网温湿度传感器选型与部署全解
运维·服务器·网络·物联网·网络协议·tcp/ip
idcardwang1 小时前
智嵌物联,串口-wifi网关的配置
运维·服务器·网络
一条泥憨鱼2 小时前
【从0开始学习计算机网络】| 从一次 ping 出发:ICMP、路由协议与网关边界
服务器·网络·ip
MinterFusion2 小时前
如何在开放麒麟(openKylin)下安装GTK(v0.1.0)
linux·操作系统·软件安装·gtk·明德融创·openkylin·linux图形软件开发
Lzg_na2 小时前
FAT文件系统详解
linux