很多人第一次打开 Termux,看到那个黑底绿字的提示符,第一反应是"这不就是个终端吗,能跑 Ubuntu 才怪"。我当初也是这么想的,直到有次出差没带笔记本,只带了一台旧手机,临时要在路上改一段 Python 脚本,才被逼着把 Termux 装 Ubuntu 这件事彻底搞明白。装完之后我发现,它确实不是虚拟机上那种完整的 Ubuntu,但用来跑编译器、Python、装包、写脚本、甚至跑一个轻量桌面,完全够用。问题在于,网上流传的很多教程要么是几年前的老脚本,要么直接跳过了最关键的一步——你手机到底支持哪种方案。这篇文章我就把 termux 安装 ubuntu 这件事从头到尾讲透,包括路线怎么选、每一步为什么这么走、以及那些教程里从来不写的报错现场。只要你的设备能装 Termux,看完就能自己跑起来,新手也不用怕。
1. 先别急着敲命令:Termux 里装 Ubuntu 到底有几种玩法
大部分人搜 "termux 安装 ubuntu",搜到的第一句命令往往是pkg install proot-distro,然后就跟着敲。但如果你不知道这背后发生了什么,一旦报错,你连往哪个方向查都不知道。所以先把路线说清楚,这一步花十分钟,能省你后面两小时。
1.1 proot-distro、手动 proot、chroot 的差别
Termux 本身运行在 Android 的普通应用沙盒里,没有 root 权限,也没有真正的内核隔离。所谓"在 Termux 里装 Ubuntu",本质上是把一个 Ubuntu 的根文件系统(rootfs)解压到 Termux 的私有目录里,然后通过一层"翻译"机制,让 Ubuntu 里的程序以为自己在正常的 Linux 环境里跑。这个翻译层有三种常见做法:
| 方案 | 是否需要 root | 原理 | 适合场景 |
|---|---|---|---|
| proot-distro | 不需要 | 用 PRoot 做系统调用路径重写 | 绝大多数人,首选 |
| 手动 proot | 不需要 | 自己下载 rootfs,手写 proot 启动命令 | proot-distro 装不上、老设备 |
| chroot | 需要 root | 直接切换根目录 | 已 root 的设备,追求性能 |
PRoot 的核心思路是"骗"。当 Ubuntu 里的程序发起系统调用时,PRoot 会在中间拦一道,把/usr、/etc这类绝对路径改写成 Termux 私有目录下的真实路径。所以你在里面敲ls /,看到的确实是 Ubuntu 的目录结构,但它在磁盘上的真实位置其实是/data/data/com.termux/files/usr/var/lib/proot-distro/installed-rootfs/ubuntu/。理解了这一点,后面很多"明明改了配置文件却不生效"的问题就都能解释了。
chroot 则是真刀真枪地换根目录,性能最好、兼容性最强,代价是你得先 root 手机。root 这件事本身有风险,而且现在很多机型根本不给解锁,所以我不建议为了跑 Ubuntu 去折腾 root。除非你本来就有 root 环境,否则老老实实走 proot。
提示:proot 方案下,某些依赖内核特性的软件是跑不起来的,比如真正的 Docker、部分需要内核模块的工具。遇到这类需求,手机上折腾的意义不大,别硬扛。
1.2 老安卓设备(比如 Android 5.1)会卡在哪一步
热词里出现了 "termux android5.1",说明确实有不少人手里是旧设备。这里有个必须先说清楚的现实:新版 Termux 对 Android 版本有要求,官方发布渠道上的最新构建通常要求 Android 7.0 及以上。Android 5.1、6.0 这类设备,你硬装最新版可能直接安装失败,或者装上之后pkg命令一跑就报错。
我的建议是,老设备去 Termux 的 GitHub Releases 页面找较早的版本,通常需要翻到比较靠前的 release 记录,挑一个标注支持低版本 Android 的构建。装好之后第一件事不是装 Ubuntu,而是先跑pkg update,看能不能正常拉取源。如果连源都连不上,说明这个 Termux 版本的仓库地址已经失效,换源也救不了,那就得考虑手动 proot 路线了。
手动 proot 路线不依赖 proot-distro 这个包管理器脚本,你只需要一个可用的 proot 二进制和一个 Ubuntu rootfs 压缩包。流程是:下载 rootfs tar.gz,解压到某个目录,然后用proot -S <目录> -b /dev -b /proc -b /sys ...这样的命令启动。这条路的缺点是所有绑定目录、环境变量都要你自己维护,登录脚本得自己写;优点是它几乎不挑 Termux 版本,只要 proot 能跑、架构对得上就行。
还有一个容易忽略的点:CPU 架构。绝大多数安卓手机是 aarch64(arm64),少数老设备是 armv7 或 armhf。你下载的 Ubuntu rootfs 必须和架构匹配,arm64 的 rootfs 扔到 armv7 设备上是跑不起来的,会直接报可执行文件格式错误。用uname -m先确认自己的架构,这一步别省。
2. 把 Termux 本体收拾干净:下载渠道、换源、存储权限
我见过太多人卡在第一步:Termux 本身就没配置好,就开始装 Ubuntu,结果所有报错都被误以为是 Ubuntu 的问题。先把地基打好。
2.1 Termux 安装包的来源选择
不同渠道的 Termux 差别很大。早期在应用商店能下到的版本,签名和更新机制和现在的官方构建不一样,插件生态也不兼容,经常出现"照教程敲命令,你的 Termux 里根本没有这个命令"的情况。所以我的习惯是统一从 F-Droid 或 GitHub Releases 获取,保持和主流教程一致的环境。
装的时候注意两点。第一,如果你之前装过其他来源的 Termux,先彻底卸载再装,因为不同签名的包不能互相覆盖,留着会出各种诡异问题。第二,Termux 有个生态,很多能力是通过独立插件提供的,比如 API 插件、Boot 插件、Styling 插件。核心的 Termux 应用本身够用,插件按需再加,不要一上来装一堆。
装完之后先跑三条命令确认基本可用:
termux-info pkg update pkg upgradetermux-info会打印出系统版本、Termux 版本、架构、已配置的源地址。这份信息在你后面求助或者自查时非常有用,建议截图保存一份。
2.2 termux-change-repo 换源与 pkg upgrade 的先后顺序
Termux 默认的软件源在国外,国内直连经常慢到超时。Termux 自带一个换源工具:
pkg install termux-tools termux-change-repo运行后会弹出一个文本界面,让你选择镜像。选国内的高校镜像或云厂商镜像都行,选完它会自动改写源配置。换完之后再跑pkg update && pkg upgrade,速度会有肉眼可见的提升。
顺序很重要:先换源,再 upgrade。如果你先 upgrade 又中途失败,可能会留下半更新的状态,后面再装别的包就容易报依赖冲突。真遇到这种半截状态,可以试pkg update --fix-missing或者干脆清掉缓存pkg clean再来一遍。
注意:换源工具改的是 Termux 自己的源,跟 Ubuntu 里面的 apt 源是两码事。后面进了 Ubuntu,你还要再换一次 apt 源,别搞混。
2.3 termux-setup-storage 到底做了什么
这条命令很多人随手就敲了,但不知道它做了什么,导致后面找不到文件:
termux-setup-storage执行时系统会弹出一个存储权限请求,允许之后,Termux 会在你的家目录下创建一个storage目录,里面是一组软链接:
~/storage/shared指向手机的内部存储根目录~/storage/downloads指向下载目录~/storage/dcim、~/storage/pictures等按类型分别指向对应目录
这些软链接本质上是"热线电话",不是真实文件。你在~/storage/downloads里放文件,和直接在手机的文件管理器里放文件,是同一份数据。理解了这一点,就能想明白为什么不能在 Termux 里对~/storage做某些操作——比如你不能把整个 rootfs 放在这里还指望它权限正常,因为 Android 的外部存储挂载参数(noexec 之类)经常会限制可执行权限。
所以我的做法是:下载的安装包、脚本、素材放~/storage/downloads方便用手机浏览器下载;而 Ubuntu 的 rootfs、编译产物这类需要执行权限的东西,放在 Termux 私有目录里,也就是默认的家目录下。这个区分能帮你避开一大批"权限被拒绝"的报错。
3. proot-distro 装 Ubuntu 的完整流程与每一步的目的
地基打好了,现在进入正题。这一节我会把每一步的命令和它背后的作用都讲清楚,你照着做,同时知道自己在做什么。
3.1 安装 proot-distro 并确认可用发行版
pkg install proot-distro proot-distro list第一行装上工具,第二行列出当前版本支持的发行版清单。这个清单会随 proot-distro 版本变化,比较新的版本里通常会看到ubuntu、ubuntu-22.04、ubuntu-24.04、debian、alpine、archlinux等条目,具体以你看到的为准。
这里有个细节值得说:ubuntu这个别名一般指向该工具定义的默认 LTS 版本。如果你有明确的版本需求,直接指定带版本号的名称更稳妥,避免哪天默认别名悄悄换了版本,你的环境对不上号。做嵌入式开发、需要特定工具链版本的场景,我一般直接指定ubuntu-22.04这类明确版本。
另外注意磁盘空间。一个 Ubuntu rootfs 解压后通常要占几百 MB 到 1GB 以上,加上后续装的软件,建议至少留 4GB 以上空间。用df -h看一下家目录所在分区的剩余空间,不够就先清理,别装到一半卡死。
3.2 安装、首次登录与登录参数
proot-distro install ubuntu proot-distro login ubuntu第一行会下载并解压 rootfs,这个过程取决于网络,慢的话几分钟到十几分钟很正常。中途不要切后台太狠,Android 有可能把你的 Termux 进程杀掉,导致解压不完整。建议在装之前先执行termux-wake-lock,让系统别休眠这个进程。
登录命令里还有几个常用参数,值得记一下:
# 以指定用户登录(需要该用户已存在) proot-distro login ubuntu --user myuser # 共享 /tmp,方便和 Termux 主环境交换临时文件 proot-distro login ubuntu --shared-tmp # 绑定手机存储目录,让 Ubuntu 里也能读到 /sdcard proot-distro login ubuntu --bind /sdcard:/mnt/phone--bind这个参数非常好用。默认情况下,Ubuntu 环境里是看不到手机存储的,你在 Termux 主环境下能访问的~/storage,进去之后路径也变了。绑定之后,Ubuntu 里就有了一个明确的挂载点去读写手机文件,比到处找路径省心得多。
还有一点:登录进去之后,你执行exit就能回到 Termux 主环境,两边是独立的。主环境里装的工具,Ubuntu 里不一定有;反过来也一样。这是新手最容易困惑的地方,比如在 Termux 里装了 git,进去 Ubuntu 敲 git 说找不到命令,这不是 bug,是正常的。
3.3 进去之后第一件事:换 apt 源、建用户、配 sudo
第一次进 Ubuntu,建议按这个顺序收拾:
apt update apt upgrade -y apt install -y sudo vim wget curl gitapt update如果特别慢或者报错,先换源。可以手动编辑/etc/apt/sources.list,把里面的地址替换成速度快一点的镜像;或者用一些带图形界面的换源工具,但在纯终端环境下手动改最直接。改之前记得备份原文件,出问题好还原。
接下来建一个普通用户。为什么不一直用 root?因为在 root 下跑pip、跑编译、跑各种脚本,很容易把文件属主和权限搞乱,而且很多工具会拒绝以 root 身份运行。做法是:
useradd -m -s /bin/bash dev passwd dev usermod -aG sudo dev然后退出重新以这个用户登录。这里有个 proot 方案的经典坑:sudo在 proot 下由于没有 setuid 位,默认可能不工作,或者表现很奇怪。常见的处理办法是给 sudo 的可执行文件补上权限,或者在需要提权时用 root 登录做一次性操作。我的经验是,日常用户跑业务代码,需要装系统包的时候退出到 root 用户装完再切回来,比反复调 sudo 省事。
顺便把语言环境和时区配一下,否则后面装某些软件会出现一堆 locale 警告:
apt install -y locales tzdata dpkg-reconfigure tzdata时区选对之后,日志时间、脚本里的时间戳就正常了,做定时任务的时候不会莫名其妙差几个小时。
4. 报错现场还原:几类高频故障的排查链路
上面是顺利路径。但真实世界里,大部分人是在这一节里挣扎的。我把几个最常遇到的报错按"现象—原因—验证—处理"的顺序还原一遍,你可以照着链路自己排查。
4.1 su: no su program found on this device 的真实含义
这个报错的完整形态通常长这样:
~ $ su -m No su program found on this device. termux does not su很多人看到这个,第一反应是"是不是我 Termux 装坏了",其实完全不是。这句话是在告诉你:这台设备上没有可用的su,也就是没有 root 权限,Termux 自身不会提供su。
这个报错一般出现在你想用su切 root 的时候。而在 proot 方案下,你根本不需要su——Ubuntu 环境里的 root 是通过 proot 模拟出来的,跟设备是否 root 无关。所以正确的处理方式是:不要在主环境敲su,而是用proot-distro login ubuntu进环境,需要 root 就直接是 root 身份,需要普通用户就加--user。
有些教程会教你装一个 "tsu" 之类的工具来套 root,那前提是你的设备真的已经 root 了。没 root 的设备装上去也一样报错。判断自己有没有 root,最直接的方法就是看有没有授权管理应用,或者跑一次需要 root 的命令看会不会弹授权框。
提示:如果你确实已经 root,还想在主环境里做需要 root 的操作,可以装对应工具;但如果你只是想跑 Ubuntu,这条命令跟你没关系,直接忽略。
4.2 apt update 卡住、404、域名解析失败
进 Ubuntu 之后,apt update报错基本逃不出三类。
第一类是网络到镜像站不通,表现是一直卡在Connecting to ...或者超时。处理办法是换源,换成国内可达的镜像地址,改完再apt update。
第二类是新旧版本不匹配导致的 404。比如你装的是老版本的 Ubuntu rootfs,源里对应的发行版代号已经归档,地址就失效了。验证方法很简单,看看/etc/apt/sources.list里的发行版代号,再去看镜像站上还有没有这个代号。没了就得把地址换成归档地址,或者干脆重新装一个较新的版本。这是老 rootfs 最容易踩的坑,尤其是从各种教程里找来的压缩包,版本可能是好几年前的。
第三类是域名解析失败,报Temporary failure in name resolution。这类报错说明网络层没通,而不是源的问题。可以检查/etc/resolv.conf,看看里面有没有可用的解析服务器地址。proot 环境下这个文件有时是被动态生成或覆盖的,你可以加一行固定地址试试,比如公共解析服务。注意,如果问题是 Termux 主环境本身网络不通,那要先回到主环境排查,因为 Ubuntu 的网络是搭在 Termux 之上的。
排查顺序建议固定:先ping一个域名看解析,再ping一个 IP 看连通,再看源的地址和代号对不对。三步走完,问题基本定位了,别一上来就乱改配置。
4.3 重启 Termux 后"环境没了"与路径错乱
有朋友跟我说,装好 Ubuntu、装完一堆软件,第二天打开 Termux 全没了。这种情况九成不是真的没了,而是你打开的方式变了。
常见的几个原因:一是换了一个 Termux 应用(比如从别的渠道又装了一个),它们的家目录不共享,自然看不到之前的 rootfs;二是登录命令敲错了,proot-distro login ubuntu里的名字和你实际安装的名字不一致,它会给你一个空的或者报错;三是卸载重装过 Termux,应用数据被清掉,那确实就没了。
还有一个隐蔽的问题是路径错乱。你在 Ubuntu 里写脚本时,如果用了硬编码的绝对路径,换设备或者换安装方式后路径就对不上了。我的一般做法是尽量用相对路径,或者用环境变量,别写死/data/data/com.termux/...这种地址。
至于"重启后进不去",有的是因为 Android 把 Termux 的后台进程限制了,重新打开应用等待几秒初始化完成再登录就好;有的是因为上一次没有正常退出,残留了锁文件。遇到卡住,先exit干净退出,再重新登录,多数能解决。
5. 让 Ubuntu 真的能干活:工具链、中文环境与桌面
装是装上了,但"能跑起来"和"能干活"是两回事。这一节讲怎么把它变成一个真正顺手的开发环境。
5.1 Python 与科学计算库的安装姿势
先在 Ubuntu 里装基础 Python:
apt install -y python3 python3-pip python3-venv然后强烈建议用虚拟环境管理项目依赖,不要在系统 Python 里直接pip install一大堆包,否则系统包管理和 pip 会打架。做法是每个项目建一个 venv,需要什么装什么。
装 numpy 这类科学计算库时,手机端最容易遇到两个问题:一是编译慢,二是内存不够直接被杀掉。处理思路有两条。第一,优先用 apt 提供的预编译包,比如apt install python3-numpy,省去编译;第二,pip 装的时候指定国内的包索引镜像,速度快很多。如果某个库确实要现场编译,先把 Termux 主环境的资源占用降下来,关掉不用的后台应用,必要时分批安装。
热词里出现了 "termux 安装 python 所有的库" 这类搜索,我得泼一点冷水:没有"所有库都装一遍"这种玩法,装了也用不上,还占空间。正确做法是按项目需求装,用pip freeze记录依赖,换环境时一次性还原。
5.2 编译工具链与版本管理
需要编译 C/C++ 项目的话,装基础工具链:
apt install -y build-essential cmake git pkg-configbuild-essential会把 gcc、g++、make 这些一并带上。cmake 和 pkg-config 是绝大多数现代 C/C++ 项目的标配,提前装好省得中途报错。git 不用多说,拉代码必备。
这里有个经验:编译大型项目时,手机的内存和散热是硬瓶颈。我试过在 4GB 内存的机器上编译中等规模的项目,编译到一半 OOM 被系统杀掉是常事。解决办法是限制并行编译的核数,比如用make -j2而不是-j$(nproc),宁可慢也不要崩。同时插上充电器,把手机放在通风的地方,长时间高负载编译发热会很夸张。
版本管理方面,如果项目需要特定版本的编译器或运行时,可以在 Ubuntu 里再套一层版本管理工具,或者用容器化的思路把环境隔离。不过在手机这种资源受限的环境里,我建议尽量保持简单,别叠太多层,不然性能和复杂度都吃不消。
5.3 VNC + XFCE4 桌面:黑屏的几种成因与处理
想在手机上看到图形桌面,主流做法是装一个轻量桌面环境,再通过 VNC 连上去。以 XFCE4 为例:
apt install -y xfce4 xfce4-goodies tigervnc-standalone-server dbus-x11装完之后配置 VNC 的启动脚本。用户目录下会有~/.vnc/xstartup,内容大致需要这样:
#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec startxfce4注意给脚本加执行权限,并设置 VNC 密码:
chmod +x ~/.vnc/xstartup vncpasswd vncserver -localhost no -geometry 1024x768 -depth 24 :1然后在手机上装一个 VNC 客户端,连127.0.0.1:5901就能看到桌面。-depth 24配合1024x768是个比较稳的起点,低配机器可以把分辨率和色深再降一点。
"XFCE4 黑屏" 是热词里的高频问题,我踩过几次,成因基本是这几类:
| 现象 | 常见原因 | 处理方向 |
|---|---|---|
| 连上后全黑,只有光标 | xstartup 没有执行权限或内容不对 | 检查权限,确认最后一行是 exec 启动桌面 |
| 黑屏几十秒后断开 | 缺少 dbus 或运行目录未设置 | 安装 dbus-x11,设置运行目录环境变量 |
| 桌面出来但没有窗口管理器 | 启动脚本没有 exec,进程被回收 | 确保用 exec 启动,避免脚本提前退出 |
| 连不上,端口拒绝 | VNC 服务没起来或端口不对 | 查看服务输出日志,确认监听端口 |
还有一个容易被忽略的坑:/tmp目录的权限。某些程序要求/tmp具备特定的权限位,权限不对就会出现各种莫名其妙的问题。可以在启动前检查一下/tmp的状态。另外,如果你是在 proot 环境下跑桌面,图形性能肯定比不上真机,拖动窗口有卡顿是正常的,别以为装错了。
5.4 中文显示与输入法
桌面出来了,发现中文全是方块,这是因为系统里没有中文字体。装一套中文字体就能解决:
apt install -y fonts-wqy-zenhei fonts-wqy-microhei装完之后如果有字体缓存机制,刷新一下缓存,重启桌面即可。
如果需要中文输入法,在 XFCE4 下可以装 fcitx 再加拼音输入法模块,装完配置好环境变量,重启会话生效。手机端的输入体验和电脑差别很大,VNC 客户端自己的软键盘和系统的输入法会互相干扰,我的建议是只在必要时用图形界面,日常写代码老老实实用终端加 SSH,效率高得多。
6. 备份、迁移与清理:把折腾成果保住
折腾一次不容易,尤其是你在里面装了半天的环境和依赖。这一节讲怎么把成果保住,以及什么时候该换方案。
6.1 proot-distro 的 backup/restore
proot-distro 自带备份恢复能力,这是它比手动 proot 省心的地方之一:
proot-distro backup --output ubuntu-backup.tar.gz ubuntu proot-distro restore ubuntu-backup.tar.gz备份出来的是一个压缩包,可以拷到电脑或者网盘存着。换手机、重装系统、环境被搞坏,都能靠它快速恢复。我的习惯是每完成一个重要阶段就备份一次,比如刚装完基础环境、刚配好工具链,各存一份,出问题时可以退回到最近的可用状态。
需要提醒的是,备份包不小,几百 MB 到几个 GB 都有可能。拷到手机存储时注意空间,也注意别再放回 Termux 私有目录,不然可能出现"备份文件把空间占满,导致恢复失败"的尴尬场面。
6.2 手机存储互通与文件搬运
前面提过--bind和~/storage。实际用起来,我的分工是这样的:代码和项目放在 Ubuntu 环境里,用 Git 管理,随时能同步到远程仓库;大文件、素材、下载的安装包放手机存储,通过绑定目录互访。
如果你要传大文件到手机,用手机浏览器下载到下载目录,再在 Termux 里从~/storage/downloads拷进私有目录,比在终端里用命令下载更稳,尤其是网络不稳定的场景。反过来,要把 Ubuntu 里生成的文件拿出来,先拷到绑定目录,再用文件管理器操作。
还有个实用技巧是配 SSH。在 Ubuntu 里装好 SSH 服务并在非特权端口上监听,然后从同一局域网里的电脑连过去,手机上只负责跑环境,键盘鼠标用电脑的,体验会好非常多。这个思路在热词里也有体现,说明是很多人的共同选择。
6.3 该换方案的时候不要硬扛
最后说说什么时候该放弃。Termux 装 Ubuntu 有它的适用边界:
- 需要内核级特性、需要真正的容器或虚拟化,proot 方案满足不了
- 项目对性能要求高,长时间编译、跑大型构建,手机的散热和内存撑不住
- 需要长期稳定运行的服务器类任务,手机的后台进程管理会时不时打断你
这些情况下,老老实实用电脑或者一台便宜的云主机,效率差距不是一点半点。手机端环境的定位是"移动、应急、轻量验证",认清楚这一点,你就不会为了让它跑一个不适合它的任务而折腾一整晚。
反过来,如果你只是想随时随地写脚本、跑点 Python、验证一个小想法、临时拉个仓库改两行,这套方案完全值得投入时间去配置。我自己的经验是,把常用工具链和一份备份包准备好之后,换设备迁移也就十分钟的事。
最后分享一个小习惯:把安装过程、用到的命令、踩过的坑,在 Ubuntu 环境里记一个纯文本笔记,跟着备份包一起存。等下次换设备,你不用再重新搜一遍教程,打开笔记照着敲就行。这个笔记的价值,比我当年任何一次通宵排查都高。