轻量小巧的零配置 APT 加速工具:APT Proxy

2022-09-01 17:36:16 浏览数 (1)

本篇文章将介绍一个仅有 2MB 身材大小的缓存和加速工具:APT Proxy。

相比老牌儿的 apt cacher ng 而言,除了尺寸更小、内存占用更低(10M以内)、还拥有无需配置,开箱即用等的特点。

写在前面

最近在折腾轻量的 “all in one python” 容器学习环境和一个复杂项目的容器构建,过程中需要不断的 apt-get updateapt-get install,真的是非常浪费时间。

在一年前,我曾分享过如何《使用容器搭建 APT Cacher NG 缓存代理服务》[1],来减少日常开发和 CI 构建过程中的“数据更新、数据下载”所需要的时间。

但是,想要更好的使用 APT Cacher NG,首先需要准备一段冗长的配置文件;其次,如果是首次下载资源,想要享受加速服务,还需要使用命令来调整目标系统环境中的 /etc/apt/sources.list 中的资源域名,真的是有点麻烦。

那么,有没有简单易用的方案呢?

在网上搜索了一圈之后,我发现在八年前,有一个国外的开发者曾计划开发一款名为 apt-proxy 的开源软件,想要用来替换掉 APT Cacher NG(这不是和我想一块去了么)。然而因为种种原因,这位开发者最后弃坑了,而留下来的代码在八年后的今天,也根本编译构建不起来。

但直觉告诉我,这个方式应该是行得通的。

于是,我花了一些时间,对程序进行了一些调整,最终将程序跑了起来。

虽然看起来行数不少,但其实很快的

在经过简单验证之后,我发现原作者的设想和功能理念其实是不错的。只不过真的想用起来,缺少了“一些功能”。于是,我又花了一些时间,为这个软件添加了一些好用的功能:

•同时支持服务 Ubuntu / Debian 系统的数据下载•强化缓存数据规则,避免过于频繁的查询 Indexes 数据,浪费不必要的时间•内置了 Ubuntu / Debian Mirror 列表,根据网络位置自动选择最快的镜像•支持手动指定 Ubuntu / Debian 源地址•拥有一个简单易读的“状态统计页面”

然后,又为它集成了 GitHub 上的 CI 功能,让这个软件可以自动构建支持 i386、x86、x64、ARM64v8、ARM32v6、ARM32v7 多种二进制文件,来在多种硬件上运行。以及自动构建和生成能够跑在各种环境中的 Docker 镜像。

APT Proxy 简洁界面

说了这么多,我们来直接上手看看,如何使用这个“小程序”为我们日常开发 / 软件 CI 构建过程进行加速吧。

使用 APT Proxy 来加速 APT 操作

APT Proxy 的使用方式,一般有两种:直接执行二进制文件,和使用 Docker 来运行。

考虑到我的读者中,Docker “爱好者” 数量众多,就先来聊聊 Docker 中的使用吧。

在 Docker 中使用 APT Proxy

你可以通过下面的命令,先将 apt-proxy 作为后台服务运行在本地。

代码语言:javascript复制
docker run -d --name=apt-proxy -p 3142:3142 soulteary/apt-proxy

当命令执行完毕之后,我们将会看到类似下面的日志:

代码语言:javascript复制
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 界面

为了方便验证服务效果,我们使用 Docker 再启动一个 Ubuntu 或者 Debian 系统:

代码语言:javascript复制
docker run --rm -it ubuntu:22.04

当命令执行完毕之后,我们会进入容器的 Bash 环境中。

在不使用这类缓存代理工具时,我们想安装一个软件(比如 vim),我们需要执行下面的命令:

代码语言:javascript复制
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 缓存至本地,方便后续其他容器、主机完成快速安全和更新,可以执行下面的命令:

代码语言:javascript复制
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,当我们执行完毕命令,会发现程序的下载速度比默认情况下变快了非常多,即使日志中的下载数据地址看起来和默认官方地址完全一样。

代码语言:javascript复制
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 销毁当前容器,我们再次执行下面的命令,再新建一个干净的容器:

代码语言:javascript复制
docker run --rm -it ubuntu:22.04

然后再次执行命令,尝试更新软件列表以及进行 vim 安装:

代码语言:javascript复制
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 (如果你的文件更大,还可以跑出更高的速度)

代码语言:javascript复制
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 的状态

因为我们使用的是容器来运行 APT Proxy,而且并没有选择将数据映射到宿主机,所以清理缓存就变的非常简单,只需要销毁容器,然后再重新创建一个容器即可。

代码语言:javascript复制
# 停止容器
docker stop apt-proxy
# 删除容器和缓存数据
docker rm apt-proxy
# 新建一个新的容器
docker run -d --name=apt-proxy -p 3142:3142 soulteary/apt-proxy

当然,如果你在意软件安装速度,也可以将缓存数据映射到宿主机,实现缓存数据的持久化。

代码语言:javascript复制
docker run -d --name=apt-proxy -v `pwd`/.aptcache:/.aptcache -p 3142:3142 soulteary/apt-proxy

使用二进制方式使用 APT Proxy

在 GitHub 的项目 Release 页面[2],有包含 7种不同类型的可执行文件。

根据你的使用场景,下载对应的可执行文件的压缩包,然后解压之后,执行:

代码语言:javascript复制
./apt-proxy

当程序执行完毕之后,你会得到类似下面的日志:

代码语言:javascript复制
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 updateapt insall 命令即可。

手动指定要使用的软件源

虽然软件内置了不止一个 Ubuntu 和 Debian 的软件源,还会根据网络情况调用官方的软件源接口,来补充合适的软件源。最后,根据测速的方式来自动选择要使用的软件源。

但是,最快的软件源不一定网络出口是最大的,所以你也可以根据你的实际网络状况,来选择更适合你的软件源,假设我们想要把 Ubuntu 和 Debian 使用的软件源指定为 “清华源”,那么可以这样调整命令:

代码语言:javascript复制
./apt-proxy --ubuntu=https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ --debian=https://mirrors.tuna.tsinghua.edu.cn/debian/

当命令执行完毕,我们就可以看到日志输出中包含了我们所指定的软件源。

代码语言:javascript复制
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 了解最新的情况,或者自己动手试验来试试看。

最后

这篇文章和 APT Proxy 是最近折腾东西的副产品,希望能够帮助到和我一样“懒惰”的程序员。

如果未来的时间里,GitHub 上的项目和本篇文章收到比较多的鼓励的话,我或许会持续开发和迭代一些有趣、有用的功能。

--EOF

引用链接

[1] 《使用容器搭建 APT Cacher NG 缓存代理服务》: https://soulteary.com/2021/04/12/use-docker-to-build-apt-cacher-ng-caching-proxy-service.html [2] 项目 Release 页面: https://github.com/soulteary/apt-proxy/releases

0 人点赞