2

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

 1 year ago
source link: https://soulteary.com/2022/06/14/lightweight-and-small-zero-configuration-apt-acceleration-tool-apt-proxy.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

2022年06月14日阅读Markdown格式6661字14分钟阅读

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

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

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

在一年前,我曾分享过如何《使用容器搭建 APT Cacher NG 缓存代理服务》,来减少日常开发和 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 简洁界面

APT Proxy 简洁界面

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

使用 APT Proxy 来加速 APT 操作

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

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

在 Docker 中使用 APT Proxy

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

docker run -d --name=apt-proxy -p 3142:3142 soulteary/apt-proxy

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

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 界面

首次启动的 APT Proxy 界面

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

docker run --rm -it ubuntu:22.04

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

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

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

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

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

docker run --rm -it ubuntu:22.04

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

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 (如果你的文件更大,还可以跑出更高的速度)

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 的状态

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

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

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

docker run -d --name=apt-proxy -v `pwd`/.aptcache:/.aptcache -p 3142:3142 soulteary/apt-proxy

使用二进制方式使用 APT Proxy

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

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

./apt-proxy

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

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 使用的软件源指定为 “清华源”,那么可以这样调整命令:

./apt-proxy --ubuntu=https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ --debian=https://mirrors.tuna.tsinghua.edu.cn/debian/

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

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 上的项目和本篇文章收到比较多的鼓励的话,我或许会持续开发和迭代一些有趣、有用的功能。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK