📚 Termux 无 Root 学习开发系列
阶段一:环境搭建与终端基础 ✅ 已完成
01-05 Termux 安装 → 包管理 → 文件管理 → Vim/tmux
阶段二:编程开发环境 ✅ 已完成
06-09 Python → C/C++ → Node.js → Git
阶段三:网络与远程操作 ✅ 已完成
10-12 SSH → 网络工具 → 网络代理
阶段四:Termux:API 与自动化 ✅ 已完成
13-14 Termux:API → 定时任务与自动化
阶段五:proot-distro 完整 Linux
15 proot-distro:在手机上运行完整 Linux(当前篇)
16 Jupyter Notebook 与数据科学环境
17 桌面环境与 VNC 远程
阶段六至九共 11 篇,后续持续更新

15 proot-distro:在手机上运行完整 Linux

难度:进阶→高级 | 前置:08 Git 版本控制
读完本篇你将能:在无 root 的手机上安装完整的 Ubuntu 26.04 LTS 环境,像操作桌面 Linux 一样使用 apt 安装软件、编译 C++ 项目、运行 Python 数据科学栈——手机不再只是 Termux 终端,而是一台口袋里的 Linux 服务器。
📑 本文目录
01proot 原理与 proot-distro v5.x 概述
02安装与快速上手
03容器管理:列表、删除、备份与恢复
04Ubuntu 环境配置
05文件互通与多发行版管理
06Dockerfile 构建与高级用法
07性能优化与限制说明

01 proot 原理与 proot-distro v5.x 概述

Termux 自带的包管理系统已经能装 Python、Node.js、Git 等常用工具,但它终究是 Android 的精简用户态——没有完整的 apt,没有 systemd,很多 Linux 软件无法编译运行。要在手机上跑完整的 Ubuntu 或 Debian,传统方案需要 root 权限做 chroot,而 proot 提供了一条无需 root 的路径。

proot 是什么:用 ptrace 模拟 root

proot 的核心原理是利用 Linux 内核的 ptrace 系统调用拦截子进程的系统调用请求。当容器内的程序试图调用 open("/etc/apt/sources.list") 时,proot 会在内核真正执行前拦截这个调用,把路径重写为 /data/data/com.termux/files/usr/var/lib/proot-distro/installed-rootfs/ubuntu/etc/apt/sources.list。程序以为自己在真实的根目录下操作,实际上所有文件访问都被透明地重定向到了容器目录。
这种"用户态 root 模拟"带来两个关键优势:一是不需要内核权限,任何非 root 用户都能运行;二是完全隔离,每个容器有独立的文件系统树,互不干扰。代价是每次系统调用都要经过 ptrace 拦截和路径翻译,IO 密集型操作会比原生慢 10%-30%。
→程序调用 apt install python3
→proot 拦截文件操作,路径重写到容器目录
→容器内的 dpkg 正常安装 .deb 包
→程序看到的依然是 /usr/bin/python3

proot-distro v5.x:从 Bash 到 Python 的重写

proot-distro 是 Termux 团队对 proot 的封装工具,让安装和管理 Linux 发行版像 Docker 一样简单。2026 年 5 月,proot-distro 发布了 v5.0 版本,完成了从 Bash 脚本到 Python 的全面重写,当前最新版本为 v5.6.0(2026-08-12 发布)。
v5.x 最大的变化是:不再内置发行版镜像。旧版本通过 proot-distro install ubuntu 从 Termux 仓库下载预打包的 rootfs,而 v5.x 改为直接从 Docker Hub 或任何 OCI 兼容镜像仓库拉取标准 Docker 镜像——和你在服务器上 docker pull ubuntu 拿到的是同一个镜像。
v5.x 新增能力
• Dockerfile 构建:用 proot-distro build 在手机上从 Dockerfile 构建自定义 OCI 镜像,无需 Docker 守护进程
• 镜像推送:用 proot-distro push 将构建的镜像推送到 Docker Hub / GHCR
• 跨架构运行:通过 QEMU 用户模式模拟,在 ARM 手机上运行 x86_64 镜像
• 文件同步:copy 和 sync 命令在宿主和容器间双向传输文件
• 短别名:pd 作为 proot-distro 的缩写,所有命令均可使用

02 安装与快速上手

