gpt4 book ai didi

linux - spec 文件中的 rpm -e {rpmName} 不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:51:38 24 4
gpt4 key购买 nike

场景:有 3 个 rpm A、B 和 C。

当我们安装 rpm A 时,我们也在安装 rpm B 和 C。所以第一次安装工作正常。当我们在升级过程中安装更新版本的 rpm A 时,我们想删除已安装的 rpm B 和 C由先前的 rpm A.

要求:在安装新的rpm A之前,检查是否安装了B和C。如果是,请卸载 B 和 C。以便新的 rpm A 可以安装新的 rpm B 和 C。

我们尝试了什么:

A 的 spec 文件 %pre 部分:

%pre
if rpm -qa | grep B; then
rpm -e B;
fi
if rpm -qa | grep C; then
rpm -e C;
fi

我们正在使用木偶。当我们运行 puppet agent -t --debug 时,在安装 rpm A 之前它会在下面的行挂起!

Debug: Executing '/usr/bin/yum -d 0 -e 0 -y install A'

知道为什么我们无法卸载这些 rpm 吗?

编辑: 让我解释一下正确的场景:

这是一个遗留代码,我们正在修复升级过程中发生的问题!

在 puppet 中我们已经提到,如果我们要安装 rpm A,请确保存在 rpm B 和 C。

步骤:
1. 我们将 rpm A、B 和 C 上传到我们的 puppet 服务器。
2. 在我们的 puppet 客户端中运行 puppet agent –t
3. 安装所有的rpms
4. Rpm A 的 .spec 文件:在 %pre 部分他们正在做 rm –rf/m/n/current 和在 %install 部分他们正在执行 mkdir/m/n 并在此文件夹中提取 rpm A 的内容。
5. Rpm B 的 .spec 文件:在 %install 部分,他们正在执行 mkdir/m/n/current/filesofBAndC 并从该文件夹中的 rpm B 中提取文件< br/>6. Rpm C 的 .spec 文件:在 %install 部分,他们正在执行 mkdir/m/n/current/filesofBAndC 并从该文件夹中的 rpm C 中提取文件
7. 以下场景一切正常
• 首次安装
• 卸载 rpm A 并安装更新版本的 A(仅全新安装)
• 升级A(B和C有版本变化)
8. 问题是,如果我们安装更新版本的 A(无需卸载以前版本的 A)而 rpm B 和 C 没有任何版本更改,它只会安装 rpm A(因为 rpm B 和 C 没有版本更改) .在 rpm A 安装过程中,我们正在删除文件夹/m/n/current,这意味着我们的/m/n/current/filesofBAndC 也被删除。
删除 BAndC 文件夹文件会产生问题。因此,如果我们在安装 rpm A 之前卸载 rpm B 和 C,puppet 将在安装 rpm A 期间再次安装这些 rpm,并且 /m/n/current/filesofBAndC 将再次创建所需的文件。

由于某些依赖关系,我们不应该修改文件夹结构(如 /m/n/filesofBAndC )。

最佳答案

因为这不是您应该做的,而且 yum 是事务性的,数据库可能在安装期间被锁定。

这样做的方法是在 A 包的 .spec 文件的 Requires: 行中列出 B 和 C RPM,这样当您要求安装 A 包时,yum 会自动为您处理。

此外,如果您有特定的版本要求,您也可以在 Requires 行中包含这些要求,yum 将为您检查(并强制执行)。

您还可以添加 Conflicts 条目,告诉 yum 这两个包不能同时安装,以及 Obsoletes 条目告诉 yum 这个包替换 另一个包,所以它可以被删除。

正确完成所有操作,yum 会为您处理所有这些。

关于linux - spec 文件中的 rpm -e {rpmName} 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33524028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com