跳转至内容

软件包代理缓存

来自 ArchWiki


如果您想反复安装相同的 Arch 软件包(例如用于测试目的),那么不必每次都从互联网获取软件包会很有帮助。本文将向您展示如何共享软件包,从而大大缩短您的下载时间。

哪种解决方案最好取决于您的个人用例。这些方法可以分为在机器上进行 #软件包缓存共享,或者部署一个 #代理服务器 在一台机器上进行额外的缓存,并相应地配置机器以使用它。

软件包缓存共享

对于所有共享软件包缓存的解决方案,请记住,默认情况下,pacman -Sc 会从缓存中删除与在发出命令的机器上未安装的软件包对应的软件包 tarball。由于 pacman 无法预测所有共享缓存的机器上安装了哪些软件包,它最终会删除不应删除的文件。

要清理缓存,以便只删除过时的 tarball

/etc/pacman.conf
[options]
CleanMethod = KeepCurrent

只读缓存

Pacman 6.1.0 直接支持缓存服务器。缓存服务器将在任何非缓存服务器之前被尝试,不会因为 HTTP 404 下载错误而从服务器池中移除,也不会用于数据库文件。

如果您正在寻找一个快速的解决方案,您可以简单地运行一个 基本的临时 Web 服务器,其他计算机可以将其用作缓存服务器。

开始提供此目录。例如,使用 Pythonhttp.server 模块

$ python -m http.server -d /var/cache/pacman/pkg/
提示 默认情况下,Python http.server 监听任何接口的 8000 端口。要使用其他端口,或仅绑定到特定地址,只需添加一个参数和一个值。
$ python -m http.server -d /var/cache/pacman/pkg/ --bind 127.0.0.1 8080

然后,在每台客户端机器上编辑 /etc/pacman.d/mirrorlist 以添加此服务器。

/etc/pacman.d/mirrorlist
CacheServer = http://server-ip:port
警告 不要像其他条目一样将 /repos/$repo/os/$arch 追加到此自定义服务器,因为此层次结构不存在,因此查询将失败。

如果您正在寻找一个更独立的解决方案,darkhttpd 提供了一个非常小巧的 Web 服务器。将之前的 python 命令替换为例如:

[http]$ darkhttpd /var/cache/pacman/pkg --no-server-id

您也可以方便地将 darkhttpd 作为 systemd 服务运行:请参阅 Systemd#Writing unit files

miniserve,一个用 Rust 编写的小型 Web 服务器,也可以使用。

$ miniserve /var/cache/pacman/pkg

然后,如上所述,使用 miniserve 可用的第一个 URL 编辑 /etc/pacman.d/mirrorlist

如果您已经因为其他目的运行 Web 服务器,您可能希望将其用作本地存储库服务器。例如,如果您已经使用 nginx 提供网站,您可以添加一个监听 8080 端口的 nginx 服务器块。

/etc/nginx/nginx.conf
server {
    listen 8080;
    root /var/cache/pacman/pkg;
    server_name myarchrepo.localdomain;
    try_files $uri $uri/;
}

请记住,在进行此更改后重新启动 nginx.service

提示 无论您使用哪个 Web 服务器,请确保防火墙配置(如果有)允许所需流量访问配置的端口,并阻止任何不必要的流量。请参阅 Security#Network and firewalls

只读缓存的覆盖挂载

可以通过覆盖挂载/var/cache/pacman/pkg 目录,将一台本地网络上的计算机用作只读软件包缓存。如果此服务器上安装了相当全面的最新软件包,并且其他计算机也使用这些软件包,那么这种配置将非常有利。这对于维护连接到低带宽上游连接的许多计算机很有用。

例如,要使用此方法

# mkdir /tmp/remote_pkg /mnt/workdir_pkg /tmp/pacman_pkg
# sshfs remote_username@remote_pkgcache_addr:/var/cache/pacman/pkg /tmp/remote_pkg -C
# mount -t overlay overlay -o lowerdir=/tmp/remote_pkg,upperdir=/var/cache/pacman/pkg,workdir=/mnt/workdir_pkg /tmp/pacman_pkg
注意 工作目录必须是与上层目录在同一挂载设备上的空目录。请参阅 Overlay filesystem#Usage
提示 如果列出 /tmp/pacman_pkg 覆盖目录时出现错误,例如“Stale file handle”(文件句柄陈旧),请尝试使用选项 -o redirect_dir=off -o index=off 进行覆盖挂载。