理解了 proot 的原理后,接下来动手安装。proot-distro v5.x 需要 Python 3.9+,Termux 自带 Python 满足要求。安装过程会自动拉取 proot 作为依赖。
Bash
pkg update && pkg upgrade
pkg install proot-distro
# 自动安装 proot 作为依赖
proot-distro --version
5.6.0
安装完成后,第一步不是急着装 Ubuntu,而是查看所有可用镜像。v5.x 直接从 Docker Hub 拉取,因此支持任何 Docker Hub 上的官方镜像:
Bash
# 查看已安装的容器
proot-distro list
# 输出示例(刚安装时为空)
No containers installed.
# 查看可安装的官方镜像列表
proot-distro list --image
ubuntu:24.04 ubuntu:26.04 debian:trixie alpine:latest
archlinux:latest fedora:43 opensuse/leap:16.0

安装 Ubuntu 26.04 LTS

Ubuntu 26.04 LTS(代号 Resolute Raccoon)于 2026 年 4 月发布,是 Canonical 最新的长期支持版本,支持 arm64 架构,支持周期到 2031 年。直接使用 Docker 镜像引用格式安装:
Bash
# 从 Docker Hub 拉取 Ubuntu 26.04 镜像并安装为容器
proot-distro install ubuntu:26.04
# 首次拉取会下载 ~80MB 压缩镜像
Downloading layer sha256:a1b2c3d4... (32.1 MB)
Downloading layer sha256:e5f6g7h8... (48.7 MB)
Extracting layers... done
Container 'ubuntu' installed successfully.
# 安装 Debian 13 trixie 也很简单
proot-distro install debian:trixie --name debian

进入容器与基本操作

安装完成后,用 login 命令进入容器。此时你的 Shell 环境已经完全切换到 Ubuntu——提示符变了,包管理器变成了 apt,文件系统是标准的 Linux 目录结构:
Bash
# 进入 Ubuntu 容器
proot-distro login ubuntu
# 或使用短别名
pd sh ubuntu
# 现在你在 Ubuntu 里了
cat /etc/os-release
PRETTY_NAME="Ubuntu 26.04 LTS"
VERSION="26.04 (Resolute Raccoon)"
# 退出容器
exit
💡 小贴士
v5.x 的 install 命令接受任何 Docker 镜像引用格式。你可以指定标签(ubuntu:26.04)、不指定标签默认拉取 latest(alpine),甚至使用其他镜像仓库(ghcr.io/owner/image:tag)。镜像层会被缓存,下次安装相同基础镜像的其他容器时直接复用,无需重复下载。

运行单条命令不进入 Shell

如果只想在容器里跑一条命令就出来,不需要交互式 Shell,用 -- 分隔容器名和命令:
Bash
# 在 Ubuntu 容器中执行 uname 并返回
proot-distro login ubuntu -- /bin/uname -a
Linux localhost 6.x.0... aarch64 GNU/Linux
# 在 Debian 容器中检查包列表
pd run debian -- dpkg -l | wc -l
87

03 容器管理:列表、删除、备份与恢复

你已经学会安装和进入容器了。随着容器增多,管理操作必不可少——查看列表、重命名、备份迁移、彻底删除。v5.x 的命令设计灵感来自 Docker,如果你熟悉 Docker CLI 会感到非常亲切。
v5.x 容器管理命令一览
list — 列出所有已安装容器
ps — 查看当前活跃的容器会话
kill — 终止活跃会话(可按容器名或 PID)
rename — 重命名容器
remove — 删除容器(不可恢复)
reset — 重置容器到初始镜像状态(丢失所有数据)
backup — 将容器打包为 tar 归档
restore — 从备份归档恢复容器

查看与管理活跃会话

list 查看所有已安装容器,ps 查看当前有多少个容器正在运行。这个区分很重要——你可能同时打开了多个终端窗口登录同一个容器,ps 能帮你找到并终止卡住的会话:
Bash
# 列出所有已安装容器
proot-distro list
NAME IMAGE STATUS SIZE
ubuntu ubuntu:26.04 installed 412MB
debian debian:trixie installed 287MB
alpine alpine:latest installed 12MB
# 查看活跃会话
pd ps
CONTAINER PID SESSION
ubuntu 15432 active
# 终止指定容器的活跃会话
pd kill ubuntu
# 或按 PID 终止
pd kill 15432

备份与恢复:迁移容器到新设备

