手头全都是 Ubuntu/Debian 系服务器的人,大概率都骂过 apt 的下载速度。明明带宽很有余量,可 apt 就是一条连接往下拉,遇到依赖多的包,等几十分钟都是常有的事。后来我换上了 apt-fast,用多线程并发下载替代 apt 默认的单流下载,整个安装过程的耗时肉眼可见地降了下来。今天这篇就把安装、配置、踩坑的全过程聊透,给同样被 apt 下载速度折磨的人一个能直接照抄的方案。
apt-fast 本质上是一个封装脚本,它把 apt 的下载环节替换成 aria2 或 axel 这样的多线程下载器,下载完成后再交给 dpkg 完成安装。也就是说,你依然在用 apt 的依赖解析和事务机制,但下载阶段从单连接变成多线程并发,这在大多数网络环境下都有立竿见影的效果。适合各类使用 Ubuntu/Debian 的开发者、运维和桌面用户,尤其是那些经常需要安装大型软件或依赖超多的开发环境的人。
1. apt-fast 到底做了什么
1.1 为什么 apt 默认下载这么慢
apt 用的底层库是 libapt-pkg,它默认的下载方式基本是单连接。单连接意味着不管你的服务器带宽是 100Mbps 还是 1000Mbps,下载速度的上限都被限制在一个 TCP 流的窗口和延迟乘积里。如果源站和你的机器之间网络延迟大、丢包率高,那速度就更惨。
打个比方,这就像快递公司明明车队里有很多车,可它偏要一辆车来回跑很多趟,而不是一次派出多辆车并行运输。单连接下载就是那个来回跑的车队。一旦一个 deb 包几十 MB、上百 MB,而且依赖链上有几十个这样的包,总等待时间就很可观了。apt-fast 的思路很简单:把这一辆车换成多辆车,也就是用多个连接同时去下载不同的包,甚至同一个包的不同分片。
1.2 apt-fast 的加速原理与项目结构
apt-fast 本身是一个 shell 脚本,它不是魔法,也没有改动 apt 的内核,而是做了一层工作流替换。它先调用 apt-get update --print-uris 拿到需要下载的软件包的 URL 列表,然后用 aria2c 或 axel 这个多线程下载器把这些 deb 包并行拉下来,下载完成后脚本再调用 dpkg 做真正的安装。
项目结构也很轻量,核心就是几样东西:apt-fast 主脚本、apt-fast.conf 配置文件、Makefile 以及 man 文档。主脚本负责处理与 apt 的交互,配置文件里放的是镜像源列表和并发参数。因为它本质是脚本,所以安装、修改、排查都非常直观,也没有复杂的编译过程。
这里有个关键点需要注意:apt-fast 只加速“下载 deb 包”这个阶段,不参与依赖解析,也不改变 dpkg 的安装事务。依赖解析还是走 apt 原来的逻辑,安装时 dpkg 该怎么做还怎么做。所以你不用担心用了 apt-fast 会导致依赖关系错乱,它只是把下载阶段的手段换了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装前的准备
2.1 检查系统版本与依赖
apt-fast 兼容性很好,主流的 Ubuntu 16.04、18.04、20.04、22.04、24.04 以及 Debian 8 及以上版本都能用。安装前先确认下自己的系统版本,避免后续操作时源地址和版本代号对不上。
bash复制cat /etc/os-release
还要确认有没有装 aria2,因为 apt-fast 默认的下载器就是它:
bash复制command -v aria2c
如果命令没有输出,说明没装,那就先补上。这个包很小,也就几百 KB,直接默认源安装完全没压力:
bash复制sudo apt update
sudo apt install -y aria2
另外建议顺手装上 software-properties-common,后面从 PPA 安装时要用到 add-apt-repository 命令。这个包有些精简版系统里没有。
bash复制sudo apt install -y software-properties-common git make
2.2 更新软件源与基础工具
不管用哪种方式安装,先把软件源刷新一遍总是没错的:
bash复制sudo apt update
这一步能保证后续安装时拿到的包列表是最新的。如果你当前的源下载速度已经很慢,建议先花几分钟把 /etc/apt/sources.list 里的源换成一个你访问速度快的镜像源,否则后面 apt-fast install 时下载脚本本身也能跑,但 MIRRORS 配置不够好,加速效果会打折扣。这个问题后面配置章节会详细说。
3. 两种安装方式实操
3.1 方式一:通过 PPA 一键安装
apt-fast 官方提供了一个 PPA,这是最省事的安装方式,装完以后也方便统一升级。命令序列如下:
bash复制sudo add-apt-repository ppa:apt-fast/ppa
sudo apt update
sudo apt install apt-fast
执行 add-apt-repository 的时候,如果系统提示没有这个命令,说明你少了 software-properties-common,装一下即可。安装过程会弹出两个交互式配置界面:一个让你选择使用的下载器(aria2 或 axel),另一个让你填写镜像源列表。第一次安装时可以先用默认值,后面随时可以改配置文件。
PPA 方式有一点要提前有心理准备:部分网络环境下访问 PPA 源不稳定,add-apt-repository 或者 apt update 时可能出问题。如果遇到超时,多试几次,或者直接切到源码安装方式,不必在一个方案上死磕。
3.2 方式二:从 GitHub 源码构建
对于离线环境、访问不了 PPA、或者想装最新开发版的场景,源码安装是更可靠的选择。apt-fast 的项目地址在 GitHub 上的 ilikenwf/apt-fast,作者维护还是很积极的。
bash复制git clone https://github.com/ilikenwf/apt-fast.git
cd apt-fast
sudo make install
make install 会把 apt-fast 主脚本复制到 /usr/local/bin,把 apt-fast.conf 复制到 /etc,同时安装 man 文档。如果你不放心中间步骤,也可以手动确认一下:
bash复制ls -l /usr/local/bin/apt-fast
ls -l /etc/apt-fast.conf
有些发行版还会把 bash 补全脚本放在 debian/ 目录下,需要的话可以手动复制到 /etc/bash_completion.d/。
如果 GitHub 都访问不了,那还有最后一条路:从你能访问的另一台同构机器上把仓库打包拷过来,或者从发布页下载 .deb 包,用 sudo dpkg -i apt-fast_xxx_all.deb 安装。手动装可能会提示缺少依赖,比如 aria2,用 sudo apt install -f 修复即可。
3.3 安装后的基础校验
装完先跑一下版本信息,确认脚本能正常执行:
bash复制apt-fast --version
正常情况下会输出 apt-fast 的版本号。然后检查配置文件是否存在且权限正确:
bash复制cat /etc/apt-fast.conf
/etc/apt-fast.conf 必须是 root 可读的,普通用户无权限很正常,不用慌,执行 apt-fast 命令时加 sudo 即可。
4. 配置 /etc/apt-fast.conf
4.1 理解 MIRRORS 镜像源数组
/etc/apt-fast.conf 里最重要的配置就是 MIRRORS,它决定了下载时从哪些镜像地址拉包。默认配置长这样:
bash复制MIRRORS=( 'http://archive.ubuntu.com/ubuntu;http://mirrors.aliyun.com/ubuntu' )
注意分号 ; 分隔多个地址。apt-fast 拉包时会在这些镜像之间做负载均衡,而不是只死磕一个源。这样既能提速,也能降低单个源的压力。
这个配置需要和你的 /etc/apt/sources.list 保持一致。比如你的 sources.list 里用的是国内镜像源,那 MIRRORS 的第一项就写你 sources.list 里的那个镜像地址。如果 sources.list 里还是官方源,MIRRORS 里只写国内镜像也不行,因为 apt-fast 要根据 apt 已经更新过的包列表去下载,仓库不同版本容易出问题。
有一个细节要提醒一下:apt-fast 匹配 MIRRORS 时只处理二进制 deb 包的 URL,不会拿 deb-src 条目去做匹配。如果遇到 “Unable to find expected entry” 或者下载 404 的情况,优先检查 sources.list 和 MIRRORS 是不是同一套仓库。
4.2 下载器选择与并发参数
配置文件里有一个 DOWNLOADER 参数,默认是 aria2,也可以改成 axel。我强烈建议用 aria2。aria2 维护活跃、支持断点续传、控制连接数的参数更细,而 axel 虽然更轻量,但近年更新不积极,某些新系统上已经出现编译兼容问题。
并发相关的参数是排查性能问题的核心,配置如下:
bash复制DOWNLOADER="aria2"
_STRIP_AUTH=1
_MAXNUM=16
_MAXCONPERSERVER=8
_FAILCOUNT=3
_MAXNUM 是最大并发下载任务数,_MAXCONPERSERVER 是每个服务器允许的最大连接数,_FAILCOUNT 是单个任务失败后的重试次数。初学者最容易犯的错就是把 _MAXCONPERSERVER 调到 16 甚至更高,结果被源站限流,甚至直接把你的 IP 封掉。实测下来,普通宽带和国内 VPS 环境下,_MAXNUM=16、_MAXCONPERSERVER=4 是比较均衡的方案。内存紧张的小机器,并发数进一步降到 4~6,避免 OOM。
另外还有几个选项可以留意:_USER_AGENT 用来设置下载工具的 UA,有些 CDN 会拦截非浏览器 UA,这时可以设成浏览器的 UA 字符串;_DRY_RUN 可以让脚本只打印要执行的命令而不真正执行,调试时很有用。
4.3 代理、缓存与安全选项
如果你的服务器需要走内网代理或企业代理,apt-fast 继承的是 apt 自身的代理配置,也就是 /etc/apt/apt.conf.d/ 下的 Acquire::http::Proxy。所以配置好了 apt 的代理,apt-fast 一般也能自动用上。假如下载工具能正常连源但无法下载,先排查这个代理设置是不是正确的。
apt-fast 默认把 deb 包缓存在 /var/cache/apt/archives,和 apt 的缓存目录一致。如果你希望换一个大分区存放,可以修改 CACHE_PATH 或者把整个缓存目录做软链接。这里建议不要随意改动目录权限,否则 dpkg 可能会因为没有读权限安装失败。
还有一点和安装安全有关:apt-fast 默认不会检查下载回来的包的完整性,它把校验工作交给了 dpkg。如果你对安全性要求高,担心包被篡改,就不要绕过 apt 的校验机制,或者至少在 apt-fast 下载完成后手动检查 Release 文件里的哈希值。实际上 apt 在更新软件源时会维护 Release 文件的哈希,apt-fast 用了 --print-uris 机制,校验环节仍在 apt/dpkg 事务内,但保险起见我仍然建议只在可信镜像源环境下使用 apt-fast。
5. 使用 apt-fast 加速
5.1 常用命令对照表
apt-fast 的用法和 apt 几乎一一对应,下面是常用命令对照:
| 操作 | apt 命令 | apt-fast 命令 |
|---|---|---|
| 更新包列表 | sudo apt update |
sudo apt-fast update |
| 安装软件包 | sudo apt install <package> |
sudo apt-fast install <package> |
| 升级系统 | sudo apt upgrade |
sudo apt-fast upgrade |
| 发行版升级 | sudo apt dist-upgrade |
sudo apt-fast dist-upgrade |
| 自动移除 | sudo apt autoremove |
sudo apt-fast autoremove |
| 清理缓存 | sudo apt clean |
sudo apt-fast clean |
有一点需要明确:apt-fast remove 这个操作并没有加速的意义,因为它不涉及下载,直接用 apt remove 或 apt-get remove 就好。apt-fast 的价值集中在所有需要下载 deb 包的操作上。
5.2 验证加速效果的方法
装完以后怎么确认真的变快了?最简单的方式就是实际拉一个大包,感受一下时间差。
先看包下载大小:
bash复制apt-get install --print-uris <package> | grep deb
然后分别用 time 统计 apt 和 apt-fast 的安装耗时:
bash复制time sudo apt install <package>
time sudo apt-fast install <package>
比如我之前装一个开发工具链,默认 apt 下大概等了 20 多分钟,换成 apt-fast 后只用了不到 6 分钟。之所以有这种差距,是因为 apt-fast 把几十个依赖包同时拉下来,而不是一个一个排队。
运行 apt-fast 时,终端会打印 aria2 的连接进度,你能看到多个分块同时在跑,像 [#1 12MiB/40MiB] [#2 18MiB/40MiB] 这样。如果看到这种情况,说明多线程起了作用。
5.3 与 apt 混用时的注意事项
apt-fast 不是 apt 的完全替代品,使用时务必要有这个概念。它只接管下载阶段,安装阶段的脚本、postinst、触发器仍然由 dpkg 管理。因此别指望它改变 apt 的依赖解析、冲突处理机制。
还有两个现实问题。第一,不要同时跑两个 apt 或 apt-fast 的安装命令,否则 dpkg 的锁会互相等待,甚至出现 “Could not get lock /var/lib/dpkg/lock-frontend” 的报错。第二,如果 apt-fast 下载到一半被 Ctrl+C 中断,下次重新运行一般会自动续传,因为 aria2 支持断点续传。但如果你发现缓存里的 deb 文件已经损坏,最好先 sudo apt-fast clean 清理缓存,再重新安装。
6. 常见问题与避坑
6.1 命令找不到或权限错误
- 现象:运行
apt-fast提示command not found。 - 思路:先看安装是否成功,再看 PATH 是否包含
/usr/local/bin。 - 解决:
bash复制ls -l /usr/local/bin/apt-fast
echo $PATH
如果文件存在但 PATH 不包含 /usr/local/bin,可以运行 export PATH=$PATH:/usr/local/bin,并写入 ~/.bashrc。更省心的方式是直接用全路径 /usr/local/bin/apt-fast。
还有一类问题是执行时提示配置文件权限错误。/etc/apt-fast.conf 里包含镜像信息,对普通用户默认可能是 644 权限,但某些特殊需求下人们会把它改成 600,导致普通用户无法读取。直接用 root 执行 apt-fast 可以绕过,但更好的做法是把权限改回 644:
bash复制sudo chmod 644 /etc/apt-fast.conf
6.2 aria2 下载失败或被服务器拒绝
这是一个高频问题,表现形式很多:有时是下载中途报 GnuTLS: The TLS connection was non-properly terminated,有时是源站直接返回 403 或 429。原因基本都是并发数太高,或者 UA 被服务器识别成异常客户端。
解决思路分三步:
- 调低
_MAXCONPERSERVER,比如从 8 降到 4; - 设置一个正常的
_USER_AGENT,例如 Chrome 的 UA 字符串; - 确认 MIRRORS 里的源有没有要求特定 UA 或 Referer。
如果你用的是老旧的 axel,遇到源站连接被重置的概率会比 aria2 高。这种情况直接换成 aria2 就好,不必纠结。
6.3 下载卡住、锁冲突与断点续传
- 卡住:最常见的原因是镜像源不可达,或者代理配置有问题。排查时先检查源通不通:
curl -I一下配置文件里写的镜像地址。然后是代理,如果你设置了Acquire::http::Proxy,确认代理服务本身可用。 - 锁冲突:报错信息里如果出现
/var/lib/dpkg/lock-frontend,说明系统里可能还有 apt 进程在跑。用ps aux | grep -E 'apt|dpkg'查看,确认没有进程后再决定是否删除锁文件。一定不要一上来就rm -rf /var/lib/dpkg/lock-frontend,如果别的进程正在写库,强行删锁会造成事务错乱。 - 断点续传:aria2 默认会在
/var/cache/apt/archives留下.aria2控制文件,所以中断后的重新下载通常能接上。如果遇到奇怪的状态,执行sudo apt-fast clean清掉缓存,避免旧的坏文件干扰安装。
6.4 关于性能边界和实用建议
apt-fast 不是万能的。如果你的网络本身就只有 1Mbps 带宽,无论开多少个连接,总带宽上限不变,提升空间有限。如果你的源服务器距离非常远、延迟极高,多线程的效果也不如把源切换到离你更近的镜像。所以我的建议是先把源换好,再上 apt-fast,二者是相辅相成的关系。
容器构建场景我反而不太推荐用 apt-fast。Docker 构建时通常会走分层缓存,而 apt-fast 的并发下载模式有时候会把构建源站的连接数拉爆,反而引入不稳定性。常规的服务器管理和个人桌面环境,它才是真正的加速利器。
回到最开始的话题:为什么 apt 下载慢的问题让人如此烦躁?因为安装软件本应是个自动化的过程,却往往卡在“等下载”的无聊时间里。apt-fast 不改变 apt 的生态,不改变安装流程,只是非常朴实地把下载这一环提速了。脚本很小、配置透明,遇到问题也容易排查。用习惯了之后,回到裸 apt 反而会觉得哪里不对劲。
如果你第一次配置完成后感觉没有明显提速,不要急着卸载。先去确认 MIRRORS 有没有填对、sources.list 是不是同一个源、并发数有没有调得太低。把这几个变量捋顺,apt-fast 的体验会有质的提升。
