zoukankan      html  css  js  c++  java
  • RPM -U 升级机制探索


    今天被RPM升级机制狠狠的阴了一把,差点没过来,趁着热乎赶紧记录下来,已被后用。

    RPM包有升级机制(Upgrade), 使用-U 参数。这点我之前略有耳闻,知道的并不详细。

    先说说案例:半年前我们release了一个产品的rpm包:xxxx_1.0_1_x86_64.rpm, 现在发行这个包的升级版本:xxxx_1.1_1_x86_64.rpm。

    针对已经安装了version:1.0的用户我们推荐升级,推荐使用rpm本身的升级机制进行升级,即 -U,好吧好戏开场了。

    我先了解了RPM基本的升级策略:

    1. 基本策略:

        a. 安装高version的rpm包

        b. 删除所有旧version包的内容

    2. 针对文件的upgrade

    RPM 对旧版本的rpm包所属文件在升级的过程中采用策略基本原理是: 计算文件的MD5值,比对MD5然后采取不同的策略。

    首先定义几个术语:

    原有文件(original file): 指的是旧版本安装时的某文件

    现有文件(current file): 指当前某文件

    新版文件(new file): 指新版本中的某文件

    策略是:

    1. Original file = X, Current file = X, New file = X

    这种情况表明文件至始至终没有发生改变,此时用new file 覆盖现有文件。

    2. Original file = X, Current file = X, New file = Y

    使用new file覆盖

    3. Original file = X, Current file = Y, New file = X

    保持原有文件不进行覆盖

    4. Original file = X, Current file = Y, New file = Y

    使用new file进行覆盖

    5.  Original file = X, Current file = Y, New file = Z

    这种情况最为复杂,rpm不能判断如何动作,所以rpm安装new file,== 同时将current file重命名为current_file.rpmsave

    基本上解释完了,通过以上还可以引申出另外两种情况

    6. Original file = null, Current file = null, New file = Z

    可以讲这种情况映射为case#2, 使用new file安装

    7. Original file = x, Current file =x, New file = null

    映射至case2, rpm会删除掉current file.

    好了,基本就这么多了,明了吧? 高潮根本不在这!!!

    了解了基本规则,我觉得可以满足需求,OK,开始打包并做测试

    之前我再说两点:

    1. 使用-U 进行升级新的rpm包的version一定要大于现有的version号(好像是在说废话),否则不能升级

    2. 介绍rpm包中预定义的脚本:

    %pre 在安装包之前运行

    %post 在安装包之后运行

    %preun 在卸载包之前运行

    %postun 在卸载包之后运行

    这些脚本可以帮助用户在不同的时间点完成一些必须的事情。

    然后再说下RPM -U中这些脚本的调用步骤:

    运行新包的 %pre
    安装新文件
    运行新包的 %post
    运行旧包的 %preun
    删除新文件未覆盖的所有旧文件
    运行旧包的 %postun

    大家可以仔细看看以上步骤,细心的应该已经能发问了:

    1. 在执行%pre和%post上如何区分是install还是upgrade

    2. 在执行%preun和%postun又如何区分upgrade和uninstall

    这里就要介绍rpm的一个内部变量了:$1

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

    对了,在需要通过$1 的值来区分是哪个操作, 如:

    if [ "$1"="1" ];then
    xxxx
    fi


    明白了吧,应该明白了。我就是栽在这里的。

    由于在上一个release的rpm包中没有在%preun进行类似的判断,导致在upgrade中调用了%preun,这个脚本会对现有的rpm进行一些破坏。无法挽回,因为上一个rpm包已经release了,没法改,弄的我是毫无办法。

    当然也为接下来的知识点做了铺垫,只能感叹,RPM真是博大精深啊!

    请关注这个参数:--nopreun

    rpm -Uvh --nopreun xxx-1.1-1.x86_64.rpm

    这个参数阻止了在升级中%preun的调用,也正是它救了我。

    写的比较乱,以供大家参考,也以供我后查。






  • 相关阅读:
    docker删除常见命令
    测试网中用户添加docker yum源
    kafka 重新分配partition
    docker-compose常用命令
    docker 常用命令
    docker-compose部署ELK
    ELK全Dokcer 部署
    Harbor修改/data目录位置
    单机多es容器服务部署的网络模式
    C++使用模板类时出现LNK2019 unresolved external symbol错误.
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3212477.html
Copyright © 2011-2022 走看看