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

ayc*_*ter 280 versions patch repository

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

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

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

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

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

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

fad*_*der 283

您可以使用apt-get安装包的特定版本,只要它位于 apt 知道的存档中。从apt-get联机帮助页:

可以通过在包名称后面加上等号和要选择的包版本来选择安装包的特定版本。这将导致定位并选择该版本进行安装。或者,可以通过在包名称后面加一个斜杠和发行版的版本或存档名称(稳定、冻结、不稳定)来选择特定的发行版。

例如,你可以这样做:

sudo apt-get install apache2=2.2.20-1ubuntu1
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,您可能需要自己进行一些依赖项解析,但是如果有任何问题,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
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式显示可用的软件包版本:

sudo apt list -a apache2
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 83

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

sudo apt-cache madison ^apache2
Run Code Online (Sandbox Code Playgroud)

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

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

sudo apt-get install apache2=2.2.\*
Run Code Online (Sandbox Code Playgroud)

要检查您安装了哪个版本,请运行:

dpkg -l 'apache2*' | grep ^i
Run Code Online (Sandbox Code Playgroud)

如果版本信息被截断,请尝试:

COLUMNS=100 dpkg -l <packageName>
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢您指出 `=2.2\*` 选项作为使用通配符选择任何可用 subversion 的一种方式。这就是我想知道但不知道如何问:) (9认同)
  • @BraianMellor apt-get madison 已过时,请使用 apt-get 策略代替,apt-get 策略 ^apache2 可以 (2认同)

小智 24

我将使用系列中的其他方便的版本控制命令来扩展早期的答案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
Run Code Online (Sandbox Code Playgroud)

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

# apt-get install apache2=2.4.7-1ubuntu4.5
...
Run Code Online (Sandbox Code Playgroud)

您现在可以通过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
Run Code Online (Sandbox Code Playgroud)

如果您不希望在更新时安装较新版本,请使用以下命令固定软件包apt-mark

# apt-mark hold apache2
apache2 set on hold.
Run Code Online (Sandbox Code Playgroud)

假设新版本的 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.
Run Code Online (Sandbox Code Playgroud)


sog*_*ger 7

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

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

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

dpkg -i apache2_2.4.7-1ubuntu4.20_amd64.deb
Run Code Online (Sandbox Code Playgroud)

再次,将文件名替换为您的文件。如果您必须降级许多软件包,这会变得乏味,但如果您绝望,这总比没有好。


psu*_*usi 5

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

  • 我需要这个来复制旧环境的精确副本以用于开发目的。是否可以设置一个不删除旧软件包版本的镜像来访问所需的软件包,或者我是否需要设置多个仅包含差异的存储库? (30认同)
  • @psusi:不完全是一个公平的回应,可能有很多原因。在我的情况下,新版本实际上可能有一个错误,并仔细检查是否需要旧版本。只是一个例子。 (22认同)
  • @psusi:这是另一个给你的。Unison 要求在所有机器上始终使用相同的版本。然而,在 13.10 上,它与 12.04 LTS 中的版本不同。那么现在怎么办?当遇到这样的问题时,收到诸如您为什么要这样做之类的答案对每个人来说都是非常无益和浪费时间的。 (8认同)
  • @nomen,如果您想为单词组成自己的含义,您将很难与他人交流。对于世界上的其他人来说,这不是滚动发布,滚动发布恰恰相反,因此与稳定发布相互排斥。现在我想起来,发行版附带的原始版本实际上保存在 -release 口袋中,更新进入 -updates 或 -security 口袋,所以虽然你不能回到以前的更新,你可以回到最初发布的版本。 (5认同)
  • @nomen,不,它是一个*不*使用滚动发布模型的发行版。非常小心地确保在稳定版本中修复关键错误和安全漏洞时,它们不会导致回归,但如果确实发生,则提交带有回归发布标记的错误报告,它将被修复或滚动背部。 (2认同)
  • @psusi:“滚动发布是一种始终获得新的、更新的软件,而不是保留在发布时存在的版本”——psusi。猜猜是什么 - 将 -1ubuntu 添加到版本会使软件包成为新版本。关于滚动发布的重要事情是它正在滚动。您不能通过官方方式返回。我对你对零物质的语义狡辩感到恼火。 (2认同)
  • @Cookie,您不能使用 =,因为存储库最多只包含两个版本:发布时存在的版本和最近的更新版本。如果您希望两个完全不同的版本使用相同的版本,则没有支持的方法,因此您必须自己从源代码构建它并处理可能由此产生的任何问题。 (2认同)
  • 降级的另一个原因是,有些人除了重写软件之外没有更好的事情可做,无论如何,现在雷鸟仍然没有系统托盘图标。所以我宁愿拥有一些我永远不会看到的漏洞,也不愿让雷鸟窗口一直打开。也就是说,如果我可以降级到 v 52。 (2认同)