Termux 的包管理器为什么一装上就卡住
新装的 Termux 里敲下第一条 pkg update,屏幕上出现这么一行:
No mirror or mirror group selected.
Testing the available mirrors:
然后它开始一个一个地测:
[*] (10) https://packages-cf.termux.dev/...: ok
[*] (1) https://mirror.nguyenhoang.cloud/...: bad
[*] (1) https://mirrors.saswata.cc/...: bad
它在干什么
Termux 的包托管在全世界几十个镜像上,没有官方 CDN。因为它不知道你在哪, 第一次运行时会给每个镜像发一个 HEAD 请求,测延迟,挑最快的一个。
问题在于:每个请求的超时是 6 秒,而镜像列表有近百个。信号不好的时候, 光是测速就能耗掉十分钟,之后还会跑失败的那些再等一轮。
更糟的是它挑中的「最快」,是延迟最低,不是带宽最大。 我那次就选中了印尼的一个节点——延迟 80 ms 看着很美,实际下载速度 500 字节每秒,37 MB 的更新包下了两个小时。
解法:别再让它选
直接在配置文件里写死镜像源,跳过整个测速流程。清华 TUNA 在国内基本是稳的:
printf 'deb https://mirrors.tuna.tsinghua.edu.cn/termux/apt/termux-main stable main\n' \
> $PREFIX/etc/apt/sources.list
然后把 pkg 换成 apt:
apt update
apt full-upgrade -y
apt install -y openssh git python3
为什么必须换掉 pkg
这才是关键。镜像测速的逻辑写在 pkg 这个包装脚本里,不在 apt 里。
我一开始只改了源地址,结果发现每次调用 pkg 都会重新测速一遍——
因为 pkg 判断「没选过镜像」的依据不是 sources.list 里有没有写地址,
而是它自己的一套标记。改文件骗不过它。
而 apt 是原生的 Debian 包管理器,它只管读 sources.list 去下载,
不做任何测速。所以绕过 pkg,问题直接消失。
另一个坑:配置冲突
升级过程中会停在这里:
Configuration file '/data/data/com.termux/files/usr/etc/bash.bashrc'
==> Modified (by you or by a script) since installation.
*** bash.bashrc (Y/I/N/O/D/Z) [default=N] ?
这是 dpkg 在问「配置文件改过了,新版本要不要覆盖」。直接回车选默认(保留现有),
通常就够了。如果是在脚本里跑,加上 -o Dpkg::Options::="--force-confold"
可以彻底跳过询问。
效果
同样一台手机,同样一条校园网:改之前两小时没下完,改之后三分钟跑完全部 65 个包。
一个文件 + 换一个命令,省掉的是整整一个下午。