在此之后,运行 pacman 时使用 --cachedir /tmp/pacman_pkg 选项,例如:

# pacman -Syu --cachedir /tmp/pacman_pkg

分布式只读缓存

有一些 Arch 特定的工具可以自动发现您网络上提供软件包缓存的其他计算机。尝试 pacredirpacservepkgdistcacheAURpaclanAUR。pkgdistcache 使用 Avahi 而不是纯 UDP,这可能在某些路由而不是桥接 Wi-Fi 和以太网的家庭网络中效果更好。

历史上,曾有 PkgDmultipkg,但它们已不再维护。

读写缓存

为了在多台计算机之间共享软件包,只需使用任何基于网络的挂载协议共享 /var/cache/pacman/。本节将介绍如何使用 SSHFS 在同一本地网络的多台计算机之间共享软件包缓存以及相关的库目录。请记住,网络共享缓存的性能可能会因文件系统选择等因素而异。

首先,安装任何支持网络的​​文件系统包:sshfscurlftpfssambanfs-utils

提示
  • 要使用 sshfs,请考虑阅读 Using SSH Keys
  • 默认情况下,smbfs 不会提供包含冒号的文件名,这会导致客户端重新下载有问题的软件包。为防止此问题,请在客户端使用 mapchars 挂载选项。

然后,要共享实际的软件包,请将服务器上的 /var/cache/pacman/pkg 挂载到每台客户端机器上的 /var/cache/pacman/pkg

警告 不要将 /var/cache/pacman/pkg 或其任何祖先(例如 /var)设置为符号链接。Pacman 期望这些是目录。当 pacman 重新安装或升级自身时,它将删除符号链接并创建空目录。然而,在事务过程中 pacman 依赖于驻留在其中的某些文件,因此会破坏更新过程。有关详细信息,请参阅 FS#50298

使用 rsync 或 FTP 进行双向同步

在本地环境中,另一种方法是使用 rsync。选择一个缓存服务器,并启用 rsync 守护进程。在客户端通过 rsync 协议与此共享进行双向同步。包含冒号的文件名对 rsync 协议来说不是问题。

客户端的示例草稿,使用 uname -m 作为共享名称的一部分可确保依赖于架构的同步。

# rsync ... rsync://server/share_$(uname -m)/ /var/cache/pacman/pkg/ 
# pacman -Syu
# paccache --remove --keep 3
# rsync --delete ... /var/cache/pacman/pkg/ rsync://server/share_$(uname -m)/

与依赖未加密的 rsync 守护进程 相比,更安全的选择是通过 SSH 进行 rsync,Rsync#Automated backup with SSH 提供了概述。

如果您的本地环境没有 rsync,那么简单的 ftp 服务也适用于双向同步。 lftp 提供了 --mirror--delete 选项来同步本地存储和远程存储。

使用同步程序同步 pacman 软件包缓存

使用 SyncthingResilio Sync 来同步 pacman 缓存目录(即 /var/cache/pacman/pkg)。

代理服务器

对于代理服务器解决方案,请记住机器应仅使用 HTTP 镜像,因为代理服务器默认无法检查 HTTPS 连接。

使用 nginx 实现动态反向代理缓存

nginx 可用于将软件包请求代理到上游官方镜像,并将结果缓存到本地磁盘。之后对该软件包的所有请求都将直接从本地缓存提供,从而最大程度地减少更新大量计算机所需的互联网流量。

在此示例中,缓存服务器将在 http://cache.domain.example:8080/ 上运行,并将软件包存储在 /srv/http/pacman-cache/ 中。

在将要托管缓存的计算机上安装 nginx。创建缓存目录,并调整权限,以便 nginx 可以向其写入文件。

# mkdir /srv/http/pacman-cache
# chown http:http /srv/http/pacman-cache

nginx 软件包缓存配置 用作 /etc/nginx/nginx.conf 的起点。检查 resolver 指令是否适合您的需求。在 upstream 服务器块中,使用官方镜像的地址配置 proxy_pass 指令,有关预期格式的示例,请参阅配置文件。一旦您对配置文件满意,请启动并启用 nginx

为了使用缓存,每台 Arch Linux 计算机(包括托管缓存的计算机)都必须在 mirrorlist 文件的顶部添加以下行。

