今天被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" ];thenxxxxfi
明白了吧,應該明白了。我就是栽在這裡的。
由於在上一個release的rpm包中沒有在%preun進行類似的判斷,導致在upgrade中調用了%preun,這個指令碼會對現有的rpm進行一些破壞。無法挽回,因為上一個rpm包已經release了,沒法改,弄的我是毫無辦法。
當然也為接下來的知識點做了鋪墊,只能感歎,RPM真是博大精深啊!
請關注這個參數:--nopreun
rpm -Uvh --nopreun xxx-1.1-1.x86_64.rpm
這個參數阻止了在升級中%preun的調用,也正是它救了我。
寫的比較亂,以供大家參考,也以供我後查。