【问题标题】:RPM upgrade uninstalls the RPMRPM 升级卸载 RPM
【发布时间】:2011-11-15 23:07:41
【问题描述】:

我正在升级我们的项目 RPM。问题是当我从 projectname-1.0-0 升级到 projectname-1.0-1 时,它首先安装新项目并卸载旧项目,从总体上看,它完全删除了我的项目。我在升级时使用了“vv”选项,输出显示安装后卸载完成。

请有人帮忙解决这个问题。在 RPM 规范或 rpmbuild 选项中有什么我应该特别更改的吗?

【问题讨论】:

    标签: upgrade rpm rpmbuild specifications


    【解决方案1】:

    是的,当发生 RPM 升级时,RPM 首先安装新版本的软件包,然后卸载旧版本的软件包。仅删除旧包的文件。但是您的脚本(即 %pre、%post、%preun、%postun)需要知道它们是在处理升级还是简单的安装或卸载。

    rpm 命令将向您的脚本传递一个参数,即 $1,它是已安装软件包版本数的计数。下表(来自 Eric Foster-Johnston 的 RedHat RPM Guide)提供了可能值的示例。

    Install the first time:          1
    Upgrade:                         2 or higher 
                                     (depending on the number of versions installed)
    Remove last version of package:  0
    

    因此,在您的 %preun 中,您可能需要在删除任何服务之前检查“$1 = 0”。

    有关更多信息(和更好的表格),请参阅:http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch09s04s05.html

    【讨论】:

    • 如果您已经在生产环境中安装了 1.0.0 包并且您无法修改它的 preun 或 postun 并且他们做错了事情怎么办?如覆盖刚刚安装的包 1.0.1。
    • RPM 有一个--noscripts 标志来防止任何前置或后置脚本运行。不确定与 yum 等效的是什么(如果有的话)。
    【解决方案2】:

    当您升级 RPM 包时,脚本按以下顺序执行:

     1. %Pre of new package
         copy in files for new package
     2. %Post of new package
     3. %Preun of old package
         remove files of old package
     4. %Postun of old package
    

    无论是全新安装还是升级安装,都有一个参数传递给每个脚本,该参数代表不同版本的同一软件包安装的 RPM 数量。 对于 pre & post 脚本,如果是第一次安装,它将为 1。 对于 preun 和 postun 脚本,上次卸载时为 0。

    在您的情况下可能发生的情况是 preun 或 postun 脚本可能正在删除对新包有用的文件。您无需担心在 postun 脚本中手动删除文件,它将由 RPM 本身智能处理。

    参考:Upgrading & uninstalling

    【讨论】:

    • 有趣的是,新软件包是在旧软件包被卸载之前安装的。似乎倒退了,但我确信这是有充分理由的!
    【解决方案3】:

    是的。在 rpm 安装期间,将调用 %install 和 %post 脚本。安装成功后,会调用 %preun 和 %postun 脚本卸载之前版本的 rpm。如果处理不当,这些 %preun 和 %postun 脚本可能会操纵 %install 和 %post 脚本带来的更改。

    rpm 将 $1 参数设置为适当的值,以区分安装的 rpm 版本的数量。在全新安装 projectname-1.0-0 期间,将调用 %install 和 %post 脚本,其中 $1 设置为 1,表示这是唯一的活动版本。升级到 projectname-1.0-1 后,%install 和 %post 脚本将被调用,$1 设置为 2。之后,%preun 和 %postun 脚本将被调用,$1 设置为 1,以清理 projectname 的东西-1.0-0。因此,通过基于 $1 值编写规范文件,我们可以有效地处理升级。

    【讨论】:

    • %install 不是在 RPM 安装期间运行,而是在 build 期间运行(是的,这个名称可能会产生误导)。我想你的意思是%pre
    【解决方案4】:

    了解卸载部分在升级时的工作方式很重要

    我们有一个变量 $1 可以在 pre、post、unpre、unpost 中检查(其值因安装、升级、卸载而异) 根据它的值,我们可以说它是从 rpm 中安装还是升级

    例如:

    In Pre/post
    if $1 == 1 initial installation
    if $1 == 2 upgrade
    
    In preun/postun
    if $1 == 0 uninstall
    if $1 == 1 upgrade
    

    考虑将 abc-1 从版本 1 升级到版本 2 (abc-2)

    Run %pre from "abc-2".
    Run %post from "abc-2".
    Run %preun from "abc-1".
    Run %postun from "abc-1".
    

    【讨论】:

      猜你喜欢
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2018-06-12
      • 2021-05-27
      相关资源
      最近更新 更多