如何安装确切版本的特定Ubuntu软件包?


224

我想使用提供的某些指定软件包(名称和版本)设置新的虚拟机。

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

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

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

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

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

Answers:


227

您可以使用apt-get该软件包的特定版本安装,只要它在apt知道的存档中即可。从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

46
如何知道哪些版本可用?
Rodrigo Gurgel,2015年

12
@Rodrigo Gurgel,“ aptitude版本apache2”
user169015'1

3
@ user169015“版本存在” =“版本进行包装,Ubuntu和可用!apt
凯尔东街

嗨,凯尔,我没有收到您的评论,尽管是的,也可以使用apt安装软件包。我只是坚持使用
智能

6
@ user169015我认为您缺少Kyle评论的重点。请在下面查看psusi的答案。显然,Ubuntu APT存储库不会继续托管旧版本的软件包!因此,与运行时包管理器(pip,gem,maven等)不同,如果要重构旧的已知良好的配置,则不能依赖Ubuntu APT存储库。我自己感到惊讶和失望。也许Arch处理得更好?(askubuntu.com/questions/728439/...
藻类

66

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

sudo apt-cache madison ^apache2

如果不起作用,请考虑先运行sudo apt-get update再更新软件包列表。

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

sudo apt-get install apache2=2.2\*

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

dpkg -l 'apache2*' | grep ^i

5
非常感谢您指出的=2.2\*选项,以此来使用通配符选择任何可用的颠覆。那就是我想知道但不知道如何问的内容:)
aexl

3
使用列出版本时dpkg -l <packageName>,版本号有时会被截断。为避免这种情况,请使用COLUMNS=100 dpkg -l <packageName>
CJBS 2015年

在Yakkety上,第一个命令只是给我:N: Unable to locate package ^apache2
Jesse Glick

@JesseGlick sudo apt-get update首先运行。确保您已配置正确的Apt来源。
kenorb

1
N:$ sudo apt-get更新后无法找到软件包^ apache2,但sudo apt-get install apache2 = 2.2 *对我
有用

17

我将使用该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.

6

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


25
我需要它来为开发目的复制旧环境的精确副本。是否可以设置一个不删除旧软件包版本以访问所需软件包的镜像,或者我是否需要设置多个仅包含差异的存储库?
ayckoster 2012年

19
@psusi:并非完全公平的回答,可能有很多原因。以我为例,较新的版本实际上可能存在错误,请仔细检查是否需要较旧的版本。只是一个例子。
Cookie

2
@nomen,不,这是一个使用滚动发布模型的发行版。请务必确保在稳定版本中修复关键错误和安全漏洞时,它们不会引起回归,但是,如果确实发生了回归,请提交带有回归发布标记的错误报告,并将其修正或发布。背部。
psusi 2014年

5
@nomen,如果您想用单词来弥补自己的意思,您将很难与他人交流。对于世界上的其他所有人,这不是滚动发布,滚动发布是完全相反的,因此与稳定发布是互斥的。现在,考虑到这一点,该发行版附带的原始版本实际上保存在-release口袋中,而更新则放在-updates或-security口袋中,因此尽管您无法返回到以前的更新,可以返回到最初发布的版本。
psusi 2014年

5
@psusi:这是您的另一种。在所有机器上,Unison都必须始终为相同版本。但是在13.10上它是与12.04 LTS不同的版本。那么现在怎么办?当遇到这样的问题时,收到像您为什么要这样做这样的答案确实非常无益,而且浪费了每个人的时间。
Cookie Cookie

2

正如psusi解释的那样,旧版本没有保留在ubuntu存储库中,但是显然您仍然可以在启动板上找到它们。因此,您可以使用(用您的ubuntu版本和体系结构替换trusty和amd64):

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

并选择所需的版本。然后,将deb下载为文件并安装:

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

同样,将文件名替换为文件。如果您必须降级许多软件包,这将变得很乏味,但是如果您绝望,那总比没有好。

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.