今天被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的調用,也正是它救了我。
寫的比較亂,以供你們參考,也以供我後查。