当你花了一下午配置好 Ubuntu 开发环境,换手机时不想从头来过。backup 将整个容器打包成一个 tar 文件,拷到新设备后用 restore 恢复:
Bash
# 备份 ubuntu 容器到共享存储
proot-distro backup ubuntu --output ~/storage/shared/ubuntu-backup.tar.gz
Backing up 'ubuntu'...
Compressing with gzip... done (187MB)
# 在新设备上恢复
proot-distro restore ~/storage/shared/ubuntu-backup.tar.gz --name ubuntu
Restoring from archive... done
# 重置容器到初始状态(会丢失所有数据!)
pd reset ubuntu
# 彻底删除容器
pd remove ubuntu
⚠️ 常见错误
错误:Error: container 'ubuntu' has active sessions
原因:尝试 reset/remove 时容器还在运行。
修复:先执行 pd kill ubuntu 终止活跃会话,再执行 reset 或 remove。

04 Ubuntu 环境配置

容器装好后是一张白纸——只有最基础的命令行工具。接下来的配置流程和在桌面 Ubuntu 上几乎一模一样,这也是 proot-distro 的魅力:你积累的 Linux 运维经验可以直接迁移到手机上。

系统更新与开发工具安装

进入 Ubuntu 容器后,第一件事永远是更新软件源和已安装包。Ubuntu 26.04 LTS 的默认软件源已经指向了 Canonical 的 arm64 镜像服务器,不需要手动换源:
Bash
# 先进入容器
proot-distro login ubuntu
# 更新系统
apt update && apt upgrade -y
# 安装核心开发工具链
apt install -y python3 python3-pip python3-venv gcc g++ make cmake git curl wget vim nano
# 验证版本
python3 --version
Python 3.14.2
g++ --version
g++ (Ubuntu 15.1.0) 15.1.0
cmake --version
cmake version 4.2.1

配置 Locale 与中文支持

Docker 镜像默认不包含 Locale 数据,在 proot 容器里运行 Python 时可能出现 UnicodeDecodeError 或中文乱码。手动生成 Locale 可以解决:
Bash
# 安装 Locale 数据
apt install -y locales
# 生成英文和中文 Locale
locale-gen en_US.UTF-8 zh_CN.UTF-8
# 设置默认 Locale
update-locale LANG=en_US.UTF-8
# 安装中文字体(用于 matplotlib 等图表输出)
apt install -y fonts-noto-cjk

安装 Node.js 与数据科学栈

Ubuntu 26.04 的官方仓库已经包含 Node.js 24.x 和 Python 3.14,直接 apt 安装即可。如果需要最新版 Node.js,通过 NodeSource 仓库安装:
Bash
# 安装 apt 仓库自带的 Node.js
apt install -y nodejs npm
node --version
v24.10.0
# 安装 Python 数据科学栈
pip3 install numpy pandas matplotlib scikit-learn jupyter
# 验证 numpy 能正常 import
python3 -c "import numpy; print(numpy.__version__)"
2.3.1

编译 C++ 项目验证完整工具链

装完工具链后,用一个经典 C++ 程序验证 gcc、cmake、make 全链路是否正常工作。在容器内创建一个 CMake 项目并编译运行:
C++
// hello.cpp
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
    std::vector<int> nums = {5, 3, 8, 1, 9, 2};
    std::sort(nums.begin(), nums.end());
    for (int n : nums) std::cout << n << " ";
    std::cout << "\\n";
    return 0;
}
Bash
# 编译并运行
g++ -std=c++20 hello.cpp -o hello && ./hello
1 2 3 5 8 9
💡 小贴士
在 proot 容器内 apt install 不需要 sudo——因为 proot 模拟的 root 用户就是容器内的 root,已经拥有完整权限。但这个 root 只在容器内有效,对 Android 系统没有任何影响。

05 文件互通与多发行版管理

容器不是孤岛——你需要在 Termux 和容器之间互传文件,也可能同时运行 Ubuntu、Debian、Alpine 三个容器用于不同项目。v5.x 提供了 copy 和 sync 两个命令实现双向传输。

/sdcard 自动挂载

