如何安装具体版本的特定Ubuntu软件包?

我想设置一个新的虚拟机,其中包含一些指定的包(名称和版本)。

例如,版本2.2.20-1ubuntu1 apache2具有所有依赖项。 即使服务器上有此软件包的新版本,也应安装此软件包。

该解决方案必须与多个(n)“设置”一起工作/扩展。 另一个虚拟机可能需要较旧版本的apache2。

我目前知道安装确切软件包的一些可能性,但是不能扩展那么好:

  1. 手动将所有必需的*.deb复制到每个虚拟机并输入: dpkg -i … – >可以工作,但它非常容易出错。 (手册脚本等)
  2. 为每个设置创建并使用新的Ubuntu存储库。 – >不起作用,因为我需要n个存储库。
  3. 设置机器一次并复制VM /创建快照。 – >不起作用,因为我需要存储n个VM。

我的问题可以标记为补丁管理,但我不想将我的软件包更新到当前版本。 我的目标是安装旧包。

您可以使用apt-get来安装特定版本的软件包,只要它在知道的存档中即可。 从apt-get页:

可以通过使用等号和要选择的包的版本来跟随包名称来选择特定版本的包进行安装。 这将导致找到并选择安装该版本。 或者,可以通过使用斜杠以及分发版本或归档名称(稳定,冻结,不稳定)来跟随包名称来选择特定分布。

例如,你可以这样做:

 sudo apt-get install apache2=2.2.20-1ubuntu1 

请注意,在这种情况下,您可能需要自己进行一些依赖项解析,但如果有任何问题,apt-get会告诉您导致它们的原因。 在我的11.10系统上,我需要执行以下操作才能使其工作:

 sudo apt-get install apache2=2.2.20-1ubuntu1 \ apache2.2-common=2.2.20-1ubuntu1 \ apache2.2-bin=2.2.20-1ubuntu1 \ apache2-mpm-worker=2.2.20-1ubuntu1 

要检查哪些版本可用,您可以通过以下方式检查:

 sudo apt-cache madison ^apache2 

如果不起作用,请考虑在更新包列表之前运行sudo apt-get update

然后复制版本或使用以下语法:

 sudo apt-get install apache2=2.2\* 

要检查您安装的版本,请运行:

 dpkg -l 'apache2*' | grep ^i 

我将在apt系列中使用其他方便的版本控制命令扩展早期的答案。 要查看哪些版本可用,请运行apt-cache policy

 # apt-cache policy apache2 apache2: Installed: (none) Candidate: 2.4.7-1ubuntu4.5 Version table: 2.4.10-1ubuntu1.1~ubuntu14.04.1 0 100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages 2.4.7-1ubuntu4.5 0 500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages 2.4.7-1ubuntu4 0 500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages 

然后,如其他地方所述,使用apt-get安装特定版本:

 # apt-get install apache2=2.4.7-1ubuntu4.5 ... 

您现在可以通过再次运行apt-cache policy来查看已安装的版本:

 # apt-cache policy apache2 apache2: Installed: 2.4.7-1ubuntu4.5 Candidate: 2.4.7-1ubuntu4.5 Version table: 2.4.10-1ubuntu1.1~ubuntu14.04.1 0 100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages *** 2.4.7-1ubuntu4.5 0 500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages 100 /var/lib/dpkg/status 2.4.7-1ubuntu4 0 500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages 

如果您不希望在更新时安装较新版本,请使用apt-mark固定包:

 # apt-mark hold apache2 apache2 set on hold. 

假设将新版本的apache2添加到包索引中,并且您的计算机与apt-get update同步。 下次运行apt-get upgrade时你会看到这个:

 # apt-get upgrade Reading package lists... Done Building dependency tree Reading state information... Done Calculating upgrade... Done The following packages have been kept back: apache2 0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded. 

实际上,这是不可能的,因为旧版本不会保存在存档中,所以除非你有一个旧版本的副本放在某处,否则你无法安装它。 您应该问自己为什么要首先安装旧版本。 在稳定版本上,发布新版本的主要原因是纠正安全漏洞,您不希望运行易受攻击的服务器吗?

正如psusi解释的那样,旧版本不会保存在ubuntu存储库中,但显然你仍然可以在启动板上找到它们。 所以,你去(用你的ubuntu版本和架构替换trusty和amd64):

https://launchpad.net/ubuntu/trusty/amd64/apache2

并选择您想要的版本。 然后你将deb作为文件下载并安装:

 dpkg -i apache2_2.4.7-1ubuntu4.20_amd64.deb 

再次,将文件名替换为您的文件。 如果你不得不降级很多套餐,这会变得乏味,但如果你绝望的话,它总比没有好。