RPM -U 升級機制探索


今天被RPM升級機制狠狠的陰了一把,差點沒過來,趁着熱乎趕忙記錄下來,已被後用。post

RPM包有升級機制(Upgrade), 使用-U 參數。這點我以前略有耳聞,知道的並不詳細。測試

先說說案例:半年前咱們release了一個產品的rpm包:xxxx_1.0_1_x86_64.rpm, 如今發行這個包的升級版本:xxxx_1.1_1_x86_64.rpm。code

針對已經安裝了version:1.0的用戶咱們推薦升級,推薦使用rpm自己的升級機制進行升級,即 -U,好吧好戲開場了。產品

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

1. 基本策略:table

    a. 安裝高version的rpm包ast

    b. 刪除全部舊version包的內容class

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的調用,也正是它救了我。

寫的比較亂,以供你們參考,也以供我後查。

相關文章
相關標籤/搜索