软件包代理缓存
如果您想反复安装相同的 Arch 软件包(例如用于测试目的),那么不必每次都从互联网获取软件包会很有帮助。本文将向您展示如何共享软件包,从而大大缩短您的下载时间。
哪种解决方案最好取决于您的个人用例。这些方法可以分为在机器上进行 #软件包缓存共享,或者部署一个 #代理服务器 在一台机器上进行额外的缓存,并相应地配置机器以使用它。
软件包缓存共享
对于所有共享软件包缓存的解决方案,请记住,默认情况下,pacman -Sc 会从缓存中删除与在发出命令的机器上未安装的软件包对应的软件包 tarball。由于 pacman 无法预测所有共享缓存的机器上安装了哪些软件包,它最终会删除不应删除的文件。
要清理缓存,以便只删除过时的 tarball
/etc/pacman.conf
[options] CleanMethod = KeepCurrent
只读缓存
Pacman 6.1.0 直接支持缓存服务器。缓存服务器将在任何非缓存服务器之前被尝试,不会因为 HTTP 404 下载错误而从服务器池中移除,也不会用于数据库文件。
如果您正在寻找一个快速的解决方案,您可以简单地运行一个 基本的临时 Web 服务器,其他计算机可以将其用作缓存服务器。
开始提供此目录。例如,使用 Python 的 http.server 模块
$ python -m http.server -d /var/cache/pacman/pkg/
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。
只读缓存的覆盖挂载
可以通过覆盖挂载其 /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
/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 特定的工具可以自动发现您网络上提供软件包缓存的其他计算机。尝试 pacredir、pacserve、pkgdistcacheAUR 或 paclanAUR。pkgdistcache 使用 Avahi 而不是纯 UDP,这可能在某些路由而不是桥接 Wi-Fi 和以太网的家庭网络中效果更好。
历史上,曾有 PkgD 和 multipkg,但它们已不再维护。
读写缓存
为了在多台计算机之间共享软件包,只需使用任何基于网络的挂载协议共享 /var/cache/pacman/。本节将介绍如何使用 SSHFS 在同一本地网络的多台计算机之间共享软件包缓存以及相关的库目录。请记住,网络共享缓存的性能可能会因文件系统选择等因素而异。
首先,安装任何支持网络的文件系统包:sshfs、curlftpfs、samba 或 nfs-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 软件包缓存
使用 Syncthing 或 Resilio 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
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 下载软件包。