如何使用apt-cacher-ng在树莓派上创建APT代理?
如果您生活和工作的地方的互联网速度较慢,并且需要更新一组Debian和/或Ubuntu系统,此apt代理将使您的生活更轻松和更快。
APT是Debian和Ubuntu Linux发行版用于安装和更新软件的程序。在其开箱即用的配置中,当您使用apt安装程序时,例如:
sudo apt install inkscape
APT将从分发存储库服务器下载软件存档并安装。当软件包较小,只有少量需要下载的文件,且您的互联网连接速度较快时,这非常有效。
然而,如果您有很多软件需要安装,并且办公室里的所有机器都需要更新,而且您的互联网连接速度较慢,那么获取所有内容的下载和安装可能需要很长时间。
代理服务器,特别是缓存代理服务器,如apt-cacher-ng,是一个程序,位于您要更新的计算机和存储软件的存储库服务器之间。正在更新的计算机将从代理服务器而不是存储库请求软件,代理将转发请求到存储库,下载软件并将其返回给更新的计算机。
巧妙的地方是,代理服务器将保留其下载的所有软件文件的副本。当本地网络上的另一台机器尝试下载相同的文件,即它希望安装或更新相同的软件时,代理已经有了可以提供给请求机器的副本,而不需要再次下载。
第一次下载后,所有后续下载将以本地网络的速度进行。
要求
完成本指南,您需要以下内容:
- 连接到本地网络的任何版本的Raspberry Pi Raspberry PI。
- 要插入Raspberry Pi的屏幕和键盘(如果您可以通过SSH连接到Raspberry Pi,则可选择不插入)。
- 在您的Raspberry Pi上启用sudo的非root用户。
- 本地网络上的Debian或Ubuntu系统。
完成上述所有要求后,以sudo用户身份登录Raspberry PI上的终端,然后继续下一节。
安装apt-cacher-ng
在Linux上安装任何新软件包之前,始终执行系统更新是一个好习惯。这将确保您的系统运行与分发存储库中可用的软件包版本相同,并且您的本地软件包版本列表也是最新的。这样做将确保在安装apt-cacher-ng期间不会遇到任何错误。
以下命令将更新您的系统:
$ sudo apt update
$ sudo apt upgrade
现在,您的Raspberry PI已经是最新的了,可以安装apt-cacher-ng:
$ sudo apt install apt-cacher-ng
安装程序会问您是否要通过apt-cacher-ng启用HTTPS隧道。对于此问题,您应该回答“否”。我们将配置APT通过apt-cacher-ng代理HTTPS连接,而不需要隧道。此外,如果需要,您可以稍后更改apt-cacher-ng配置文件中的这些选项。
按照现代软件约定,当您安装apt-cacher-ng时,将创建并启用systemd服务文件。这意味着apt-cacher-ng将在启动时自动启动,并且您还可以使用常规systemd服务命令来管理apt-cacher-ng:
$ sudo systemctl start apt-cacher-ng.service
$ sudo systemctl stop apt-cacher-ng.service
$ sudo systemctl restart apt-cacher-ng.service
apt-cacher-ng
现在作为一个系统守护进程在端口3142
上运行,并准备接受来自apt
的连接。
在树莓派上配置apt
我们将首先配置使用apt-cacher-ng
代理的树莓派上的apt
系统。我们将配置apt
使用apt-cacher-ng
代理的方法是在apt
的源文件中重写URL。源文件包含一个下载发行版软件的存储库URL列表。
你会在Raspbian的主要源文件中找到/etc/apt/sources.list
,在新安装上看起来如下:
deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
# deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
这里唯一活动的(未注释的)行是第一行,即:
deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
我们需要修改这一行,所以用文本编辑器打开文件,这里我们使用nano
:
$ sudo nano /etc/apt/sources.list
修改第一行,使其看起来像下面这样:
deb http://127.0.0.1:3142/raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
你在这里做的是在URL中插入127.0.0.1:3142
。
IP地址127.0.0.1
始终是本地计算机的IP地址,通常称为“localhost”。:3142
部分表示端口。
按CTRL+o
,ENTER
,CTRL+x
保存并退出nano
。
现在你需要对/etc/apt/sources.list.d/raspi.list
中的源文件进行相同的更改。
apt
和apt-cacher-ng
现在准备好进行测试。
使用apt-cacher-ng测试apt
每当运行apt
时,它都会缓存下载的任何文件的副本。apt
这样做是为了避免不必要的下载,并在需要重新安装软件包且没有互联网连接时保留安装包的本地副本。
这种本地缓存意味着如果存储库没有更改,当你运行apt update
或apt upgrade
时,apt
将不会与代理服务器通信。因此,为了测试代理,我们需要手动清除apt
缓存。以下命令将清除所有apt
的缓存包:
$ sudo rm -rf /var/lib/apt/lists/
$ sudo rm -rf /var/cache/apt/*
现在通过运行更新并检查是否有任何错误来测试apt
:
$ sudo apt update
你应该看到几行输出,看起来像:
Get:1 http://127.0.0.1:3142/raspbian.raspberrypi.org/raspbian buster InRelease [15.0 kB]
以http://127.0.0.1:3142/
开头的URL表示apt
正在从apt-cacher-ng
接收更新文件。
你还可以通过运行以下命令来查看apt-cacher-ng
日志文件中的错误:
$ tail -f /var/log/apt-cacher-ng/apt-cacher.log
打开第二个终端。如果您没有遇到任何错误,可以继续在本地网络上配置Debian或Ubuntu系统。
配置Ubuntu或Debian系统使用apt-cacher-ng
您本地网络上的Debian或Ubuntu系统要想从apt-cacher-ng代理中受益,不需要安装任何额外的软件。您所需要做的就是重新编写它们的源文件,以便它们从apt-cacher-ng而不是直接联系仓库来收集所有更新。
您需要对源文件进行的更改与您对Raspberry PI 源上所做的更改完全相同,只是您需要使用Raspberry PI的IP地址替代127.0.0.1
。
这意味着您首先需要获取您的Raspberry Pi的IP地址。获取Raspberry PI的IP地址最简单的方法是在Raspberry PI上的终端上运行以下命令:
$ hostname -I
这将打印出Raspberry PI拥有的IP地址。使用第一个IPv4 IP地址。这里,我将使用示例地址192.168.0.2
。您需要替换为您的Raspberry PI的IP地址。
回到客户机,在文本编辑器中打开主要的源文件,这里我们使用nano
:
$ sudo nano /etc/apt/sources.list
该文件将包含与Raspberry PI的/etc/apt/sources.list
上的那些具有相同格式的行。以下是Debian Buster安装的示例行:
deb http://ftp.debian.org/debian buster main
您需要按照以下方式编辑这些行,使用您的Raspberry PI的IP,例如:
deb http://192.168.0.2:3142/ftp.debian.org/debian buster main
编辑/etc/apt/sources.list
中的所有行和/etc/apt/sources.list.d/
下的任何其他源文件。然后删除任何本地缓存文件进行测试:
$ sudo rm -rf /var/lib/apt/lists/*
$ sudo rm -rf /var/cache/apt/*
再次更新系统:
$ sudo apt update
$ sudo apt upgrade
apt
的输出应指示更新文件来自apt-cacher-ng
代理,并打印包含代理IP的以下行:
Hit:1 http://192.168.0.2:3142/ftp.debian.org/debian buster InRelease
此机器现在已完全配置为使用新的apt
代理。您将需要编辑将来添加到此机器的任何新源文件,包括为发行版升级添加的任何新行。
通过HTTPS使用APT
到目前为止,我们所看到的源文件都使用了HTTP连接。这是Debian和Ubuntu的一个有意设计决策,因为安装档案内置了阻止恶意篡改的内部加密签名。而HTTPS则不具备此功能,因此在工程负担上增加了很多,而对地理位置分散的镜像有很多。
然而,使用HTTPS有几个优点,这意味着一些非官方的仓库使用HTTPS。apt-cacher-ng支持两种处理HTTPS仓库的方法。
第一种方法是将来自客户端的连接直接传递给仓库服务器。这将导致apt-cacher-ng
不会缓存软件包。如果您希望在此模式下运行apt-cacher-ng
,请使用文本编辑器打开/etc/apt-cacher-ng/acng.conf
:
$ sudo nano /etc/apt-cacher-ng/acng.conf
并添加以下行:
PassThroughPattern: .*
这将配置apt-cacher-ng
允许从客户端到仓库的HTTPS连接。
第二种方法是修改客户端源文件中的仓库行,使客户端通过HTTP连接到apt-cacher-ng
,然后apt-cacher-ng
再通过HTTPS连接到仓库。包将通过HTTPS下载到apt-cacher-ng
,然后通过HTTP发送到客户端机器上。apt-cacher-ng
能够缓存包,并且我们不会失去HTTPS的好处。
以下源行是用于通过HTTPS访问Docker仓库的:
deb [arch=amd64] https://download.docker.com/linux/debian buster stable
当你编辑HTTP行时,你在URL中添加了192.168.0.2:3142
。当你编辑HTTPS行时,你需要添加192.168.0.2:3142/HTTPS///
,例如:
deb [arch=amd64] http://192.168.1.67:3142/HTTPS///download.docker.com/linux/debian buster stable
现在客户端机器将通过HTTP请求来自apt-cacher-ng
的软件包,apt-cacher-ng
将通过HTTPS下载和缓存来自Docker的软件包。
管理apt-cacher-ng
一个Web GUI可用于管理本地网络上的apt-cacher-ng
。为了访问此GUI,您需要将浏览器指向:
http://:3142/acng-report.html
将示例本地网络IP192.168.0.2
替换为:
http://192.168.0.2:3142/acng-report.html
GUI的第一部分,即“传输统计”,提供了有关从存储库下载的数据量与从缓存中提供的数据量的信息。以下图片显示了GUI的此部分:
“缓存效率”部分向您提供有关apt-cacher-ng
从其缓存中提供的文件数量与绕过缓存的文件数量的信息。 “命中”表示代理从缓存中提供的文件,“未命中”表示代理机器从存储库下载并添加到缓存中的文件。
管理缓存
apt-cacher-ng
下载并为本地网络上的客户机提供的文件将在开发人员将新版本添加到存储库时变得陈旧。当发生这种情况时,apt-cacher-ng
必须从缓存中删除这些陈旧的文件,因为它们不再需要并占据了您的硬盘空间。树莓派评审会自动检查缓存并删除陈旧的文件。
当您安装了apt-cacher-ng
时,还会在以下位置安装一个cron
文件:
/etc/cron.daily/apt-cacher-ng
每天cron
会运行这个文件来清除缓存。
如果您希望手动查看和清除缓存,那么您应该登录到Web GUI,然后点击标有“开始扫描和/或过期”的按钮。通常情况下,这是不必要的,但如果您从更新速度很快的存储库进行更新,则可能需要这样做。
现在您拥有一个高效的apt
代理,可以减轻办公室或家中大量重复的系统更新所带来的网络负担。
有兴趣探索树莓派,请访问check out this online course。