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 个包。

一个文件 + 换一个命令,省掉的是整整一个下午。

← 返回文章列表