rpm:同时安装/升级多个软件包时,依赖关系不会失败

时间:2016-06-09 10:00:07

标签: rpm

我有一个rpm的问题让我把头发弄掉了。

我们已经创建了多个用于部署到内部服务器上的软件包 - 其中一些是在不同(但相关)系统中使用的基础软件包(共享库),其中一些是特定于应用程序的库。

为简化起见,包和要求如下:

SharedLib-ver.x
ApplicationLib-ver.x  [Requires SharedLib-ver.x]
UserInterface-ver.x   [Requires ApplicationLib-ver.x]

要安装,sysadmin一直在使用原子命令

rpm -Uvh SharedLib.rpm ApplicationLib.rpm UserInterface.rpm

只要所有软件包都正确安装,它就能正常工作,但如果任何软件包安装失败,它都无法正常工作。

我们已经在测试条件下验证了rpm是否正确建立了依赖关系,并且正在尝试以正确的顺序安装/升级软件包,无论它们包含在原子rpm -Uvh命令中的顺序如何。< / p>

当其中一个软件包在%pre阶段失败时会出现特定问题(即%pre具有非零退出状态)

如果使用如上所示的原子安装/升级命令进行安装,则会正确报告

error: %pre(SharedLib-ver.x.noarch) scriptlet failed, exit status 1

,它会继续升级/安装相关软件包。

但是,如果包顺序升级/安装,即:

rpm -Uvh SharedLib.rpm; 
rpm -Uvh ApplicationLib.rpm; 
rpm -Uvh UserInterface.rpm;

它无法使用与上面相同的错误安装SharedLib,然后正确拒绝安装剩余的包,因为尚未满足依赖关系。这是我期望的行为。

对于它的价值,如果%pretrans scriptlet以非零退出状态终止,也会发生同样的事情(根据定义,我认为pretrans应该在之前完成 > rpm事务开始!)。我已经看到它建议显式依赖/版本检查可以包含在%pretrans部分中,但这对我来说完全是错误的,并且似乎首先打败了使用包管理器的全部原因!

rpm版本为4.8.0,我们已在CentO和RedHat服务器上验证了此行为。

首先,实际上是否可以在显示的单个原子命令中安装多个包,同时尊重这些包提供的依赖关系?

如果是这样,我怎么能实现这个目标?

我确定原因和/或解决方案是微不足道的,但我已经围绕这个问题转了一圈,似乎无法找到解决方案。

修改

继Matt Schuchard的评论(谢谢)之后,我尝试了“yum install&#39;方法

删除脚本输出和其他无关信息,运行:

yum install ApplicationLib-ver.x.noarch.rpm UserInterface-ver.x.noarch.rpm SharedLib-ver.x.noarch.rpm

给出

Examining UserInterface-ver.x.noarch.rpm: UserInterface-ver.x.noarch
Marking UserInterface-ver.x.noarch.rpm to be installed
Examining SharedLib-ver.x.noarch.rpm: SharedLib-ver.x.noarch
Marking SharedLib-ver.x.noarch.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package UserInterface.noarch 0:ver.x will be installed
---> Package ApplicationLib.noarch 0:ver.x will be installed
---> Package SharedLib.noarch 0:ver.x will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================================================================================================
 Package                                  Arch                    Version                     Repository                                                Size
=============================================================================================================================================================
Installing:
 UserInterface                            noarch                     x                     /UserInterface-ver.x.noarch                                 203 k
 ApplicationLib                           noarch                     x                     /ApplicationLib-ver.x.noarch                                2.0 M
 SharedLib                                noarch                     x                     /SharedLib-ver.x.noarch                                      19 M

Transaction Summary
=============================================================================================================================================================
Install       3 Package(s)

Total size: 21 M
Installed size: 21 M
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction

error: %pretrans(SharedLib-ver.x.noarch) scriptlet failed, exit status 1
Error in PRETRANS scriptlet in rpm package SharedLib-ver.x.noarch

  Verifying  : ApplicationLib-ver.x.noarch                                                                                                   1/3
  Verifying  : UserInterface-ver.x.noarch                                                                                                    2/3
  Verifying  : SharedLib-ver.x.noarch                                                                                                        3/3

