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的调用,也正是它救了我。
写的比较乱,以供大家参考,也以供我后查。
RPM -U 升级机制探索的更多相关文章
- rpm 更新/升级 软件包(libGL-devel手动安装过程)
rpm参数解释 -i 安装 -h 解压rpm的时候打印50个斜条 (#) -v 显示详细信息 升级命令rpm -Uvh rpm文件名 参数解释 -U 升级 -h 解压rpm的时候打印50个斜条 (#) ...
- 【原创】TCP超时重传机制探索
TCP超时重传机制探索 作者:tll (360电商技术) 1)通信模型 TCP(Transmission Control Protocol)是一种可靠传输协议.在传输过程中当发送方(sender)向接 ...
- 编译制作Linux 3.18内核rpm包(升级centos6.x虚拟机内核)
介绍 openstack平台需要使用各种Linux发行版模板镜像,其制作方法主要有两种,要么是基于各大Linux发行版ISO光盘手动制作,要么是使用官方提供的模板镜像再做修改 之前制作的opensta ...
- 利用 yum 命令和 rpm 命令升级 Nginx 或者安装最新版本 Nginx
方法一:使用 yum 命令升级 Nginx 1.在配置 YUM 仓库的目录(/etc/yum.repos.d/)下新增文件 nginx.repo vi /etc/yum.repos.d/nginx. ...
- synchronized和 synchronized 了解偏向锁、轻量级锁、重量级锁的概念以及升级机制、以及和ReentrantLock的区别。
并发 synchronized 了解偏向锁.轻量级锁.重量级锁的概念以及升级机制.以及和ReentrantLock的区别. https://www.cnblogs.com/deltadeb ...
- Android消息机制探索(Handler,Looper,Message,MessageQueue)
概览 Android消息机制是Android操作系统中比较重要的一块.具体使用方法在这里不再阐述,可以参考Android的官方开发文档. 消息机制的主要用途有两方面: 1.线程之间的通信.比如在子线程 ...
- Linux学习-YUM 在线升级机制
这个 yum 是透过分析 RPM 的标头资料后, 根据 各软件的相关性制作出属性相依时的解决方案,然后可以自动处理软件的相依属性问题,以解决软件 安装或移除与升级的问题. 利用 yum 进行查询.安装 ...
- rpm方式升级cenos6.7内核
最近因为yarn集群问题需要配置cgroup.但是配置完成后操作系统内核奔溃. 查找资料后发现升级内核可以解决问题.在领导的大力支持下,对生产环境的计算节点(nodemanager)进行了批量升级内核 ...
- Ceph 客户端的 RPM 包升级问题
问题 最近想把一个现有的 Ceph 客户端升级为最新的 M 版: [root@overcloud-ovscompute-0 ~]# rpm -qa | grep ceph puppet-ceph-2. ...
随机推荐
- toString的理解
Super的作用: 1. super可以直接调用父类的属性和方法. 2. super可以在子类的构造器中调用父类的构造器. 我们知道:实例化一个对象时,会调用构造器. 我们发现,仅仅实例化的是Stud ...
- C#读写xml文件的常用方法
已知有一个XML文件(bookshop.xml)如下: <?xml version="1.0" encoding="gb2312" ?> <b ...
- php pdo预处理语句与存储过程
很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制.预处理语句可以带来两大好处: 1.查询仅需解析(或预处理) ...
- 【数位dp】bzoj2089 不要62
http://www.cnblogs.com/xiaohongmao/p/3473599.html #include<cstdio> using namespace std; int n, ...
- mysql mha 主从自动切换 高可用
mha(Master High Availability)目前在MySQL多服务器(超过二台),高可用方面是一个相对成熟的解决方案. 一,什么是mha,有什么特性 1. 主服务器的自动监控和故障转移 ...
- 『TCP/IP详解——卷一:协议』读书笔记——06
2013-08-20 14:41:01 2.8 最大传输单元MTU MTU,最大传输单元:以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492字节.这个不同网络对应的传输上限 ...
- IOS封装一个微信聊天的输入工具
1.实现微信的输入工具 实现了大部分功能,各模块实现的很清晰,有利于更好的二次开发(适合自己的需求),我自己总结出来的, 可以更快的让你实现输入工具,不需要扩展的也可以很方便的使用这个输入工具. 1) ...
- JavaScript知识架构学习路径(一)- 变量篇
[摘要]本文是专为JavaScript入门者而总结的,总体上将JavaScript的基础部分分成了九大块,分别是变量.运算符.数组.流程控制结构.字符串函数.函数基础.DOM操作基础.文档对象模型DO ...
- C#中手工进行声明式验证,从此远离if验证
今天在一个ASP.NET MVC Controller Action中写代码时,需要对ViewModel的字段进行验证.但这个Action处理的是手工编写的ajax请求(不是表单提交),无法使用ASP ...
- 拟物设计和Angular的实现 - Material Design(持续更新)
Material Design是Google最新发布的跨平台统一视觉设计语言.直接翻译是物质设计,但是我更倾向于使用"拟物设计"更为准确. 据谷歌介绍,Material Desig ...