/etc/pacman.d/mirrorlist
Server = http://cache.domain.example:8080/$repo/os/$arch
...
注意 您需要创建一个清除旧软件包的方法,因为缓存目录会随着时间不断增长。paccache(由 pacman-contrib 提供)可用于使用您选择的保留标准来自动执行此操作。例如,find /srv/http/pacman-cache/ -type d -exec paccache -v -r -k 2 -c {} \; 将在您的缓存目录中保留软件包的最后 2 个版本。

Squid

Squid 代理可以设置为仅缓存 arch 软件包,并且可以通过对客户端系统进行最少的配置来与 aif/pacman/wget/etc 一起使用。

安装 Squid

安装 squid

配置 Squid

这是让 squid 缓存 arch 软件包的最低配置。

缓存规则

在定义这些规则之前,请删除/注释掉(如果您不需要它们)所有默认的 refresh_pattern。

/etc/squid/squid.conf 
refresh_pattern \.pkg\.tar\.   0       20%     4320      reload-into-ims
refresh_pattern .              0       0%      0

这应该定义 *.pkg.tar.* 被缓存,而其他任何东西都不被缓存。

最大文件大小

大于此尺寸的对象将不会被保存在磁盘上。

/etc/squid/squid.conf 
maximum_object_size 256 MB
缓存目录

设置缓存目录及其最大大小和子目录。

/etc/squid/squid.conf 
cache_dir aufs /var/cache/squid 10000 16 256
关机生命周期

等待所有活动客户端套接字关闭的时间。

/etc/squid/squid.conf 
shutdown_lifetime 1 seconds 

每次更改 cache_dir 路径时(以及首次安装后),都需要(重新)创建此目录。

# squid -z

运行 squid 之前检查配置文件可能会有所帮助。

# squid -k parse

启动 Squid

只需启动 squid.service,或者如果 squid 已经在运行,请重新启动它。

运行之前检查配置文件可能会有所帮助。

# squid -k check

跟踪 Squid 访问日志

查看对 squid 的访问。

# tail -f /var/log/squid/access.log

对于被定向到原始主机的软件包,您应该看到此内容。

...TCP_MISS/200...DIRECT...

对于从缓存提供的软件包,您应该看到此内容。

...TCP_HIT/200...NONE...

手动 Arch 安装

在各个机器上,为您的代理添加环境变量。为测试这样做:

# export http_proxy='http://your_squid_machine_ip:3128/'
# export ftp_proxy='ftp://your_squid_machine_ip:3128/'

现在它应该会使用您的代理。查看 squid 日志进行验证。一旦有效,请在已安装系统的适当位置(例如在 /etc/profile.d/proxy.sh 中)添加 http_proxy 和/或 ftp_proxy 变量。

拦截本地请求

如果您希望本地机器上的所有 HTTP 请求自动通过 squid,我们首先需要为 squid 添加一个拦截端口。

/etc/squid/squid.conf 
http_port 3127 intercept

并添加 iptables 规则将所有(除 squid 之外)端口 80 的请求重定向到 squid。

# iptables -t nat -A OUTPUT -p tcp --dport 80 -m owner --uid-owner proxy -j ACCEPT
# iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 3127
注意 如果您在 vagrant/packer/virtualbox 中遇到随机的慢速下载速度,请尝试使用 virtio 网络设备类型。

Pacoloco 代理缓存服务器

Pacoloco 是一个易于使用的 pacman 存储库代理缓存服务器。它还允许自动预取缓存的软件包。

它可以安装为 pacoloco。打开配置文件并添加 pacman 镜像。

/etc/pacoloco.yaml
port: 9129
repos:
  mycopy:
    urls:
      - http://mirror.lty.me/archlinux
      - http://mirrors.kernel.org/archlinux

重新启动 pacoloco.service,代理存储库将可在 http://myserver:9129/repo/mycopy 访问。

Flexo 代理缓存服务器

Flexo 是另一个 pacman 存储库代理缓存服务器。Flexo 可作为 flexo-gitAUR 获得。安装后,启动 flexo.service unit。

Flexo 默认在 7878 端口上运行。在 /etc/pacman.d/mirrorlist 的顶部输入 Server = http://myserver:7878/$repo/os/$arch,以便 pacman 通过 Flexo 下载软件包。