假设我有两台服务器,一台测试服务器和一台生产服务器。首先我apt-get upgrade
在测试服务器上做。然后,经过两周后的广泛测试,我希望生产服务器在打包时处于完全相同的状态。是否有可能以某种方式apt-get upgrade
达到某种状态而不是总是最新的?
答案1
OP 没有告诉服务器上正在使用什么发行版。因此,默认情况下我会认为它是 Debian,因为它apt
是由 Debian “发明”的,并且所需的服务仅适用于 Debian。
虽然对于单个包来说,强制使用该版本=
是很好且方便的,尤其是恢复它(如果仍然可用),但对于一组包来说,由于未满足的依赖关系,它很快就会成为一场噩梦。
可以做的是使用从以下构建的存储库 URLhttps://snapshot.debian.org/。该服务保存自 2009 年以来制作的所有软件包版本的副本,并且自2010年起正式推出:
快照服务还使管理员能够通过使用给定日期的存档视图来安装一组可预测的、经过测试的软件包。此功能允许管理员在临时环境中测试升级路径,然后在生产环境中重复该过程,以确保他们正在执行完全经过测试的升级。由于快照涵盖了整个存档和所有套件,因此这可以应用于希望以受控方式跟踪测试的环境,以及希望在推出之前全面审核所有稳定更新的具有更严格变更控制的环境。
第一个要求是要有 https 传输可用:(apt-get install apt-transport-https
抱歉,它可能会拉取一些可能已同时升级的依赖项)。
假设您想要两周前(即 2018-12-07)的包裹。按照网站上的说明,您可以浏览:
https://snapshot.debian.org/archive/debian/20181207/
这将指向一个更精细的 URL,可能是 UTC 时间。然后,您可以“通过时间”导航到那里以满足您的需求,可能需要一些“下一个改变”。
一旦时间合适,只需在 resources.list 文件中使用它作为基本 deb URL:
例如,/etc/apt/sources.d/snapshot-20181207.list
例如内容:
deb https://snapshot.debian.org/archive/debian/20181207T090635Z/ stretch main
由于快照是过去的,使用较旧的软件包版本,如果默认选择保留为 apt,它无论如何都会使用较新的版本,并始终忽略那里可用的版本。 apt 的标志-t
对此没有用,因为它仍然是相同的版本。所以apt 的偏好必须进行调整。.pref
在以 结尾的文件中有一个条目/etc/apt/preferences.d/
,例如/etc/apt/preferences.d/00-snapshot-20181207.list
(此处首选项的顺序可能很重要):
Package: *
Pin: origin "snapshot.debian.org"
Pin-Priority: 900
这会将来自 snapshot.debian.org 的所有软件包的优先级设置为 900,高于默认(和较新)软件包的 500,使其优先于其他存储库,包括安全性,这是短时间内更新的主要来源。由于它的优先级仍然低于添加时的优先级-t stable
,因此可以比较升级到 2018-12-07 的状态或到今天的状态之间的差异。
使用 1001 甚至会允许(并强制)降级软件包,这可能是危险的(例如但不限于:当由于软件包更改而将文件从一个软件包移动到另一个软件包时,该文件可能会在降级时丢失),但是还是有用的。
如果apt-get update
抱怨发布文件过期(如网站上所述,它将在 12 天后发生),您必须使用apt-get -o Acquire::Check-Valid-Until=false update
或(自 Debian 9 起)[check-valid-until=no]
在源条目中添加 a 来禁用检查。这就是使用 https 传输的原因:无论如何都有其他安全层。因此将内容替换snapshot-20181207.list
为:
deb [check-valid-until=no] https://snapshot.debian.org/archive/debian/20181207T090635Z/ stretch main
更新:安全性位于单独的快照存档中:Debian 安全。因此,还应该添加此条目(或另一日期的条目):
deb [check-valid-until=no] https://snapshot.debian.org/archive/debian-security/20181206T212649Z/ stretch/updates main
现在,按照惯例apt-get update
,apt-get upgrade
应该将所有软件包升级到 2018-12-07 版本。
答案2
是的,这是可能的。看https://askubuntu.com/questions/92019/how-to-install-specific-ubuntu-packages-with-exact-version
简而言之,如果您想升级到版本 2.5,您可以运行foo
而不是运行apt upgrade foo
apt upgrade foo=2.5
这意味着您需要获取测试服务器上已安装版本的转储,然后使用该信息使生产服务器达到相同的状态。