it-swarm.cn

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

我家里有多台Ubuntu机器和一个相当慢的互联网连接,有时需要同时更新多台机器(特别是在新的Ubuntu版本中)。

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

152
Ken Simon

我对一堆解决方案进行了一些研究,一些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

和avahi位(如果你在12.04+,你不需要这个):

 Sudo start squid-deb-proxy-avahi

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

客户端配置

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

Install via the software center

或通过命令行:

Sudo apt-get install squid-deb-proxy-client

可选:为了获得最大效率,您应该将一台计算机设置为自动下载更新,这样当您的其他计算机需要它时,它已经在缓存中。您可以通过转到System-> Administration-> Update Manager,然后单击“Settings ...”按钮,在Update选项卡中将其设置为自动下载所有更新。

alt text

缓存第三方来源

默认情况下,缓存设置为仅缓存官方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"; };
 };

火墙

如果您使用的是防火墙,avahi将使用5353而不是地址224.0.0.0/4,并且需要一个如下所示的规则:

# 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

接下来,您需要打开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

这些规则只是为了帮助您。它们可能与您的设置不一致。 (即错误的接口,错误的专用网络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

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

使用它

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

去做

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

129
Jorge Castro

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

服务器是完全安装并通过安装apt-cacher-ng包进行配置。

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

Acquire::http { Proxy "http://your-apt-server:3142"; };

完成 - 现在服务器将缓存包,无论您使用什么来源或您拥有什么系统版本(例如,可以使用10.04服务器)由9.10,10.04和11.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
37
Piskvor

我更喜欢使用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

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

 cd /d2/ftp/mirror/
 cp -al ubuntu-lucid ubuntu-lucid-20100908

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

6
delimiter

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

在这里阅读ubuntu文档: https://help.ubuntu.com/community/AptProxy

6
sandaru1

在小型网络(例如家庭/小型办公室)中,我使用了apt-cacher-ng,效果很好。我没有检查过最新版本,但我知道它需要仔细设置服务器和客户端,它最适合只能从本地网络获取更新的客户端。

我尝试了上面基于squid的解决方案,但它需要应用几个变通方法和更多的客户端配置比我想要的,所以它感觉不到喜欢它可以取代apt-cacher-ng in small设置。

2
MagicFab

apt-cacher不是最容易设置的,它不会在dist-upgrade中存活。

在服务器上安装squid-deb-proxy,在客户端上安装squid-deb-proxy-client。它使用zeroconf Avahi,因此无需配置。

如果你想要缓存不仅仅是debs,我也不会打扰Squid。 Apache Traffic Server是下一个重要的事情。 http://trafficserver.readthedocs.org

1
caduceus