使用apt安装任意版本软件包的推荐方法是什么?

问题:

我需要一种方法来在我的Debian系统上安装某些软件包的固定版本。 snapshot.debian.org似乎提供了一种方法来做到这一点,但是即使在添加快照到我的apt-sources之后,我也无法apt-get install在该快照档案中apt-get install某些特定版本的软件包。

问题:

什么是从Debian快照档案中安装特定软件包版本的官方或“正确”方式?

背景和我试过的东西:

作为我们的例子,我们使用Debian8 Jessie和3.16.x内核二进制小版本。 截至撰写本文时,Jessie发布的内核是3.16.43-2 + deb8u5。 假设我想安装3.16.43-2 + deb8u4。

我开始search我想要的版本的debian快照档案( http://snapshot.debian.org/binary/linux-image-3.16.0-4-amd64/ ),并点击内核的确切版本,我寻找,这让我http://snapshot.debian.org/package/linux/3.16.43-2%2Bdeb8u4/#linux-image-3.16.0-4-amd64_3.16.43-2:2b: deb8u4

从那里,我可以看到这个软件包在2017-09-20 22:12:21出现在debian-security中,而在2017-10-08 16:31:52出现在debian上。 我决定使用前者,并解决debian安全快照20170920T221221Z 。

按照snapshot.debian.org首页上的说明,我将以下内容添加到我的/etc/apt/sources.list中:

 deb http://snapshot.debian.org/archive/debian-security/20170920T221221Z/ jessie/updates main deb src http://snapshot.debian.org/archive/debian-security/20170920T221221Z/ jessie/updates main 

然后我运行apt-get -o Acquire::Check-Valid-Until=false update并看到更新(似乎)成功完成。

我想这会让我现在安装所需的内核版本,但只知道两个安装候选人,3.16.43-2 + deb8u2和3.16.43-2 + deb8u5。 没有+ deb8u4的标志:

 # apt-cache madison linux-image-3.16.0-4-amd64 linux-image-3.16.0-4-amd64 | 3.16.43-2+deb8u5 | http://security.debian.org/ jessie/updates/main amd64 Packages linux-image-3.16.0-4-amd64 | 3.16.43-2+deb8u5 | http://snapshot.debian.org/archive/debian-security/20170920T221221Z/ jessie/updates/main amd64 Packages linux-image-3.16.0-4-amd64 | 3.16.43-2+deb8u2 | http://cloudfront.debian.net/debian/ jessie/main amd64 Packages linux-image-3.16.0-4-amd64 | 3.16.7-ckt25-2 | http://cloudfront.debian.net/debian/ jessie-updates/main amd64 Packages linux | 3.16.39-1 | http://cloudfront.debian.net/debian/ jessie-backports/main Sources # apt-cache policy linux-image-3.16.0-4-amd64 linux-image-3.16.0-4-amd64: Installed: 3.16.43-2+deb8u5 Candidate: 3.16.43-2+deb8u5 Version table: 3.16.43-2+deb8u5 0 500 http://security.debian.org/ jessie/updates/main amd64 Packages 500 http://snapshot.debian.org/archive/debian-security/20170920T221221Z/ jessie/updates/main amd64 Packages *** 3.16.43-2+deb8u2 0 500 http://cloudfront.debian.net/debian/ jessie/main amd64 Packages 100 /var/lib/dpkg/status 3.16.7-ckt25-2 0 500 http://cloudfront.debian.net/debian/ jessie-updates/main amd64 Packages 

此外,如果我尝试指定并安装我想要的版本,则会返回“未find”:

 # apt-get install linux-image-3.16.0-4-amd64=3.16.43-2+deb8u4 Reading package lists... Done Building dependency tree Reading state information... Done E: Version '3.16.43-2+deb8u4' for 'linux-image-3.16.0-4-amd64' was not found 

我设法通过下载.deb二进制文件和dpkg -i安装它,但我宁愿使用apt而不是curl'ing .debs并安装它们。 任何人都可以解释我需要做什么才能够apt-get install一个特定的包,或者至less解释为什么这不工作,我希望它的方式?

这不是确切的科学,但这里有一个可能的解释,为什么它不适用于这个特定的情况(通常是有效的,当你没有跟随一个目标变化太快)。

给定的存储库通常只引用Packages文件中的一个包的一个版本,例如, 这个 。 这不是一个技术上的义务,例如deb https://dl.winehq.org/wine-builds/debian/ jessie main在其Packages文件中包含了同一个包的多个版本,所有这些都可以通过apt-get来获取,使用=就像你一样但是,Debian(TM)不会在同一个Packages文件中保留对多个版本的引用。

如果您查看您要查找的包的实际目录,则可以看到有两个版本可用:

Linux的图像3.16.0-4-amd64_3.16.43-2 + deb8u4_amd64.deb
Linux的图像3.16.0-4-amd64_3.16.43-2 + deb8u5_amd64.deb

当deb8u5出现时,先前对deb8u4的引用消失了。 deb8u4 .deb可能仍然被其他版本库引用,或者根本没有经过一些“垃圾回收”。 点击快照导航中的“prev change”只会导致没有deb8u4和deb8u5的deb8u3。 这意味着deb8u4和deb8u5之间的变化发生得太快了,因为deb8u4的Packages文件可以下载或者用于snapshot.debian.org在deb8u5replace之前保存这个中间包文件。 在debian-security中的这个引用(以及相应的校验和和签名的发行文件)将会丢失。

只是再次尝试与debian(而不是debian安全):

Linux的图像3.16.0-4-amd64_3.16.43-2 + deb8u4_amd64.deb

与相应的Packages.xz文件。 这个只有deb8u2的条目…只会保留这个。 新版本应该来自debian-security,直到8.10发布,所以即使它们出现在池中,也只是因为snapshot.debian.org使所有的东西都出现在同一个地方。

对不起,对于这个特定的软件包版本,我没有看到下载deb8u4的方法。 即使可以从链接下载并且dpkg -i可以安装它,也不可能validation下载的内容,所以应该避免。

注意:你的方法是正确的。 你通常可以通过固定特定的快照来完成它,允许apt-get自动select它们(不需要= ),并避免以后升级。 这里解释了: https : //wiki.debian.org/AptPreferences 。 持有它们也可以( dpkg --set-selectionsapt-mark hold )来避免升级。