软件包代理缓存
如果您想一遍又一遍地安装相同的 Arch 软件包 - 例如为了测试目的 - 如果您不必每次都从互联网获取软件包,那将会有所帮助。本文向您展示如何共享软件包,以便您可以大大缩短下载时间。请记住,您不应在不同的架构(即 i686 和 x86_64)之间共享,否则您会遇到问题。
只读缓存
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#编写单元文件。
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
。
只读缓存的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
/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 特定的工具可以自动发现网络上其他提供软件包缓存的计算机。尝试 pacredir、pacserve、pkgdistcacheAUR 或 paclanAUR。pkgdistcache 使用 Avahi 而不是纯 UDP,这在某些家庭网络中可能效果更好,这些网络在 Wi-Fi 和以太网之间路由而不是桥接。
历史上,有 PkgD 和 multipkg,但它们不再维护。
读写缓存
为了在多台计算机之间共享软件包,只需使用任何基于网络的挂载协议共享 /var/cache/pacman/
。本节介绍如何使用 SSHFS 在同一本地网络上的多台计算机之间共享软件包缓存以及相关的库目录。请记住,网络共享缓存可能会很慢,具体取决于文件系统选择以及其他因素。
首先,安装任何支持网络的的文件系统软件包:sshfs、curlftpfs、samba 或 nfs-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 安装
在运行 /arch/setup 之前,为您的代理添加变量。为此,请在控制台上运行
# export http_proxy='http://your_squid_machine_ip:3128/' # export ftp_proxy='ftp://your_squid_machine_ip:3128/'
现在只需使用 /arch/setup 正常安装系统,它应该使用您的代理。观看 squid 日志以验证这一点。
拦截本地请求
如果您希望本地计算机上的所有 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
单元。
Flexo 默认在端口 7878
上运行。在您的 /etc/pacman.d/mirrorlist
顶部输入 Server = http://myserver:7878/$repo/os/$arch
,以便 pacman 通过 Flexo 下载软件包。
使用同步程序同步 pacman 软件包缓存
使用 Syncthing 或 Resilio Sync 同步 pacman 缓存目录(即 /var/cache/pacman/pkg
)。
防止不必要的缓存清除
默认情况下,pacman -Sc
从缓存中删除与命令发出时未安装在计算机上的软件包相对应的软件包 tarball。由于 pacman 无法预测共享缓存的所有计算机上安装了哪些软件包,因此它最终会删除不应该删除的文件。
要清理缓存,以便仅删除过时的 tarball
/etc/pacman.conf
[options] CleanMethod = KeepCurrent