RPM -U 升級機制探索

來源:互聯網
上載者:User

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

寫的比較亂,以供大家參考,也以供我後查。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.