本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 2022年06月14日 统计字数: 6661字 阅读时间: 14分钟阅读 本文链接: https://soulteary.com/2022/06/14/lightweight-and-small-zero-configuration-apt-acceleration-tool-apt-proxy.html ----- # 轻量小巧的零配置 APT 加速工具:APT Proxy 本篇文章将介绍一个仅有 2MB+ 身材大小的缓存和加速工具:APT Proxy。 相比老牌儿的 apt cacher ng 而言,除了尺寸更小、内存占用更低(10M以内)、它还拥有无需配置,开箱即用等特点。 ## 写在前面 最近在折腾轻量的 “all in one python” 容器学习环境和一个复杂项目的容器构建,过程中需要不断的 `apt-get update` 和 `apt-get install`,真的是非常浪费时间。 在一年前,我曾分享过如何[《使用容器搭建 APT Cacher NG 缓存代理服务》](https://soulteary.com/2021/04/12/use-docker-to-build-apt-cacher-ng-caching-proxy-service.html),来减少日常开发和 CI 构建过程中的“数据更新、数据下载”所需要的时间。 但是,想要更好的使用 APT Cacher NG,首先需要准备一段冗长的配置文件;其次,如果是首次下载资源,想要享受加速服务,还需要使用命令来调整目标系统环境中的 `/etc/apt/sources.list` 中的资源域名,真的是有点麻烦。 **那么,有没有简单易用的方案呢?** 在网上搜索了一圈之后,我发现在八年前,有一个国外的开发者曾计划开发一款名为 `apt-proxy` 的开源软件,想要用来替换掉 APT Cacher NG(这不是和我想一块去了么)。然而因为种种原因,这位开发者最后弃坑了,而留下来的代码在八年后的今天,也根本编译构建不起来。 **但直觉告诉我,这个方式应该是行得通的。** 于是,我花了一些时间,对程序进行了一些调整,最终将程序跑了起来。 ![虽然看起来行数不少,但其实很快的](https://attachment.soulteary.com/2022/06/14/commits.jpg) 在经过简单验证之后,我发现原作者的设想和功能理念其实是不错的。只不过真的想用起来,缺少了“一些功能”。于是,我又花了一些时间,为这个软件添加了一些好用的功能: - 同时支持服务 Ubuntu / Debian 系统的数据下载 - 强化缓存数据规则,避免过于频繁的查询 Indexes 数据,浪费不必要的时间 - 内置了 Ubuntu / Debian Mirror 列表,根据网络位置自动选择最快的镜像 - 支持手动指定 Ubuntu / Debian 源地址 - 拥有一个简单易读的“状态统计页面” 然后,又为它集成了 GitHub 上的 CI 功能,让这个软件可以自动构建支持 i386、x86、x64、ARM64v8、ARM32v6、ARM32v7 多种二进制文件,来在多种硬件上运行。以及自动构建和生成能够跑在各种环境中的 Docker 镜像。 ![APT Proxy 简洁界面](https://attachment.soulteary.com/2022/06/14/preview.jpg) 说了这么多,我们来直接上手看看,如何使用这个“小程序”为我们日常开发 / 软件 CI 构建过程进行加速吧。 ## 使用 APT Proxy 来加速 APT 操作 APT Proxy 的使用方式,一般有两种:直接执行二进制文件,和使用 Docker 来运行。 考虑到我的读者中,Docker “爱好者” 数量众多,就先来聊聊 Docker 中的使用吧。 ### 在 Docker 中使用 APT Proxy 你可以通过下面的命令,先将 apt-proxy 作为后台服务运行在本地。 ```bash docker run -d --name=apt-proxy -p 3142:3142 soulteary/apt-proxy ``` 当命令执行完毕之后,我们将会看到类似下面的日志: ```bash Unable to find image 'soulteary/apt-proxy:latest' locally latest: Pulling from soulteary/apt-proxy c2bc5c57ca31: Pull complete fa7d8f08049a: Pull complete Digest: sha256:036e1fc4725f98bee2ed8e0c418b44955e134360bf52baaf3f48c3ec6d9d69e3 Status: Downloaded newer image for soulteary/apt-proxy:latest 06d2e2281f21ac505116fdee121aca00aa8a3257803a783f4e253e00c8ac7c94 ``` 当服务运行起来之后,我们可以通过打开浏览器,访问 `localhost:3142` (或者具体 IP),看到一个简单的统计界面。 ![首次启动的 APT Proxy 界面](https://attachment.soulteary.com/2022/06/14/apt-proxy-inital.jpg) 为了方便验证服务效果,我们使用 Docker 再启动一个 Ubuntu 或者 Debian 系统: ```bash docker run --rm -it ubuntu:22.04 ``` 当命令执行完毕之后,我们会进入容器的 Bash 环境中。 在不使用这类缓存代理工具时,我们想安装一个软件(比如 `vim`),我们需要执行下面的命令: ```bash apt update && apt install -y vim # 或者 apt update && apt-get install -y vim ``` 由于操作系统的默认软件源是 `http://archive.ubuntu.com/ubuntu/` 和 `http://security.ubuntu.com/ubuntu/` ,加上每次执行命令都需要访问远程网络服务器,所以速度会很慢,偶尔还会遇到网络中断。假设我们想使用 `apt-proxy` 快速安装 `vim` 并将 `vim` 缓存至本地,方便后续其他容器、主机完成快速安全和更新,可以执行下面的命令: ```bash http_proxy=http://host.docker.internal:3142 apt-get -o pkgProblemResolver=true -o Acquire::http=true update && \ http_proxy=http://host.docker.internal:3142 apt-get -o pkgProblemResolver=true -o Acquire::http=true install vim -y ``` 当然,你也可以根据自己的喜好,或者实际情况使用运行主机的具体 IP 来替换上面命令中的 `http://host.docker.internal`,当我们执行完毕命令,会发现程序的下载速度比默认情况下变快了非常多,即使日志中的下载数据地址看起来和默认官方地址完全一样。 ```bash Get:1 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB] Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB] Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [109 kB] Get:4 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [82.3 kB] Get:5 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [99.8 kB] Get:6 http://security.ubuntu.com/ubuntu jammy-security/multiverse amd64 Packages [4653 B] Get:7 http://security.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages [188 kB] Get:8 http://archive.ubuntu.com/ubuntu jammy/multiverse amd64 Packages [266 kB] ... Unpacking vim (2:8.2.3995-1ubuntu2) ... Setting up libexpat1:amd64 (2.4.7-1) ... Setting up media-types (7.0.0) ... Setting up libsodium23:amd64 (1.0.18-1build2) ... Setting up libgpm2:amd64 (1.20.7-10build1) ... Setting up libsqlite3-0:amd64 (3.37.2-2) ... Setting up xxd (2:8.2.3995-1ubuntu2) ... Setting up vim-common (2:8.2.3995-1ubuntu2) ... Setting up libpython3.10-minimal:amd64 (3.10.4-3) ... ... Processing triggers for libc-bin (2.35-0ubuntu3) ... ``` 这是因为 `apt-proxy` 在启动的时候,会自动选择最快的 Mirror 站点,并自动的将我们使用的官方软件源进行替换。也就是说,无需像使用 apt-cacher-ng 一样,再去调整和修改 ` cat /etc/apt/sources.list` 文件,就能够获得加速的效果。 在验证完首次下载之后,执行 `CTRL+D` 销毁当前容器,我们再次执行下面的命令,再新建一个干净的容器: ```bash docker run --rm -it ubuntu:22.04 ``` 然后再次执行命令,尝试更新软件列表以及进行 `vim` 安装: ```bash http_proxy=http://host.docker.internal:3142 apt-get -o pkgProblemResolver=true -o Acquire::http=true update && \ http_proxy=http://host.docker.internal:3142 apt-get -o pkgProblemResolver=true -o Acquire::http=true install vim -y ``` 你会发现命令执行的速度犹如开挂一般,飞速完成。查看日志,可以发现数据更新的速度最少也在 10MB/s,而连续下载软件包则能够跑到 40MB/s (如果你的文件更大,还可以跑出更高的速度) ```bash Get:1 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB] ... ... Fetched 21.5 MB in 1s (16.3 MB/s) ... ... Get:15 http://archive.ubuntu.com/ubuntu jammy/main amd64 vim amd64 2:8.2.3995-1ubuntu2 [1724 kB] Fetched 14.5 MB in 0s (41.6 MB/s) ``` 再次访问浏览器中的统计页面,会看到当前我们已经缓存的文件情况概览。(演示的过程中,使用的是 MacOS 中的 Docker Desktop,所以可用磁盘空间展示的是共享磁盘空间,不够准确,可以忽略。) ![缓存了软件的 APT Proxy 的状态](https://attachment.soulteary.com/2022/06/14/apt-proxy-cache-stats.jpg) 因为我们使用的是容器来运行 APT Proxy,而且并没有选择将数据映射到宿主机,所以清理缓存就变的非常简单,只需要销毁容器,然后再重新创建一个容器即可。 ```bash # 停止容器 docker stop apt-proxy # 删除容器和缓存数据 docker rm apt-proxy # 新建一个新的容器 docker run -d --name=apt-proxy -p 3142:3142 soulteary/apt-proxy ``` 当然,如果你在意软件安装速度,也可以将缓存数据映射到宿主机,实现缓存数据的持久化。 ```bash docker run -d --name=apt-proxy -v `pwd`/.aptcache:/.aptcache -p 3142:3142 soulteary/apt-proxy ``` ### 使用二进制方式使用 APT Proxy 在 GitHub 的[项目 Release 页面](https://github.com/soulteary/apt-proxy/releases),有包含 7种不同类型的可执行文件。 根据你的使用场景,下载对应的可执行文件的压缩包,然后解压之后,执行: ```bash ./apt-proxy ``` 当程序执行完毕之后,你会得到类似下面的日志: ```bash 2022/06/14 12:49:13 running apt-proxy 2022/06/14 12:49:13 Start benchmarking mirrors 2022/06/14 12:49:13 Finished benchmarking mirrors 2022/06/14 12:49:13 using fastest mirror http://mirrors.tuna.tsinghua.edu.cn/debian/ 2022/06/14 12:49:14 Start benchmarking mirrors 2022/06/14 12:49:14 Finished benchmarking mirrors 2022/06/14 12:49:14 using fastest mirror http://mirror.lzu.edu.cn/ubuntu/ 2022/06/14 12:49:14 proxy listening on 0.0.0.0:3142 ``` 接下来的使用方式,就和上文中提到的一样啦,调整我们要执行的 `apt update` 或 `apt insall` 命令即可。 ## 手动指定要使用的软件源 虽然软件内置了不止一个 Ubuntu 和 Debian 的软件源,还会根据网络情况调用官方的软件源接口,来补充合适的软件源。最后,根据测速的方式来自动选择要使用的软件源。 但是,最快的软件源不一定网络出口是最大的,所以你也可以根据你的实际网络状况,来选择更适合你的软件源,假设我们想要把 Ubuntu 和 Debian 使用的软件源指定为 “清华源”,那么可以这样调整命令: ```bash ./apt-proxy --ubuntu=https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ --debian=https://mirrors.tuna.tsinghua.edu.cn/debian/ ``` 当命令执行完毕,我们就可以看到日志输出中包含了我们所指定的软件源。 ```bash 2022/06/14 12:55:12 running apt-proxy 2022/06/14 12:55:12 using specify debian mirror https://mirrors.tuna.tsinghua.edu.cn/debian/ 2022/06/14 12:55:12 using specify ubuntu mirror https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ 2022/06/14 12:55:12 proxy listening on 0.0.0.0:3142 ``` 上面的参数同样可以用在 Docker 环境中。 ## 其他 APT Proxy 支持的完整的参数,可以通过在命令后添加 `-h` 来查看。包含了调整缓存目录、调整端口和监听 IP 地址,调整代理模式等。 感兴趣的同学,可以通过 GitHub 项目地址 [https://github.com/soulteary/apt-proxy](https://github.com/soulteary/apt-proxy) 了解最新的情况,或者自己动手试验来试试看。 ## 最后 这篇文章和 APT Proxy 是最近折腾东西的副产品,希望能够帮助到和我一样“懒惰”的程序员。 如果未来的时间里,GitHub 上的项目和本篇文章收到比较多的鼓励的话,我或许会持续开发和迭代一些有趣、有用的功能。 --EOF