在 LAN 上缓存 apt 下载的最佳方法?

Ken*_*mon 154 networking

我家里有多台 Ubuntu 机器,互联网连接速度很慢,有时需要一次更新多台机器(尤其是在新的 Ubuntu 版本期间)。

有没有一种方法,只有我的一台机器需要下载包,而其他机器可以使用第一台机器来获取debs?它是否涉及设置我自己的本地镜像?还是代理服务器?或者可以简化吗?

Jor*_*tro 131

我对一系列解决方案进行了一些研究,一些 Ubuntu 开发人员提出了 10.04 及更高版本的代理配置(基于 Squid)。它被称为squid-deb-proxy。它只需要一台机器作为服务器。大型组织通常运行自己的完整镜像,但对于大多数人来说,按需镜像就足够了。

为什么是squid-deb-proxy?

  • 无需在客户端编辑文件。
  • 使用 zeroconf 以便客户端“零配置”
  • 使用现有的、可靠的代理解决方案,而不是编写新工具。
  • 易于为典型的 Linux 管理员设置。

服务器配置

在要充当服务器的机器上安装该工具:

sudo apt-get install squid-deb-proxy avahi-utils

现在启动服务位:

 sudo start squid-deb-proxy
Run Code Online (Sandbox Code Playgroud)

还有 avahi 位(如果你在 12.04+ 上就不需要这个):

 sudo start squid-deb-proxy-avahi
Run Code Online (Sandbox Code Playgroud)

这将安装代理服务器(默认情况下侦听端口 8000)和服务器通过 zeroconf 在您的网络上宣传自己所需的 avahi 工具。

客户端配置

在要使用缓存的每台计算机上(客户端和服务器本身,以便它也可以使用缓存),您需要安装客户端工具,让我们自动查找服务器,让他们单击此处:

通过软件中心安装

或通过命令行:

sudo apt-get install squid-deb-proxy-client
Run Code Online (Sandbox Code Playgroud)

可选:为了获得最大效率,您应该将一台机器设置为自动下载更新,以便当您的其他机器需要它时,它已经在缓存中。您可以通过转到系统->管理->更新管理器来执行此操作,然后单击“设置...”按钮,在更新选项卡中将其设置为自动下载所有更新。

替代文字

缓存第 3 方来源

默认情况下,缓存设置为仅缓存官方 Ubuntu 存储库。要添加更多内容,您需要将它们添加到位于 的源列表中/etc/squid-deb-proxy/mirror-dstdomain.acl。您可以在此处添加 ppa.launchpad.net 或您可能使用的其他服务。对此文件进行更改后,您必须运行sudo restart squid-deb-proxy以使更改生效。

手动配置

如果由于某种原因您不想使用 zeroconf(出于网络原因或其他原因),您可以通过编辑/etc/apt/apt.conf和添加以下节来手动设置客户端使用代理,(将 0.0.0.0 替换为服务器的 IP 地址):

 Acquire { 
   Retries "0"; 
   HTTP { Proxy "http://0.0.0.0:8000"; };
 };
Run Code Online (Sandbox Code Playgroud)

防火墙

如果您使用防火墙,avahi 在地址 224.0.0.0/4 上使用 5353 并且需要如下所示的规则:

# Specifically port 5353 which avahi uses
-A INPUT -i eth2 -d 224.0.0.0/4 --dport 5353 -j ACCEPT

# OR

# Wide open so all local broadcasting works
-A INPUT -i eth2 -d 224.0.0.0/4 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

接下来,您需要打开 TCP 端口 8000,以便通过代理进行实际通信。或多或少是这样的:

-A INPUT -i eth2 -p tcp -m tcp --dport 8000 -d 192.168.0.1 -s 192.168.0.0/24 --syn -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

这些规则只是为了帮助你。它们可能不会一对一地匹配您的设置。(即错误的接口、错误的私网IP地址等)

确认它有效

首先在服务器上拖尾日志,以便您可以查看它:tail -F /var/log/squid-deb-proxy/access.log然后在安装了客户端的任何机器上运行更新;日志应该开始滚动,条目如下:

1307310795.647     32 192.168.1.106 TCP_MISS/302 768 GET http://us.archive.ubuntu.com/ubuntu/dists/natty-proposed/universe/i18n/Translation-en.xz - DIRECT/141.210.26.10 text/html
1307310795.683     34 192.168.1.106 TCP_MISS/302 752 GET http://us.archive.ubuntu.com/ubuntu/dists/natty/main/i18n/Translation-en_US.lzma - DIRECT/141.210.26.10 text/html
1307310795.716     32 192.168.1.106 TCP_MISS/302 746 GET http://us.archive.ubuntu.com/ubuntu/dists/natty/main/i18n/Translation-en.lzma - DIRECT/141.210.26.10 text/html
1307310795.750     32 192.168.1.106 TCP_MISS/302 764 GET http://us.archive.ubuntu.com/ubuntu/dists/natty/multiverse/i18n/Translation-en_US.lzma - DIRECT/141.210.26.10 text/html
1307310795.784     32 192.168.1.106 TCP_MISS/302 758 GET http://us.archive.ubuntu.com/ubuntu/dists/natty/multiverse/i18n/Translation-en.lzma - DIRECT/141.210.26.10 text/html
1307310795.817     32 192.168.1.106 TCP_MISS/404 657 GET http://us.archive.ubuntu.com/dists/natty-proposed/multiverse/i18n/Translation-en_US.xz - DIRECT/141.210.26.10 text/html
Run Code Online (Sandbox Code Playgroud)

