RPM 解除安裝

tonywi888發表於2007-11-16
安全地解除安裝
RPM解除安裝軟體包,並不是簡單地將原來安裝的檔案逐個刪除,那樣做的話,可能會出現這樣或那樣的問題。如,A軟體包依靠B軟體包做某些工作,若B軟體包解除安裝了,則A軟體包就不能正常執行了。RPM為使用者安全考慮,會做某些檢查,儘可能排除出錯的情況。

RPM在解除安裝軟體包時,分步驟進行如下操作:
1. 檢查依賴(Denpendency)
檢查依賴的目的,在於確保當前沒有任何軟體包依賴於當前要解除安裝的軟體包。
2. 執行解除安裝前觸發指令碼程式(Triggerun)
3. 執行解除安裝前指令碼程式(Preuninstall)
本程式為軟體包製作者設定,完成解除安裝前的一些工作,具體如,要解除安裝的軟體包中某個
程式當前正在執行時,指令碼程式必須殺掉它,否則無法正確解除安裝。
4. 檢查配置檔案(Configfiles)
RPM解除安裝軟體包前會檢查包中的配置檔案是否修改了,如果修改了,RPM要換個名字儲存
該檔案,檔名一般是“原檔名+.rpmsave”。(這是RPM軟體包管理的特色之一)
5. 真正解除安裝
即按照軟體包中的檔案列表,將檔案逐個刪除。要注意的是,如果其中有檔案屬於別的
軟體包(即兩個軟體包擁有一個名字相同的檔案),則RPM並不刪除。
6. 執行解除安裝後指令碼程式(Postuninstall)
本程式主要是完成解除安裝的善後工作,如將系統配置檔案inetd.conf修改一下,去掉安裝
時新增的東西等等。
7. 更新RPM資料庫
解除安裝後,RPM刪除該軟體包在資料庫中的所有資訊。
8. 執行解除安裝後觸發指令碼程式(Triggerpostun)

命令格式
解除安裝RPM格式的軟體包,可使用如下命令格式:
rpm -e [解除安裝選項1 解除安裝選項2...] [軟體包標識1 軟體包標識2...]

注: 也可使用--erase代替-e,效果相同。

軟體包標識
對於已安裝的軟體包,RPM使用如下格式來唯一標識它:
Name[-Subname]-Version-Release
其中: Name: 指軟體名;
Subname : 本項可選,指軟體包子包的名字;
Version : 指軟體版本號。注意:其中不能含減號(-)字元;
Release : 指軟體釋出號。
例如: 包裹檔案file-3.26-6.i386.rpm安裝後,其軟體包標識為file-3.26-6。可以用此標識解除安裝,查詢,校驗該軟體包。在命令列上輸入軟體包標識時,可以寫全,也可以採用簡寫的方式。如file-3.26-6,可僅輸入file,或file-3.26,或輸全。又如: 帶有子包的軟體包標識XFree86-devel-3.3.6-6,可僅輸入XFree86-devel,或XFree86-devel-3.3.6,還可完全輸入。
注意: 軟體包標識是大小寫敏感的,即大寫字母與小寫字母表示不同的涵義。如bash-2.03-10標識不能輸作Bash-2.03-10,也不能輸作bAsh-2.03-10等等。

選項列表

選項詳解
下面對指定用選項做些解釋:
1. --test : 解除安裝測試
RPM的解除安裝測試做些什麼?主要是檢查依賴關係,確保系統中沒有軟體包依賴於要解除安裝的軟體包。如果還有軟體包依賴要解除安裝的軟體包,則RPM會提示依賴關係將中斷的錯誤,例如:
# rpm -e --test mktemp
error: removing these packages would break dependencies:
mktemp is needed by autoconf-2.13-5
mktemp is needed by dev-2.7.7-4BP
mktemp is needed by groff-1.11a-10BP
mktemp is needed by gzip-1.2.4-15BP
mktemp is needed by initscripts-4.16-3BP
mktemp is needed by metamail-2.7-21BP
mktemp is needed by rpm-3.0.3-4BP
mktemp is needed by autofs-3.1.3-2
/bin/mktemp is needed by apache-1.3.12-5BP
/bin/mktemp is needed by linuxconf-1.16r1.3-4BP
#

當然,我們透過瀏覽解除安裝測試時輸出的除錯資訊就知道得更清楚了。
# rpm -e --test -vv file | nl
1 D: opening database mode 0x0 in //var/lib/rpm/
2 D: getting list of mounted filesystems
3 + echo triggeruninstall
4 triggeruninstall
5 D: will remove files test = 1
6 D:file: /usr/share/magic action: remove
7 D:file: /usr/man/man4/magic.4 action: remove
8 D:file: /usr/man/man1/file.1 action: remove
9 D:file: /usr/bin/file action: remove
10 + echo triggerpostuninstall
11 triggerpostuninstall
12 D: removing database entry

