软件包代理缓存

来自 ArchWiki


如果您想一遍又一遍地安装相同的 Arch 软件包 - 例如为了测试目的 - 如果您不必每次都从互联网获取软件包,那将会有所帮助。本文向您展示如何共享软件包,以便您可以大大缩短下载时间。请记住,您不应在不同的架构(即 i686 和 x86_64)之间共享,否则您会遇到问题。

只读缓存

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

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

开始服务此目录。例如,使用 Python http.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#编写单元文件

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

$ miniserve /var/cache/pacman/pkg

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

如果您已经为其他目的运行 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 服务器,请确保防火墙配置(如果有)允许所需流量访问配置的端口,并禁止任何不需要的流量。请参阅 安全性#网络和防火墙

只读缓存的Overlay挂载

可以通过 overlay 挂载/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#用法
提示: 如果列出 /tmp/pacman_pkg overlay 目录时出现错误,例如“Stale file handle”,请尝试使用选项 -o redirect_dir=off -o index=off 进行 overlay 挂载。

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

# pacman -Syu --cachedir /tmp/pacman_pkg

分布式只读缓存

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

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

读写缓存

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

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

提示
  • 要使用 sshfs,请考虑阅读 使用 SSH 密钥
  • 默认情况下,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 over ssh,而不是依赖于未加密的 rsync 守护程序Rsync#使用 SSH 自动备份 概述了这一点。

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

使用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 pacman 缓存配置 作为 /etc/nginx/nginx.conf 的起点。检查 resolver 指令是否满足您的需求。在上游服务器块中,使用官方镜像的地址配置 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_patterns

/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 安装

本文或本节正在考虑移除。

原因: AIF (/arch/setup) 不再存在;在使用基于 ram 的安装映像时配置 Squid 似乎不是常规用例。(在 Talk:Package Proxy Cache 中讨论)

在运行 /arch/setup 之前,为您的代理添加变量。为此,请在控制台上运行

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

现在只需使用 /arch/setup 正常安装系统,它应该使用您的代理。观看 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 单元。

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

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

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

防止不必要的缓存清除

默认情况下,pacman -Sc 从缓存中删除与命令发出时未安装在计算机上的软件包相对应的软件包 tarball。由于 pacman 无法预测共享缓存的所有计算机上安装了哪些软件包,因此它最终会删除不应该删除的文件。

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

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