为什么以前的Debian软件包版本在软件包库中消失了?(与版本控制的系统配置高度相关)


37

场景:在基于Puppet,Chef等的版本控制的系统配置中,需要重现特定的系统状态。通过显式指定系统软件包版本来完成此操作。

最近,我们遇到了一个问题,即Debian存储库中缺少某些软件包版本。一个示例:版本2.7.5-1 + deb9u1中需要“补丁程序”软件包,但仅提供2.7.5-1 + deb9u2。另一个甚至更为严重的示例:由于安装了相关的内核,因此需要“ linux-headers-4.9.0-9-common”,并且只有“ linux-headers-4.9.0-11-common”可用。

这使得不可能再现系统的特定状态。

以上软件包只是示例(我实际上遇到过)。我对理解和解决一般问题感兴趣。

这些更新,“消失”的软件包和软件包版本背后的想法是什么?

在哪里可以获得Debian软件包的先前版本(不是真正的旧版本,而是几周之久的版本)?以一般方式应该可以自动执行安装过程。


1
某种程度上取决于用于配置存储库的软件。Reprepro,iirc,仅允许每个软件包使用单个版本
muru

2
stable至少在下一个版本发布之前保持一致。稳定更新,测试和不稳定仅包含任何给定软件包的最新版本。除此之外,您还必须查看archive.debian.org(或SK的回答中提到的snapshot.debian.org
cas

5
是否有一个原因导致您没有运行自己的存储库,就可以控制替换策略和引脚版本(这将使将来的自动安装在本地成为优势)?
Eric Towers

2
新的linuxpkg名称是一个例外:通常,Debian稳定版的软件包使用相同的软件包名称,并且仅更改版本号。linux-image-amd64从不更改名称,始终取决于最新版本linux-image-4.9.0-*。新的linux-image-4.9.0-*pkg名称标记了向后移植某些错误修正所需的不兼容的内核ABI更改,并允许处理自定义构建的模块(dkms等)的必要重新编译。同样适用于linux-headers-*
ignis

1
这些更新背后的想法是什么? apt-get changelog packagename
ignis

Answers:


63

能够复制特定设置(精确到确切的版本)是您的要求,而不是Debian的要求。

Debian在任何给定的发行版中仅支持每个二进制软件包的单个版本。与此相对的是,要格外小心,以确保任何给定发行版中的软件包更新都不会引入回归,并且在无法做到这一点时,请记录该事实。保留给定程序包的多个版本只会增加支持负担和测试要求:例如,程序包维护者必须针对他们使用的库的所有可用版本而不是当前受支持的版本来测试更新的程序包...软件包仅在确实必要时才在稳定版本中更新,修复严重的错误(包括安全性问题)。在内核的情况下,这有时意味着内核ABI更改,并且软件包名称也随之更改(以强制重建从属软件包)。还有,你可以拉,而不是硬编码的ABI(元套餐linux-image-amd64linux-headers-amd64等等)。

但是,针对您的情况有一种解决方法:每个已发布的源代码和二进制程序包都存档在snapshot.debian.org上。创建版本设置时,您可以选择相应的快照(例如2019年9月的快照之一)并将其用作存储库URL:

deb https://snapshot.debian.org/archive/debian/20190930T084755Z/ buster main

如果最终依赖于此,请使用某种类型的缓存镜像,例如Apt-Cacher NG。这不仅会减少快照服务器上的负载,还将确保您拥有所需所有软件包的本地副本。

(关于软件包的情况要稍微复杂一点,由于许可依赖关系,档案确实在给定发行版中包含某些版本的多个源软件包。但这在这里并不重要。严格来说,Debian确实提供了某些版本的多个版本。支持的发行版中的二进制文件:当前点发行版中的当前版本,以及安全性存储库和更新存储库中的所有更新;后者在下一个点发行版中被合并。只要您每次进行点发布时都更新快照,就可以使用快照。)


请注意,有时某些早期版本可用- apt-cache madison packagename将显示apt可通过配置的存储库查看的所有版本。
ivanivan

5
(请不要通过不必要地使用快照/存档服务器而不是附近的镜像来超载快照/存档服务器。因此,将普通镜像以比快照更高的优先级留在sources.list中,这样可以从中获取可用的软件包。)
Peter Cordes

3
只是为了验证我是否理解正确:实际上,这与安装软件包时指定的版本无关(因为可能无法使用较早的版本),而是与我正在使用的软件包存储库的状态有关。因此,如果我想要一个“新鲜”的Debian 9.8,我需要那种状态的软件包存储库(例如,快照或我自己创建的存储库),然后,当然,正确的linux-header- *软件包仍然可用。如果要迁移到Debian 9.9,我将软件包存储库设置为关联状态并运行apt-get dist-upgrade。这个对吗?
弗洛

2
对,那是正确的。
Stephen Kitt

3
@Flo注意,该发行版(例如debian X.9或X.8)仅用于可下载的iso,因此新安装不会下载大量软件包。在存储库中,任何发行版之间都没有区别,您始终会获得最新的软件包。
布赖恩

15

不要依赖不受您控制的服务器来重现特定的系统状态。即使以为Debian服务器非常可靠,您也不知道将来会发生什么。这与您可能使用的其他存储库特别相关。

您应该维护自己的镜像以获得可重现的系统状态。这样,您甚至可以为普通系统提供生产状态,为新配置提供多个测试状态。

仓库管理工具可以适当地创建仓库镜像。您可以选择要镜像的包,在特定的时间点创建存储库内容的快照,并将多个镜像或快照组合到一个存储库中。这样,您就可以完全重现系统状态。


8

尽管斯蒂芬·基特(Stephen Kitt)的回答肯定是一种可能的解决方案,但我认为对您自己保留所需软件包的副本会更安全。

记录系统设置时,请一定要保存的副本.deb-files从/var/cache/apt/archives/。您也可以使用apt-get download

恢复系统设置时,必须非常严格,apt以免触发潜在的危险自动操作。

dpkg直接使用它可能会更容易直接准确地安装您想要的东西。


6
IMO的更好方法是使用本地APT缓存。那避免了您的第三段中的问题,也避免了收获/var/cache/apt
Stephen Kitt

3
这有两种变体-一种是使用apt-mirror之类的东西来克隆整个仓库,另一种是仅下载特定的软件包和依赖项。然后对目录进行快照-例如使用btrfs作为pkgs-20190501,然后将快照目录作为回购发布。在构建时,就把版本控制回购网址(例如http://debmirror/pkgs-20190501/...)在sources.list文件,然后运行apt-get更新,易于得到安装$ PKGS等
贝恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.