Installed:
  UserInterface.noarch 0:ver.x                                        ApplicationLib.noarch 0:ver.x

Failed:
  SharedLib.noarch 0:ver.x

Complete!

所以yum正在获得基本依赖关系并正确安装顺序(大概是从rpm开始)但是在执行了&y; install&lt; packages&gt;&#39;之后,rpm -qa显示了安装的ApplicationLib和UserInterface,但是SharedLib没有安装,这与我用rpm直接安装时遇到的问题完全相同!

为了绝对100%确定,我已经卸载了所有内容,然后尝试(依次)进行rpm安装,rpm升级和yum安装ApplicationLib-ver.x.noarch以及每个如果由于SharedLib不存在,它会因预期而失败。

编辑(2)

谢谢,杰夫,您的额外回复。

我100%试图避免任何&#34;幻想&#34;在%pre测试中编写脚本 - 从根本上感觉就像它试图强制行为(如果一切设置正确),应该通过rpm本质地处理。

我的第一种方法是(完全按照你的建议) - 添加窄(特定于版本的)依赖项

即。在ApplicationLib中

Requires: SharedLib = %{version}

并在UserInterface中,

Requires: ApplicationLib = %{version}

%{version}的扩展在所有情况下都相同

如果软件包是按顺序安装的,那么这种方法很有效,但是让我感到困惑的是为什么rpm / yum会跳过SharedLib,但是如果所有三个软件包都安装在一个命令中,它仍会继续安装依赖它的软件包。

如果我解释这些软件包构成后端Web应用程序并更新某些部分但最多不是其他风险,可能会使事情更加清晰,从而导致用户体验不理想,最糟糕的是数据损坏。为了最大限度地降低这种风险,SharedLib完成了许多预安装测试,以确保系统安全并准备接受更新(例如,Web服务器处于安全状态以继续安装 - 存在和停止)和如果可以安全继续,其他内务处理任务的数量(例如,停止也是应用程序的一部分的自定义服务,版本化日志轮换等)。

如果服务器(例如)存在但正在运行和提供页面,则继续升级的任何步骤都是不安全的,因此sharedLib rpm退出并向sysadmin解释了安全继续所需的内容。显然,如果安装了依赖库而不管基本依赖关系中的失败,这是一种不合需要的情况。

好的,所以这几乎是针对仓促手指的保险政策(安装说明已经明确表示服务器不能运行),但这似乎不合理(YMMV! )

当然,我可以强制要求rpms没有安装在单行yum / rpm命令中,但这只是感觉像rpm应该能够预测的那样,只要我能正确设置所有内容,除此之外没有保证无论如何都会遵守任何此类指示。

1 个答案:

答案 0 :(得分:0)

据推测,您希望使用rpm的3个软件包的全有或全无原子升级行为,并尝试使用脚本化测试来强制执行该操作。

由于上下文,使用%pretrans的脚本永远不会成功:当运行%pretrans脚本时,当前事务集中没有安装任何内容;因此,您无法编写测试成功安装的脚本。

您似乎期望先决条件中的%pre故障将导致依赖包也会失败。这不是%pre的工作原理:%pre的失败将导致跳过该包(带有警告)。这实际上就是你所看到的rpm / yum,主要区别在于yum似乎阻止来自rpm的警告信息。

(除了) 如果先决条件无法安装,您可能可以添加前提条件的显式%预测试以跳过依赖包的安装,但仍然不是全有或全无原子行为,因为rpm不会撤消成功安装 已经完成了。

同时脚本%预测试不是正确的方法。您需要关注应用程序的故障模式。据推测,当您在正在运行的应用程序下升级库时,您担心UI失败。首先,正在运行的应用程序具有共享库的引用计数,并且即使通过包升级删除库也将继续运行。

如果您的应用程序调用在升级之后/期间某种程度上不兼容的可执行文件,则需要在应用程序中处理,而不是在打包中处理。

否则,添加narrow(即使用特定版本和发行版)依赖关系将确保升级事务中包含全部或全部包。 RPM(没有特殊的病态,如断电和/或无磁盘空间,或有缺陷的包装,或有缺陷的rpm)将成功安装。

那你担心什么类型的失败?可能有解决方案......