背景是一个错误,Ubuntu 在其存档镜像上每 30 分钟更新一次软件包列表时间戳,这会强制[apt-get|aptitude] update
命令下载软件包列表,尽管它们没有改变:
建议的解决方法是touch
在运行之前先检查受影响的索引文件apt-get update
。这样可以使它们的时间戳保持最新,从而避免重新下载它们。这样可以将处理速度提高几分钟(2-3 秒 vs. 各种测试中的 2-6 分钟)。尽管运行的是本地apt-cache-ng
代理。
我们正在进行此测试(大部分)并为我们的 AWS 基础设施部署(某种程度上)基于 Ubuntu 的图像,其中apt-get update
运行了几次。3-6 分钟与 3-20 秒对我们的迭代时间有很大影响。
apt 不依赖文件大小或哈希来确定文件是否已更改,这对我来说似乎很奇怪。时间戳很容易修改,并且似乎很难以此为基础。
答案1
当我第一次测试触摸黑客时,我很惊讶 apt-get 使用本地文件 mod 时间来通知 http 服务器要下载什么 - 但显然情况如此(否则黑客就不会起作用)。
下载的 Release 文件包含可靠的日期,并且这些文件经过加密签名,因此非常值得信赖,但哈希值不用于确定要下载哪些包文件。
现在,时间戳方法已用于软件包文件,因此镜像站点无需做任何特殊处理。Debian 项目负责设计。镜像所有者可以保持 Ubuntu 与 Debian 相同,保持原始状态,从而易于管理。
据我所知,这种设计通常工作正常。这只是一个错误,应该修复就我而言,但这个错误在 Canonical 私有代码中,所以像我这样的局外人无法帮助修补它。我希望他们能尽快这样做,因为我们正在滥用那些运行 Ubuntu 镜像的人的热情好客,此外还给一些必须按 GB 支付带宽费用的 Ubuntu 用户带来了不必要的开支。
有一种 http 协议机制,可以使用 etag 来表示已提供的项目,但它不用于 apt-get。这样的标签可以包含来自 Release 文件的哈希值。
正是由于 Ubuntu 版本中包含的大量软件包才使得这个错误如此严重。
从签名的(因此经过校验的)版本中,有这些文件的哈希值,这些文件中还有软件包版本的哈希值,以及文件的校验值。由于软件包文件包含版本号,并且它们不会更改,因此该错误不会导致软件包的冗余升级。