首页 文章

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

提问于
浏览
0

场景:有3个rpms A,B和C.

当我们安装rpm A时,我们也安装了rpm B和C.所以第一次安装工作正常 . 当我们安装更新版本的rpm A时,我们想要删除rpm B和C,它们是由之前的rpm安装的一个 .

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

我们尝试了什么:

A的spec文件%pre section:

%pre pre rpm -qa | grep B;然后rpm -e B; fi如果rpm -qa | grep C;然后rpm -e C;科幻

我们正在使用傀儡 . 当我们运行puppet agent -t --debug时,在安装rpm A之前它会被挂在下面的线上!

调试:执行'/ usr / bin / yum -d 0 -e 0 -y install A'

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

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

它是一个遗留代码,我们正在解决升级期间发生的问题!

在木偶中我们已经提到如果我们安装rpm A,确保存在rpm B和C.

脚步 :
1.我们将rpm A,B和C上传到我们的puppet服务器 .
2.在我们的puppet客户端中运行 puppet agent –t .
3.它安装所有的rpm
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中提取文件
6. Rpm C的.spec文件:在 %install 部分,他们正在执行 mkdir /m/n/current/filesofBAnd C并从此文件夹中的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也被删除了 .
Deletion of folder filesofBAndC is creating issue . 因此,如果我们在安装rpm A之前卸载rpm B和C,则puppet将在安装rpm A期间再次安装这些rpms,并且将使用所需文件再次创建 /m/n/current/filesofBAndC .

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

1 回答

  • 5

    因为这不是你应该这样做的方式,而且yum是事务性的,并且数据库可能在安装期间被锁定 .

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

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

    您还可以添加 Conflicts 条目,告诉 yum 这两个软件包不能同时安装, Obsoletes 条目告诉 yum 该软件包替换了另一个软件包,因此可以将其删除 .

    做正确的事情, yum 只为你处理这一切 .

相关问题