这意味着客户端看到缓存但没有缓存,这是意料之中的,因为它还没有缓存任何东西。每次后续运行都应显示为 TCP_HIT。您可以在 .squid 中找到鱿鱼缓存文件本身/var/cache/squid-deb-proxy

使用它

从那时起,您网络上的所有机器都会在访问外部网络以获取包之前检查缓存。如果有可用的新包,那么第一台机器将从网上下载它,之后对该包的后续请求将从服务器发送到客户端。

去做

我们仍然需要启用 apt 以在开箱即用的网络上使用广告缓存,默认情况下,您不需要安装客户端。我们还需要修复403的deb不在镜像列表中的bug


Pis*_*ing 38

apt-cacher-ng是我的答案 - 我在小型环境(大约 20 个客户端)中没有遇到任何问题,所以我想@MagicFab提到的问题在当前版本(安装在 Ubuntu 10.04 和 10.10 上)中已经解决。服务器不需要任何配置,您只需要指示您的客户端使用服务器作为他们的包管理器代理。

服务器通过安装包完成安装和配置apt-cacher-ng

客户端需要通过设置 APT 代理来配置 - 通过添加/etc/apt/apt.conf.d/01proxy包含此文件的文件(其中“your-apt-server”是您的服务器名称或 IP 地址):

Acquire::http { Proxy "http://your-apt-server:3142"; };
Run Code Online (Sandbox Code Playgroud)

完成- 现在,无论您使用什么来源或您拥有什么系统版本,这些包都将由服务器缓存(例如,9.10、10.04 和 11.04 客户端可以使用 10.04 服务器,而不会出现任何问题或冲突)。


如果您有在网络之间漫游的客户端笔记本电脑,它会变得更加复杂 - 我制作了一个脚本,根据网络地址设置正确的代理;该脚本是可执行的,并且在/etc/network/if-up.d/apt-proxy. 从 DHCP 服务器接收到 IPv4 地址后,脚本将为相应的网络设置正确的 apt-cacher 服务器:

#!/bin/sh

set -e
# Don't bother when lo is configured.
if [ "$IFACE" = lo ]; then
    exit 0
fi
# Only run from ifup.
if [ "$MODE" != start ]; then
    exit 0
fi
# currently only cares about IPv4
if [ "$ADDRFAM" != inet ] && [ "$ADDRFAM" != NetworkManager ]; then
    exit 0
fi
# only run for DHCP-assigned addresses
if [ "$DHCP4_IP_ADDRESS" = "" ]; then
    exit 0
fi

# we're matching on network *broadcast* address,
#  not the specific IP address we were assigned
case "$DHCP4_BROADCAST_ADDRESS" in
    10.3.141.255)
        PROXY='Acquire::http::Proxy "http://my-home-server:3142";';
        ;;
    192.168.154.255)
        PROXY='Acquire::http::Proxy "http://work-server.foo.bar.example.com:3142";';
        ;;
    # add as needed
    *)
        # unknown, no proxying
        PROXY=""
        ;;
esac

# set the proxy
FNAME="/etc/apt/apt.conf.d/01proxy"
echo -n "$PROXY">$FNAME

exit 0
Run Code Online (Sandbox Code Playgroud)

  • 一年后,我转向了 `squid-deb-proxy` 和 `squid-deb-proxy-client`: zeroconf 确实意味着客户端的零配置,这对于游牧用户非常有用 - 并且如果服务器没有不响应,客户端默认直接下载。 (12认同)

小智 6

最简单的解决方案之一是设置 apt-proxy。

在此处阅读 ubuntu 文档:https : //help.ubuntu.com/community/AptProxy


del*_*ter 6

我更喜欢使用该debmirror实用程序设置本地镜像。

这是一个示例咒语。

debmirror --progress --verbose --nosource --method=ftp --passive \
 --host=ftp.osuosl.org --root=pub/ubuntu \
 --dist=lucid,lucid-updates,lucid-security,lucid-backports \
 --section=main,restricted,universe,multiverse --arch=amd64 \
 /d2/ftp/mirror/ubuntu-lucid
Run Code Online (Sandbox Code Playgroud)

我大约每周运行一次,并将其用作建立一个或多个“补丁级别”的基础。例如...

 cd /d2/ftp/mirror/
 cp -al ubuntu-lucid ubuntu-lucid-20100908
Run Code Online (Sandbox Code Playgroud)

这会创建树的链接副本(使用几乎为零的磁盘空间),我可以将每个本地服务器指向 apt sources.list

  • 您应该查看 ubumirror,它是存档中的一个便利包,已经为您设置了所有内容。这是官方镜像使用的。 (5认同)