注: 本例進行file包的解除安裝測試,輸出資訊送管道交nl列出行號,現逐行解釋。(行號後以D:開始的行輸出的為除錯資訊)
第1行: 開啟/var/lib/rpm目錄下的RPM資料庫;
第2行: 取已安裝檔案系統列表;
第3行: 執行解除安裝前觸發指令碼程式;
第4行: 這一行是解除安裝前觸發指令碼程式的執行結果;
第5行: RPM提示將要刪除檔案,其中test=1表明為解除安裝測試,並非真正刪除;
第6-9行: 顯示各檔案的執行操作--刪除;
第10行: 執行解除安裝後觸發指令碼程式;
第11行: 本行是解除安裝後觸發指令碼程式的執行結果;
第12行: 刪除軟體包在資料庫中的資訊。

2. --nodeps : 不檢查依賴
RPM 管理軟體包,不僅管理包中的所有檔案,還同時管理著軟體包之間的依賴關係。如A依賴於B執行,若B不存在了,則A也就執行不了了。RPM維護著這種關係, 儘量避免破壞,以保證軟體的正常執行。上例進行mktemp包的解除安裝測試時,RPM提示了中斷依賴關係的錯誤。如果使用本選項,不檢查依賴,則解除安裝測試會順利完成。
# rpm -e --test --nodeps mktemp
#

需要說明的是,除非使用者對軟體包有足夠了解,否則不要使用本選項,最好讓RPM自動維護軟體間的依賴關係,確保其能正常執行。

3. --noscripts : 不執行指令碼程式
一個RPM軟體包中可包含五種指令碼程式,即:安裝前指令碼程式,安裝後指令碼程式,解除安裝前指令碼程式,解除安裝後指令碼程式和校驗指令碼程式。解除安裝時使用--noscripts選項,可禁止解除安裝前與解除安裝後指令碼程式的執行。
注意: 一般使用者不要使用此選項。此選項主要提供給軟體包製作者使用的。透過禁止執行指令碼程式,可以防止因安裝帶有BUG的軟體包而宕掉整個系統。當軟體包去掉了BUG後,此選項就不必使用了。

4. --notriggers : 不執行觸發程式
為了軟體包間的互動控制,RPM設計了三種觸發程式:安裝時觸發程式,解除安裝前觸發程式和解除安裝後觸發程式。為了防止因某一軟體包的解除安裝而引發解除安裝前與解除安裝後觸發程式的執行,可以使用--notriggers選項。透過比較下一例子與第1個選項介紹中的例子的輸出,就可看到:選擇--notriggers選項後,解除安裝前與解除安裝後觸發程式都沒有被觸發執行。
# rpm -e --test -vv --notriggers file | nl
1 D: opening database mode 0x0 in //var/lib/rpm/
2 D: getting list of mounted filesystems
3 D: will remove files test = 1
4 D:file: /usr/share/magic action: remove
5 D:file: /usr/man/man4/magic.4 action: remove
6 D:file: /usr/man/man1/file.1 action: remove
7 D:file: /usr/bin/file action: remove
8 D: removing database entry

5. --allmatches : 解除安裝所有匹配的包

RPM可將同一軟體的不同版本安裝到系統中,這樣如果想全部解除安裝掉,這時僅簡單輸軟體名是不行的,將出現錯誤,如:
# rpm -q foo
foo-6.0-1
foo-7.0-1
# rpm -e foo
error: "foo" specifies multiple packages
#

注: 本例中先查詢foo包,發現有6.0和7.0版兩個版本,接著解除安裝foo包,出現錯誤: 有多個軟體包的名字均為foo。
怎樣才能全部解除安裝呢?
答案之一是一個一個解除安裝,解除安裝時輸入軟體包標識,因為軟體名相同,所以最少再輸個版本號,這種情況適用於軟體版本少的時候。
答案之二是使用--allmatches選項,僅輸個軟體名即可,指示RPM解除安裝所有匹配的包,比較方便。
# rpm -e --allmatches foo
# rpm -q foo
package foo is not installed
#

解除安裝過程沒有出現錯誤,之後再查詢foo包,RPM則提示軟體包未安裝。

6. --justdb : 僅修改資料庫
使用本選項後,RPM將只更新其資料庫,檔案系統不更新,意即如果軟體包安裝有檔案的話,解除安裝後這些檔案照樣存在。
# rpm -ql file
/usr/bin/file
/usr/man/man1/file.1
/usr/man/man4/magic.4
/usr/share/magic
# ls -l /usr/bin/file
-rwxr-xr-x 1 root root23948 Mar 23 1999 /usr/bin/file
# rpm -e --justdb file
# ls -l /usr/bin/file
-rwxr-xr-x 1 root root23948 Mar 23 1999 /usr/bin/file
#

注: 本例先用rpm -ql查詢得到file包的檔案列表,再用ls命令列包中的一個檔案/usr/bin/file,能列出資訊,故檔案存在。然後用rpm -e --justdb解除安裝file包但只更新資料庫,而後再用ls命令列/usr/bin/file,可以看到該檔案依然存在。[@more@]RPM 解除安裝

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8570952/viewspace-982588/,如需轉載,請註明出處,否則將追究法律責任。

相關文章