在LAN上缓存apt下载的最佳方法?
我家里有多台Ubuntu机器和一个相当慢的互联网连接,有时需要同时更新多台机器(特别是在新的Ubuntu版本中)。
有没有办法只有我的一台机器需要下载软件包,而其他机器可以使用第一台机器来获取debs? 它是否涉及设置我自己的本地镜像? 还是代理服务器? 或者它可以变得更简单?
我对一堆解决方案进行了一些研究,一些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工具。
客户端配置
在您想要使用缓存的每台计算机上(客户端和服务器本身也可以使用缓存),您需要安装客户端工具,让我们自动查找服务器,让他们点击这里:
或通过命令行:
sudo apt-get install squid-deb-proxy-client
可选 :为了获得最大效率,您应该将一台计算机设置为自动下载更新,这样当您的其他计算机需要它时,它已经在缓存中。 您可以通过转到System-> Administration-> Update Manager,然后单击“Settings …”按钮,在Update选项卡中将其设置为自动下载所有更新。
缓存第三方来源
默认情况下,缓存设置为仅缓存官方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不在镜像列表中的错误。
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"; };
完成 – 现在无论您使用什么来源或您拥有什么系统版本,服务器都会缓存软件包(例如,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
最简单的解决方案之一是设置apt-proxy。
请阅读ubuntu文档: https : //help.ubuntu.com/community/AptProxy
我更喜欢使用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
在小型网络(例如家庭/小型办公室)中,我使用了apt-cacher-ng,效果很好。 我没有检查过最新版本,但我知道它需要仔细设置服务器和客户端,它最适合只能从本地网络获取更新的客户端。
我尝试了上面基于squid的解决方案,但它需要应用几个变通方法和更多的客户端配置,所以它感觉还不像它可以在小型设置中取代apt-cacher-ng。
apt-cacher
并不是最容易设置的,它无法在dist-upgrade中存活下来。
在服务器上安装squid-deb-proxy
,在squid-deb-proxy-client
上安装squid-deb-proxy
squid-deb-proxy-client
。 它使用zeroconf Avahi,因此无需配置。
如果你想要缓存不仅仅是debs,我不会打扰Squid。 Apache Traffic Server是下一个重要的事情。 http://trafficserver.readthedocs.org