今天被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的调用,也正是它救了我。

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

RPM -U 升级机制探索的更多相关文章

  1. rpm 更新/升级 软件包(libGL-devel手动安装过程)

    rpm参数解释 -i 安装 -h 解压rpm的时候打印50个斜条 (#) -v 显示详细信息 升级命令rpm -Uvh rpm文件名 参数解释 -U 升级 -h 解压rpm的时候打印50个斜条 (#) ...

  2. 【原创】TCP超时重传机制探索

    TCP超时重传机制探索 作者:tll (360电商技术) 1)通信模型 TCP(Transmission Control Protocol)是一种可靠传输协议.在传输过程中当发送方(sender)向接 ...

  3. 编译制作Linux 3.18内核rpm包(升级centos6.x虚拟机内核)

    介绍 openstack平台需要使用各种Linux发行版模板镜像,其制作方法主要有两种,要么是基于各大Linux发行版ISO光盘手动制作,要么是使用官方提供的模板镜像再做修改 之前制作的opensta ...

  4. 利用 yum 命令和 rpm 命令升级 Nginx 或者安装最新版本 Nginx

    方法一:使用 yum 命令升级 Nginx 1.在配置 YUM 仓库的目录(/etc/yum.repos.d/)下新增文件  nginx.repo vi /etc/yum.repos.d/nginx. ...

  5. synchronized和 synchronized 了解偏向锁、轻量级锁、重量级锁的概念以及升级机制、以及和ReentrantLock的区别。

    并发 synchronized 了解偏向锁.轻量级锁.重量级锁的概念以及升级机制.以及和ReentrantLock的区别.       https://www.cnblogs.com/deltadeb ...

  6. Android消息机制探索(Handler,Looper,Message,MessageQueue)

    概览 Android消息机制是Android操作系统中比较重要的一块.具体使用方法在这里不再阐述,可以参考Android的官方开发文档. 消息机制的主要用途有两方面: 1.线程之间的通信.比如在子线程 ...

  7. Linux学习-YUM 在线升级机制

    这个 yum 是透过分析 RPM 的标头资料后, 根据 各软件的相关性制作出属性相依时的解决方案,然后可以自动处理软件的相依属性问题,以解决软件 安装或移除与升级的问题. 利用 yum 进行查询.安装 ...

  8. rpm方式升级cenos6.7内核

    最近因为yarn集群问题需要配置cgroup.但是配置完成后操作系统内核奔溃. 查找资料后发现升级内核可以解决问题.在领导的大力支持下,对生产环境的计算节点(nodemanager)进行了批量升级内核 ...

  9. Ceph 客户端的 RPM 包升级问题

    问题 最近想把一个现有的 Ceph 客户端升级为最新的 M 版: [root@overcloud-ovscompute-0 ~]# rpm -qa | grep ceph puppet-ceph-2. ...

随机推荐

  1. noip2015-day1-t2

    题意:有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学.游戏开始时,每人都只知道自己的生日.之后每一轮中, ...

  2. Hibernate关联关系配置(一对多、一对一和多对多)

    第一种关联关系:一对多(多对一) "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系. 一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多. 多对一:从订单的 ...

  3. [PHP-Socket] Socket Programming in PHP

    Simple Client-Server socket program in PHP Introduction Sockets are used for interprocess communicat ...

  4. mongoDB研究笔记:journaling保证意外故障下的数据完整性

    mongoDB的Journaling日志功能与常见的log日志是不一样的,mongoDB也有log日志,它只是简单记录了数据库在服务器上的启动信息.慢查询记录.数据库异常信息.客户端与数据库服务器连接 ...

  5. C#设计模式——抽象工厂

    一.引言 我相信看到这段文字的人,都具备了良好的技术功底.但是对于自己编写的代码总是充满抱怨,希望能够将自己编写的代码如同房子一般先进行有效 的设计,然后在进行建设.那么这篇文章能够给你一些思路,这里 ...

  6. Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用

    一个Form里经常会有好几个Tab,有时要根据一些条件设置哪些Tab可用,可见.下面就介绍下如何用JS对Tab进行控制. 1. 控制可见   function setTabVisableByName( ...

  7. Idol之坑

    1. 编码格式不统一 Idol的API 是基于 Http 的 Get 调用,输入N多参数,可以吐出Xml和 Json. 由于Idol没有在输出文档中指定编码格式(ContentType),用 Http ...

  8. Ubuntu配置git

    安装ssh sudo apt-get install openssh-server sudo apt-get install openssh-client 启动SSH服务 sudo /etc/init ...

  9. 通过Greasemonkey实现网页图片自动点击

    昨天受一个朋友所托,实现了一个在特定网页自动点击某超链接图片实现网页跳转功能的JavaScript脚本. 工具就是Firefox的Greasemonkey扩展插件.代码如下: // ==UserScr ...

  10. iOS开发——高级技术&iCloud服务

    iCloud服务 iCloud 是苹果提供的云端服务,用户可以将通讯录.备忘录.邮件.照片.音乐.视频等备份到云服务器并在各个苹果设备间直接进行共享而无需关心数据同步问题,甚至 即使你的设备丢失后在一 ...