【问题标题】:Strange behaviour of rpm command on error in %pre section of a rpm package在 rpm 包的 %pre 部分出错时 rpm 命令的奇怪行为
【发布时间】:2015-04-10 15:27:56
【问题描述】:

我有几个版本的一些包。最后一个在终止安装脚本的 %pre 部分有错误:

mypak-0.0.1-1.el6.noarch.rpm
mypak-0.0.1-2.el6.noarch.rpm
mypak-0.0.1-3.el6.noarch.rpm <-- bad package

我所有的包在prepostpreunpostun 部分都有调试输出。

我安装第一个包:

rpm -Uhv mypak-0.0.1-1.el6.noarch.rpm

输出(param 是传递给脚本部分的参数)是:

Preparing...                ########################################### [100%]
pre: 0.0.1-1.el6 ; param = 1
   1:mypak                  ########################################### [100%]
post: 0.0.1-1.el6 ; param = 1

然后我尝试更新我的包并(不小心)一次使用所有包启动 rpm 命令:

rpm -Uhv mypak-0.0.1-*                
warning: package mypak = 0.0.1-1.el6 was already added, replacing with mypak > 0.0.1-2.el6
warning: package mypak = 0.0.1-2.el6 was already added, replacing with mypak > 0.0.1-3.el6
Preparing...                ########################################### [100%]
pre: 0.0.1-3.el6 ; param = 2
!!!version 3 is bad!!!
error: %pre(mypak-0.0.1-3.el6.noarch) scriptlet failed, exit status 1
error:   install: %pre scriptlet failed (2), skipping mypak-0.0.1-3.el6
preun: 0.0.1-1.el6 ; param = 0
postun: 0.0.1-1.el6 ; param = 0

如您所见,我的包裹最终被删除了。此外,即使其他包依赖于它,该包也会被删除。我什至没有收到有关损坏的依赖项的任何警告!

如果我一个接一个地安装我的包,我就没有这个问题。在这种情况下,第三个软件包的安装失败,仅此而已。我的包的以前版本仍然存在。

我认为这确实是一种奇怪的行为。是 rpm 中的错误还是我遗漏了什么?

我在 Centos 6.5 上使用 rpm 4.8.0。

【问题讨论】:

    标签: centos dependencies rpm


    【解决方案1】:

    RPM 将在安装时忽略(通过替换新版本)同名软件包的旧版本。要么重命名一些包,要么不要在同一个事务中安装同名包的多个版本

    升级时的%pre 失败很棘手。如果 %pre 失败,则不会安装较新的软件包。并且(在已安装旧版本的升级时)将删除已安装的软件包。这里最好的答案是在安装时不要依赖 %pre failures in package 。而是添加提供:/需要: 以便在依赖检查期间发生包(和事务)失败,或者设计一种不同于 %pre 的动态属性测试方法, 无论是在配置中,还是在文档中,或者通过重命名和废弃以前的包来获得更可靠的包。

    【讨论】:

    • 我仍然不明白为什么只有当我对所有三个文件都调用rpm -Uhv *.rpm 时才会遇到这个问题。如果我执行两次后续更新 1->2 和 2->3,则只有最后一个操作失败并且包不会被删除。至于 %pre 部分,在我们的项目中,它执行单个事务数据库更新。如果失败,数据库和包本身都不会更新。
    • RPM 无法在单个事务中进行多阶段升级,例如 1->2 和 2->3。 RPM 使用最新版本(大概是 3)并跳过中间升级步骤。您可以在 3 包中编写 %pre 以循环执行中间升级。如果可能的话,我仍然建议避免使用 %pre。
    • 好的,但是当我手动更新 1->3 时,它仍然可以:包没有被删除。我在所有三个软件包上都启动了rpm -Uhv 是一个意外。我想rpm -Uhv 1,3rpm -Uhv 1,2,3 之间应该没有任何区别。
    • 最初是否安装了 1? rpm -Uvh 1,3 和 rpm -Uvh 1,2,3 都只安装 3 包。 RPM 将多个同名软件包替换为最新版本(本例中为 3 个)并跳过旧软件包。
    • 是的,第一个包已安装。然后我尝试更新到最新版本,不小心在所有三个文件上都做了rpm -Uhv
    【解决方案2】:

    我在 RPM 邮件列表中写了有关此行为的信息,Lubos Kardos 回答说这是一个错误,现在已修复。

    邮件列表线程:http://lists.rpm.org/pipermail/rpm-list/2015-April/001740.html

    提交:https://github.com/rpm-software-management/rpm/commit/c7fa7b2fd7205b73c833831ab9f8c311f40b2ff1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      相关资源
      最近更新 更多