我家里有多台 Ubuntu 机器,网络连接速度很慢,有时需要同时更新多台机器(尤其是在发布新的 Ubuntu 版本时)。
有没有办法让我的其中一台机器只需要下载软件包,而其他机器可以使用第一台机器来获取 debs?这是否需要设置我自己的本地镜像?还是代理服务器?或者可以让它更简单?
答案1
我研究了许多解决方案,一些 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 install squid-deb-proxy-client
选修的:为了获得最大效率,您应该将一台机器设置为自动下载更新,这样当您的其他机器需要更新时,它就已经在缓存中了。您可以通过转到系统->管理->更新管理器,然后单击“设置...”按钮,在更新选项卡中将其设置为自动下载所有更新。
缓存第三方源
默认情况下,缓存设置为仅缓存官方 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 将使用地址 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
接下来,您需要打开 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。您可以在 中找到 squid 缓存文件本身/var/cache/squid-deb-proxy
。
使用它
从那时起,网络上的所有机器都会在访问外部网络获取软件包之前检查缓存。如果有新的软件包可用,那么第一台机器将从网络下载它,之后对该软件包的后续请求将从服务器发送到客户端。
去做
我们仍然需要启用 apt,使其开箱即用,默认情况下仅使用网络上的广告缓存,这样您就无需安装客户端。我们还需要修复错误403 的 deb 不在镜像列表中。
答案2
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"; };
完毕- 现在,无论您使用什么源或拥有什么系统版本,服务器都会缓存软件包(例如,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
答案3
我更喜欢使用该实用程序设置本地镜像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 中将每个本地服务器指向该副本
答案4
在小型网络(例如家庭/小型办公室)中,我使用过 apt-cacher-ng,效果不错。我还没有检查最新版本,但我知道它需要仔细设置服务器和客户端,并且最适合仅从本地网络获取更新的客户端。
我尝试了上述基于 squid 的解决方案,但它需要应用一些解决方法和比我想要的更多的客户端配置,所以感觉不太好然而就像它可以在小型设置中取代 apt-cacher-ng。