proot 进入容器时,会自动把 Termux 的共享存储(~/storage/shared)挂载到容器内的 /sdcard。这意味着你在容器里编译的程序输出可以直接写到 /sdcard,然后在手机的文件管理器里看到:
Bash
# 在容器内写入文件到 /sdcard
echo "Hello from Ubuntu container" > /sdcard/hello.txt
# 回到 Termux 看到了
exit
cat ~/storage/shared/hello.txt
Hello from Ubuntu container

copy 与 sync 命令

除了通过 /sdcard 中转,v5.x 还提供了 copy 命令直接在宿主和容器间拷贝文件,语法类似 docker cp:
Bash
# 从 Termux 复制文件到容器(:前是容器名,:后是容器内路径)
pd copy ~/project.tar.gz ubuntu:/root/
# 从容器复制文件到 Termux
pd copy ubuntu:/root/output.log ~/
# sync 命令同步整个目录(类似 rsync)
pd sync ~/projects/ ubuntu:/root/projects/
Syncing 42 files... done (3.2MB transferred)

多发行版并行管理

不同项目可能需要不同的 Linux 发行版——编译 Android 内核用 Ubuntu,跑轻量服务用 Alpine,测试 Debian 打包用 Debian。proot-distro 支持同时安装多个容器,互不干扰:
多发行版使用场景对比
发行版 优势 适用场景
Ubuntu 26.04 软件最全、社区最大 完整开发环境、数据科学、桌面体验
Debian 13 trixie 稳定轻量、纯自由软件 服务器模拟、deb 打包测试
Alpine 3.22 仅 12MB、musl libc 轻量服务、网络工具、快速测试
Arch Linux 滚动更新、AUR 海量包 尝鲜最新版软件、定制化需求
Bash
# 同时安装三个发行版
pd install ubuntu:26.04
pd install debian:trixie --name debian
pd install alpine:latest
# 按需进入不同容器
pd sh ubuntu   # 做完整开发
pd sh alpine # 跑轻量服务
# 容器之间文件共享通过 /sdcard 中转

06 Dockerfile 构建与高级用法

v5.x 最令人兴奋的新特性是 build 命令——在手机上直接从 Dockerfile 构建自定义 OCI 镜像,不需要 Docker 守护进程。这意味着你可以把项目依赖固化到镜像里,分发到任何设备上一键安装。

从 Dockerfile 构建自定义镜像

假设你想要一个预装 Python + 数据科学库的镜像,创建一个 Dockerfile:
Dockerfile
FROM
    ubuntu:26.04
RUN
    apt-get update && apt-get install -y \
    python3 python3-pip locales && \
    locale-gen en_US.UTF-8 && \
    rm -rf /var/lib/apt/lists/*
RUN
    pip3 install numpy pandas matplotlib jupyter
ENV
    LANG=en_US.UTF-8
CMD
    ["/bin/bash"]
构建并安装为容器:
Bash
# 构建镜像并直接安装为容器
proot-distro build -t mydev:1.0 --install-as mydev .
Step 1/4 : FROM ubuntu:26.04
Step 2/4 : RUN apt-get update && apt-get install -y ...
Step 3/4 : RUN pip3 install numpy pandas matplotlib jupyter
Step 4/4 : ENV LANG=en_US.UTF-8
Image 'mydev:1.0' built and installed as 'mydev'.
# 进入自定义容器
pd sh mydev

跨架构运行:在 ARM 手机上跑 x86_64 镜像

v5.x 支持 QEMU 用户模式模拟,在 ARM 手机上运行 x86_64 架构的镜像。这在你需要测试 x86 专用软件时非常有用。先安装 QEMU 模拟器,然后用 --architecture 参数指定架构:
Bash
# 安装 QEMU 用户模式模拟器(仅首次需要)
pkg install qemu-user-x86_64
# 安装 x86_64 架构的 Alpine 镜像
pd install alpine:latest --architecture x86_64 --name alpine-x86
# 进入(通过 QEMU 模拟)
pd sh alpine-x86
uname -m
x86_64
💡 小贴士
跨架构运行会带来显著性能下降——QEMU 需要将每条 x86_64 指令翻译为 ARM 指令执行,速度大约只有原生的 1/5 到 1/10。仅用于测试兼容性,不要在跨架构容器中做重度编译或运行性能敏感的任务。

推送镜像到 Docker Hub

构建好的镜像可以推送到 Docker Hub 或 GHCR,在其他设备上一键拉取使用。设置认证信息后用 push 命令:
Bash
# 设置 Docker Hub 认证
export PD_DOCKER_AUTH=myuser:mypassword
# 推送到你的 Docker Hub 仓库
pd push myuser/mydev:1.0
Pushing layer... done
# 在其他设备上直接安装
pd install myuser/mydev:1.0

07 性能优化与限制说明

proot 不是完美的——它用 ptrace 拦截系统调用的机制天生就有性能开销。了解这些限制,才能决定哪些任务适合在容器里跑,哪些应该留在 Termux 原生环境。

性能开销来源

proot 性能影响实测
操作类型 开销 原因
CPU 计算密集 ≈0%(几乎无影响) 计算不经过 ptrace,直接在 CPU 上跑
文件读写(小文件) 10%-20% 每次 open/read/write 都要路径翻译
大量小文件 IO 20%-30% ptrace 上下文切换累积开销
fork/exec 频繁 15%-25% 子进程也要被 ptrace 追踪

内存与存储限制

手机资源有限,需要合理规划:
Bash
# 查看容器磁盘占用
du -sh $PREFIX/var/lib/proot-distro/installed-rootfs/*
412M ubuntu
287M debian
12M alpine
# 清理镜像缓存(不删除已安装容器)
pd clear-cache
Deleted 3 cached layers (156MB freed)
# 查看手机可用内存
free -h
         total    used    free
Mem:         12Gi     4.2Gi    7.8Gi

已知限制清单

proot 容器做不到的事
• 不支持嵌套:不能在 proot 容器内再运行 proot-distro(ptrace 不支持嵌套)
• 不支持 systemd:proot 没有内核权限启动 init 系统,服务管理用 service 手动启动
• 不支持 Docker:Docker 需要内核模块和守护进程,proot 无法提供
• 不支持 mount:无法挂载文件系统(但 /sdcard 由 proot 自动映射)
• 不支持内核模块:无法加载内核驱动或修改内核参数
• 网络共享:容器使用宿主网络栈,无独立 IP,端口直接映射到手机
💡 小贴士
选择合适的工具:如果只是跑 Python 脚本或编译 C 程序,Termux 原生环境更快;如果需要完整的 apt 包管理、systemd 风格的服务管理、或者桌面环境(下一篇 Jupyter 和 VNC),proot 容器是唯一选择。两者不是替代关系,而是互补——Termux 做快速开发,proot 做完整 Linux 体验。

动手练习

🟢 基础验证
安装 proot-distro 并创建一个 Ubuntu 26.04 容器,进入后执行 apt update && apt install -y neofetch,截图 neofetch 输出确认你在完整的 Ubuntu 环境中。
预期:5 分钟内完成,neofetch 显示 Ubuntu 26.04 LTS + aarch64 架构信息。
🟡 组合应用
在 Ubuntu 容器中安装 Python3 和 pip,编写一个脚本:读取 /sdcard/ 下的一个 CSV 文件,用 pandas 统计行数和列数,将结果写入 /sdcard/result.txt。回到 Termux 后用 cat ~/storage/shared/result.txt 验证。
提示:需要组合 apt install、pip install、/sdcard 挂载、文件读写四个知识点。
🔴 开放挑战
编写一个 Dockerfile,基于 ubuntu:26.04 构建一个包含 GCC 15 + CMake 4 + Git 的 C++ 开发镜像。构建安装后,在容器内创建一个 CMake 项目(多文件 + CMakeLists.txt),编译运行并验证输出。尝试将构建好的镜像推送到 Docker Hub。
参考方向:Dockerfile 语法参照第六章示例,CMake 项目可以是一个简单的计算器程序。推送需要先注册 Docker Hub 账号。

知识回顾

proot 原理
ptrace 拦截
proot-distro v5.6.0
OCI 镜像拉取
Ubuntu 26.04 LTS
pd 短别名
容器 backup/restore
/sdcard 挂载
copy/sync 命令
Dockerfile 构建
QEMU 跨架构
镜像推送
性能开销
proot 限制
下篇预告
16 Jupyter Notebook 与数据科学环境 — 我们将在 proot Ubuntu 容器中搭建完整的 Jupyter 数据分析环境,用 pandas 读取 CSV、用 matplotlib 画图、用 scikit-learn 跑机器学习模型,让手机变成一台便携的数据科学工作站。
关注系列持续更新,点赞分享让更多人看到