RPM命令大全

RPM命令大全

一、安裝

命令格式:

rpm -i ( or –install) options file1.rpm … fileN.rpm

參數:

file1.rpm … fileN.rpm 將要安裝的RPM包的檔案名

詳細選項:

-h (or –hash) 安裝時輸出hash記號 (“#”)

–test 只對安裝進行測試,並不實際安裝。

–percent 以百分比的形式輸出安裝的進度。

–excludedocs 不安裝套裝軟體中的文檔檔

–includedocs 安裝文檔

–replacepkgs 強制重新安裝已經安裝的套裝軟體

–replacefiles 替換屬於其他套裝軟體的文件

–force 忽略套裝軟體及檔的衝突

–noscripts 不運行預安裝和後安裝腳本

–prefix 將套裝軟體安裝到由 指定的路徑下

–ignorearch 不校驗套裝軟體的結構

–ignoreos 不檢查套裝軟體運行的作業系統

–nodeps 不檢查依賴性關係

–ftpproxy 用 作為 FTP代理

–ftpport 指定FTP的埠號為

通用選項

-v 顯示附加資訊

-vv 顯示調試資訊

–root 讓RPM將指定的路徑做為”根目錄”,這樣預安裝程式和後安裝程式都會安裝到這個目錄下

–rcfile 設置rpmrc檔為

–dbpath 設置RPM 資料庫存所在的路徑為

二、刪除

命令格式:

rpm -e ( or –erase) options pkg1 … pkgN

參數

pkg1 … pkgN :要刪除的套裝軟體

詳細選項

–test 只執行刪除的測試

–noscripts 不運行預安裝和後安裝腳本程式

–nodeps 不檢查依賴性

通用選項

-vv 顯示調試資訊

–root 讓RPM將指定的路徑做為”根目錄”,這樣預安裝程式和後安裝程式都會安裝到這個目錄下

–rcfile 設置rpmrc檔為

–dbpath 設置RPM 資料庫存所在的路徑為

三、升級

命令格式

rpm -U ( or –upgrade) options file1.rpm … fileN.rpm

參數

file1.rpm … fileN.rpm 套裝軟體的名字

詳細選項

-h (or –hash) 安裝時輸出hash記號 (“#”)

–oldpackage 允許”升級”到一個老版本

–test 只進行升級測試

–excludedocs 不安裝套裝軟體中的文檔檔

–includedocs 安裝文檔

–replacepkgs 強制重新安裝已經安裝的套裝軟體

–replacefiles 替換屬於其他套裝軟體的文件

–force 忽略套裝軟體及檔的衝突

–percent 以百分比的形式輸出安裝的進度。

–noscripts 不運行預安裝和後安裝腳本

–prefix 將套裝軟體安裝到由 指定的路徑下

–ignorearch 不校驗套裝軟體的結構

–ignoreos 不檢查套裝軟體運行的作業系統

–nodeps 不檢查依賴性關係

–ftpproxy 用 作為 FTP代理

–ftpport 指定FTP的埠號為

通用選項

-v 顯示附加資訊

-vv 顯示調試資訊

–root 讓RPM將指定的路徑做為”根目錄”,這樣預安裝程式和後安裝程式都會安裝到這個目錄下

–rcfile 設置rpmrc檔為

–dbpath 設置RPM 資料庫存所在的路徑為

四、查詢

命令格式:

rpm -q ( or –query) options

參數:

pkg1 … pkgN :查詢已安裝的套裝軟體

詳細選項

-p (or “-”) 查詢套裝軟體的文件

-f 查詢屬於哪個套裝軟體

-a 查詢所有安裝的套裝軟體

–whatprovides 查詢提供了 功能的套裝軟體

-g 查詢屬於 組的套裝軟體

–whatrequires 查詢所有需要 功能的套裝軟體

資訊選項

顯示套裝軟體的全部標識

-i 顯示套裝軟體的概要資訊

-l 顯示套裝軟體中的檔列表

-c 顯示配置檔列表

-d 顯示文檔檔列表

-s 顯示套裝軟體中檔列表並顯示每個檔的狀態

–scripts 顯示安裝、卸載、校驗腳本

–queryformat (or –qf) 以用戶指定的方式顯示查詢資訊

–dump 顯示每個檔的所有已校驗資訊

–provides 顯示套裝軟體提供的功能

–requires (or -R) 顯示套裝軟體所需的功能

通用選項

-v 顯示附加資訊

-vv 顯示調試資訊

–root 讓RPM將指定的路徑做為”根目錄”,這樣預安裝程式和後安裝程式都會安裝到這個目錄下

–rcfile 設置rpmrc檔為

–dbpath 設置RPM 資料庫存所在的路徑為

五、校驗已安裝的套裝軟體

命令格式:

rpm -V ( or –verify, or -y) options

參數

pkg1 … pkgN 將要校驗的套裝軟體名

套裝軟體選項

-p Verify against package file

-f 校驗所屬的套裝軟體

-a Verify 校驗所有的套裝軟體

-g 校驗所有屬於組 的套裝軟體

詳細選項

–noscripts 不運行校驗腳本

–nodeps 不校驗依賴性

–nofiles 不校驗檔屬性

通用選項

-v 顯示附加資訊

-vv 顯示調試資訊

–root 讓RPM將指定的路徑做為”根目錄”,這樣預安裝程式和後安裝程式都會安裝到這個目錄下

–rcfile 設置rpmrc檔為

–dbpath 設置RPM 資料庫存所在的路徑為

六、校驗套裝軟體中的文件

語法:

rpm -K ( or –checksig) options file1.rpm … fileN.rpm

參數:

file1.rpm … fileN.rpm 套裝軟體的檔案名

Checksig–詳細選項

–nopgp 不校驗PGP簽名

通用選項

-v 顯示附加資訊

-vv 顯示調試資訊

–rcfile 設置rpmrc檔為

七、其他RPM選項

–rebuilddb 重建RPM資料庫

–initdb 創建一個新的RPM資料庫

–quiet 盡可能的減少輸出

–help 顯示幫助檔

–version 顯示RPM的當前版本

製作篇(上)

要想製作一個RPM格式的套裝軟體,需要編寫套裝軟體描述檔。其標準命名格式為:軟體名-版

本號-釋出號.spec,這個文件,詳細描述了有關該套裝軟體的諸多資訊,如軟體名,版本,類別, 說

明摘要,創建時要執行什麼指令,安裝時要執行什麼操作,以及套裝軟體所要包含的檔等等。 有

了這個檔,RPM就可以製作出相應的包裹檔來。

下麵以我製作小趙編輯器LZE的套裝軟體(lze-6.0-2.i386.rpm)為例,詳細說明一下套裝軟體描

述檔的書寫。其描述檔為lze-6.0-2.spec,該檔內容如下:(用nl -ba命令列出,每行開頭

的數位為所在行在檔中的行號)

1 # 檔案名稱: lze-6.0-2.spec

2 # 檔功能: lze套裝軟體描述資訊

3 # 檔作者: 縱橫軟體製作中心雨亦奇 國防大學研究生二隊趙建利

4 # 修改時間: 2001.10.19

5

6 Name: lze

7 Version: 6.0

8 Release: 2

9 Summary: 小趙全螢幕中英文多視窗多功能編輯器(LINUX/UNIX系統適用)

10 Group: Applications/Editors

11 License: Share

12 Vendor: 縱橫軟體製作中心

13 Packager: 雨亦奇(zhsoft@371.net)

14 Source: http://zhsoft.myetang.com/lze-6.0-2.src.tgz

15 Prefix: /usr

16 Requires: /bin/sh

17 Provides: lze-edit

18

19 %description

20 小趙編輯器,是為使用SCO UNIX,LINUX多用戶系統的廣大用戶專門設計的全螢幕多窗

21 口中英文多功能編輯器。

22 它主要有以下十大特點:1.全螢幕功能表操作。2.顯示方式多樣。3.塊操作豐富。4.十

23 字製錶功能強大。5.多視窗操作靈活自如。6.檔操作功能齊全。7.解釋輸出功能獨具特

24 色。8.自帶中文輸入法(增強五筆和增強拼音),實用方便。9.十六進位編輯功能,如虎

25 添翼。10.即時翻譯,按到即譯。

26 總之,小趙編輯器會成為您在UNIX,LINUX系統上編制程式和書寫一般性文稿的好幫手。

27 它將在工作中助您一臂之力,輕鬆上陣,遊刃有餘!

28

29 %prep

30 echo “預處理腳本程式(prep)開始執行”

31 %setup

32

33 %build

34 echo “編譯連接腳本程式(build)開始執行”

35 make

36

37 %install

38 echo “安裝腳本程式(install)開始執行”

39 make install

40

41 %clean

42 echo “建包結束後清理腳本程式(clean)開始執行”

43

44 %pre

45 echo “安裝前執行腳本程式(pre)開始執行”

46

47 %post

48 echo “安裝後執行腳本程式(post)開始執行”

49

50 %preun

51 echo “卸載前執行腳本程式(preun)開始執行”

52

53 %postun

54 echo “卸載後執行腳本程式(postun)開始執行”

55

56 %veryfiscript

57 echo “套裝軟體校驗腳本程式(verifyscript)開始執行”

58

59 %triggerin — xiuwu

60 echo “套裝軟體安裝時觸發腳本程式(triggerin)開始執行”

61

62 %triggerun — yuntaishan < 2.0

63 echo “套裝軟體卸載前觸發腳本程式(triggerun)開始執行”

64

65 %triggerpostun — dapubu

66 echo “套裝軟體卸載後觸發腳本程式(triggerpostun)開始執行”

67

68 %files

69 %defattr (-,root,root)

70 %config /etc/funkey.def

71 %config /etc/inputme.def

72 %doc /usr/doc/lze-6.0/README

73 %doc /usr/doc/lze-6.0/LICENSE

74 /usr/bin/lze

75 /usr/bin/lzeime.py

76 /usr/bin/lzeime.wb

77 /etc/wbzc.dat

78

79 %changelog

80 * Tue Aug 18 1998 雨亦奇

81 – 內置拼音,五筆輸入法

82 * Fri May 01 1998 雨亦奇

83 – 增加多視窗操作

84 * Mon Mar 24 1997 雨亦奇

85 – 增加塊操作命令

86

該描述檔包括以下幾方面的內容:

一、注釋行

見第1-4行。

它以#號開頭,起注解作用,可幫助用戶理解所寫的內容,但對套裝軟體的生成不起任何作用。

此檔中,注釋行集中在檔首部。實際上,它可位於描述檔的任何位置。

二、文件頭

見第6-17行。

檔頭描述套裝軟體的基本資訊,它包含若干個域,其中有必選的域,也有可選的域。一個域佔用一行,其描述格式為:

功能變數名稱 : 域值

注意: 功能變數名稱不分大小寫,並且域值不能為空。

檔頭必選域有以下六個:

1. Name :

此域定義軟體名。

2. Version :

此域定義版本號。僅當軟體較以前有較大改變時才增加版本號。注: 版本號中不能含減號(-)字元。

3. Release :

此域定義釋出號。若軟體較以前改變較小,則僅增加釋出號,不改變版本號。注: 釋出號中亦不能含減號(-)字元。

RPM利用上述的Name(軟體名),Version(版本號),Release(釋出號)及體系號來命名套裝軟體,如本例輸出的包裹檔案名為lze-6.0-2.i386.rpm。

4. Summary :

此域定義套裝軟體簡介,為一句話說明。

5. Group :

此域定義軟體所屬類別,詳見<<精通RPM之五–查詢篇>>,本例的Applications/Editors表示本軟體屬”應用/編輯器”類。

6. License :

此域定義軟體適用的許可證或版權規則。該域也可用Copyright(版權)來定義,二者同意。許可證具體有: GPL(通用公共許可證,自由軟體適用),BSD,MIT,Public Domain(公共域),Distributable(貢獻),Commercial(商業),Share(共用)等。

檔頭可選的域包括如下幾類:

1. 基本資訊

1.1 Vendor :

此域定義軟體的供應商(銷售商)。

1.2 Distribution :

此域定義軟體所屬的發行版,這是套裝軟體製作者自己的分類。通常,一個發行版由若干個套裝軟體構成。如我想做一個名為“熊貓’95”的發行版,則其中每個套裝軟體(如竹葉95)的描述檔都應有這麼一行:

Distribution : 熊貓’95

1.3 Icon :

此域指定套裝軟體所用的圖示檔案名。此檔為GIF或XPM格式,必須存放在RPM的%_sourcedir

(源碼目錄)巨集所指示目錄下,默認為/usr/src/dist/SOURCES。RPM本身並不使用圖示,但它

將圖示檔內容存貯到包裹檔中,安裝時亦存貯到RPM資料庫中。此圖示可被圖形介面的

RPM包管理工具使用,用以改善介面效果,增加可視性。如下例指示套裝軟體使用panda.xpm作

為圖示:

Icon : panda.xpm

1.4 Packager :

此域定義打包者,亦即建立此套裝軟體的人或公司。書寫格式是:

打包者的名字 <電子信箱或相關網頁>

請參考描述檔第13行。

1.5 Serial :

此域定義軟體序列號,也可使用功能變數名稱Epoch。軟體序列號為一整數,由打包者指定,它應隨著版本號的增加而不斷增加,並且始終保持數值的唯一。軟體序列號可被用來說明套裝軟體之間的依賴關係。下例指定套裝軟體序列號為4:

Serial : 4

或用:

Epoch : 4

1.6 URL :

此域定義包含打包軟體有關資訊的網頁位址。如:

URL : http://devplanet.fastethernet.net/gxedit.html

2. 依賴相關

依賴是RPM用來描述套裝軟體之間關係的。一個套裝軟體依賴的東西RPM稱作功能,它可以是真實存在的套裝軟體,也可以是虛擬的套裝軟體(虛包)。虛包沒有版本號。

依賴相關的域有:

2.1 Provides :

此域定義套裝軟體提供的功能,可重複多行。其描述格式為:

Provides : 功能1 [,功能2] …

注: []所括為可選項,多個功能之間以逗號或空格分隔。

套裝軟體所提供的功能一般是以虛包形式存在的共用庫。當有多個套裝軟體均提供相同的服務時,常用虛包來表示其服務。如,一個郵件用戶端軟體允許用戶使用不同的看信方式(文本形式,HTML形式等),可以要求任何一個看信程式必須提供mail-reader虛包。這樣,看信程式的描述檔應有這麼一行:

Provides : mail-reader

如此它才能被郵件用戶端使用。

2.2 Requires :

此域定義套裝軟體所需的功能,可重複多行。其描述格式為:

Requires : 功能1 [比較符1 [序列號1:]版本號1[-釋出號1]] [,功能2 [比較符2 [序列號2:]版本號2[-釋出號2]]] …

其中: * []所括為可選項;

* 比較符可使用<(小於),>(大於),=(等於),>=(大於等於)或<=(小於等於);

* 序列號不選時,RPM默認為0;

* 功能之間的逗號可選,也可使用空格進行分隔。

例子:Requires: aaa, bbb >= 3.0, ccc < 2:5.0-1

注: 本例定義生成的包在安裝時需要系統有如下功能:

(1) aaa(系統中已安裝aaa包,或者已安裝套裝軟體中有套裝軟體提供aaa虛包);

(2) bbb包已安裝且版本要求大於等於3.0;

(3) ccc包已安裝且版本要求小於序列號為2,版本號為5.0且釋出號為1。

RPM在進行版本比較時,執行比較的順序是; 先版本號,再釋出號,最後比較序列號。通過比較,確定哪個版本較新,哪個版本較老。

2.3 Conflicts :

此域定義有哪些功能與本套裝軟體相衝突(不能共存)。此域亦可在描述檔中書寫多次。其描述格式形同Requires域,為:

Conflicts : 功能1 [比較符1 [序列號1:]版本號1[-釋出號1]] [,功能2 [比較符2 [序列號2:]版本號2[-釋出號2]]] …

其中: * []所括為可選項;

* 比較符可使用<(小於),>(大於),=(等於),>=(大於等於)或<=(小於等於);

* 序列號不選時,RPM默認為0;

* 功能之間的逗號可選,也可使用空格進行分隔。

舉個例子:

Conflicts : xxx=1:2.0 yyy>=3.0

注: 本例闡明生成的包衝突的功能有:

(1) 當系統中xxx包版本等於序列號為1且版本號為2.0時;(2) 當系統中yyy包版本大於等於3.0時。

*** 依賴關係的自動實現 ***

一般情況下,當RPM建立一個套裝軟體時,它要執行/usr/lib/rpm目錄下的兩個小程式。一個是find-requires,用於查找套裝軟體所需的共用庫,這些庫將以虛包的形式加入到該套裝軟體所需的功能(Requires)之中。另一個是find-provides,它用於查找套裝軟體所提供的共用庫,這些庫將以虛包的形式加入到該套裝軟體所提供的功能(Provides)之中。這兩個程式都是SHELL程式,代碼量雖小,但確實幫了套裝軟體製作者一個大忙–不必勞心費神地自己寫這樣的依賴關係了,因為程式均自動完成了。

下面三個域用於指示RPM是否執行這兩個程式。

2.4 Autoreq :

此域用於指示RPM是否自動查找軟體所需的共用庫。僅當域值為no或0時,RPM不執行find-requires程式,否則均執行該程式。

2.5 Autoprov :

此域用於指示RPM是否自動查找軟體提供的共用庫。僅當域值為no或0時,RPM不執行find-provides程式,否則均執行該程式。

2.6 Autoreqprov :

此域用於指示RPM是否自動查找軟體所需的共用庫與其提供的共用庫。僅當域值為no

或0時,RPM不執行find-requires與find-provides兩個程式。此域相當於同時設定Autoreq

與Autoprov域值為指定之值。

注: 上述三個域在描述檔中,它們之間因為順序的不同而結果會有所不同,一般以最後一個為准。如:

Autoreq : yes

Autoreqprov : no

Autoprov : yes

注: 本例雖然第一行允許執行find-requires,但第二行又不允許find-requires與find-provides兩個程式運行,而第三行允許find-provides運行,所以依照執行順序,結果為不允許執行find-requires,而允許執行find-provides。

又如:

Autoreq : no

Autoreqprov : yes

Autoprov : no

注: 本例的結果為允許執行find-requires,而不允許執行find-provides。

3. 系統相關

RPM製作套裝軟體時,可以為其指定適用的CPU體系或作業系統,也可為其指定不適用的CPU體系或作業系統,這樣,當RPM發現當前的CPU體系或作業系統與套裝軟體要求的不相容時,將中止套裝軟體的製作。RPM默認的當前CPU體系由宏%_arch定義,一般為i386。RPM默認的當前作業系統由巨集%_os定義,一般為linux。讀者可以通過查看/usr/lib/rpm/macros巨集定義檔得到。

下面四個域說明套裝軟體的適用範圍:

3.1 Excludearch :

此域定義套裝軟體不適用的體系。RPM可選的體系名請參見/usr/lib/rpm/rpmrc檔中的arch_canon專案。

套裝軟體不適用於某個體系,可能有兩方面的原因。一是該軟體還沒有移植到所定義的體系上;二是該軟體含有特定的機器碼(組合語言),它與別的體系不相容。

此域描述格式為:

Excludearch : 體系1 [體系2] …

注: []所括為可選項,各體系之間以空格分隔。

如果當前體系在此域值之中,則RPM製作套裝軟體時將報錯退出,請看下面的例子。

在lze-6.0-2.spec文件頭部分加入一行:

Excludearch : i386

再運行建包命令rpm -bb(<<精通RPM之七–製作篇(下)>>將講到):

# rpm -bb lze-6.0-2.spec

Architecture is excluded: i386

#

由上看出,RPM提示了“體系不適用: i386”的錯誤。

3.2 Exclusivearch :

此域定義套裝軟體適用的體系。其描述格式與Excludearch類似:

Exclusivearch : 體系1 [體系2] …

注: []所括為可選項,各體系之間以空格分隔。

假如在lze-6.0-2.spec文件頭加入一行:

Exclusivearch : i386 sparc

再運行建包命令將會怎麼樣:

# rpm -bb lze-6.0-2.spec

Executing: %prep

預處理腳本程式(prep)開始執行

Executing: %build

編譯連接腳本程式(build)開始執行

Executing: %install

安裝腳本程式(install)開始執行

Processing files: lze

Finding Provides: (using /usr/lib/rpm/find-provides)…

Finding Requires: (using /usr/lib/rpm/find-requires)…

Provides: lze-edit

PreReq: /bin/sh

Requires: /bin/sh ld-linux.so.2 libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1)

Wrote: /usr/src/dist/RPMS/i386/lze-6.0-2.i386.rpm

#

看,此次建包(lze-6.0-2.i386.rpm)成功了,因為當前的體系(i386)正好適用。

3.3 Excludeos :

此域定義套裝軟體不適用的作業系統。RPM可選的作業系統請參考檔/usr/lib/rpm/rpmrc中的os_canon專案。

其描述格式為:

Excludeos : 作業系統1 [作業系統2] …

注: []為可選項,作業系統之間以空格分隔。例如:

Excludeos : irix aix solaris

注: 如將此行加入到lze的描述檔中,則它會指示RPM不在irix,aix,solaris這三個作業系統上建立lze套裝軟體。如果當前作業系統是三者之一,則RPM會報錯並中止套裝軟體的製作。

如:

# rpm -bb lze-6.0-2.spec

OS is excluded: Solaris

#

3.4 Exclusiveos :

此域定義套裝軟體適用的作業系統。其描述格式為:

Exclusiveos : 作業系統1 [作業系統2] …

注: []為可選項,作業系統之間以空格分隔。例如:

Exclusiveos : linux solaris

4. 目錄相關

4.1 Prefix :

此域定義可重定位的目錄首碼,可在描述檔中書寫多次。其描述格式為:

Prefix : 目錄首碼1 [目錄首碼2] …

注: []為可選項,各目錄首碼之間均以空格分隔。例如:

Prefix : /usr /etc

它也可寫作:

Prefix : /usr

Prefix : /etc

RPM利用可重定位的目錄首碼,實現了套裝軟體的重定位安裝, 使軟體中的檔不必固定在某

個絕對位置,這種做法很好。LZE套裝軟體描術文件lze-6.0-2.spec中就定義了一個可重定位

的首碼/usr(見第15行),這樣,安裝時就可將該包中在/usr目錄下的檔重定位到用戶指定

的目錄,如:

# rpm -i –prefix /tmp lze-6.0-2.i386.rpm

#

或者:

# rpm -i –relocate /usr=/tmp lze-6.0-2.i386.rpm

#

注: 此命令安裝lze包,將其中含/usr重定位目錄首碼的檔定位到/tmp目錄。如包中

的/usr/bin/lze檔安裝後,因重定位而成了/tmp/bin/lze。(RPM安裝命令使用方法請參考<<精通RPM之二–安裝篇>>)

4.2 Buildroot :

此域定義的是套裝軟體所包含的檔共有的根目錄,此根目錄僅供RPM建立套裝軟體時使用。即當RPM建立套裝軟體時,將設定此目錄為根(調用chroot函數),提取所需檔,生成套裝軟體。

例如: 當Buildroot設定為/tmp時,對於LZE包描述檔中所包含的/usr/bin/lze檔,RPM實際打包的則是/tmp/usr/bin/lze,但對生成的包查詢後可以發現:原檔案名並未改變,還是/usr/bin/lze。

如此說來,這就很有意思了。一般用戶通過設定Buildroot,也可以象超級用戶(root)那樣自由地建立各種各樣的套裝軟體了,即使包中有那些唯有超級用戶才可以操作的目錄或檔。安裝這樣的包與安裝由超級用戶建立的包,是沒有什麼分別的。

此域的描述格式很簡單:

Buildroot : 目錄

如,上例可定義為:

Buildroot : /tmp

5. 源碼相關

下列四個域均是為製作源碼包而設計的。源碼包裏有什麼?用戶可以通過查詢包的檔列表得到,命令是“rpm -qpl 源碼包文件”(請參閱<<精通RPM之五–查詢篇>>有關內容)。一般情況下,源碼包裏有這麼四類文件: 一是程式源碼(SOURCE),二是源碼補丁(PATCH),三是套裝軟體描述檔,四是圖示檔(ICON)。通過安裝源碼包,用戶可以輕鬆地實現現場編譯、連接和應用,同時更方便了軟體發展者與套裝軟體製作者:他們維護程式容易了,並且維護過後可以很快地生成執行代碼包與源碼包。這,也是所有人鍾愛RPM 的重要原因之一。

5.1 Source :

此域定義RPM打包時要包含的程式源碼檔。這些檔一般先用tar 命令打包,然後再用gzip壓縮。一個描述檔中可包含多個Source域,當有多個這樣的域時,需要進行編號:第1個編為Source0(也可直接用 Source),第2個編為Source1,第3個編為Source2等等。此域的描述格式為:

Source[編號] : 源碼文件

注: []所括為可選項。具體用法如:

Source0 : lze-6.0-2.tar.gz

Source1 : lzeime-wb-6.0-2.tar.gz

Source2 : lzeime-py-6.0-2.tar.gz

Source3 : lze-lib-6.0-2.tar.gz

注: 此域域值可以採用URL(統一資源定位)的形式,如LZE描述檔第14行。採用這種形式,主要是給其他用戶提供該源碼的位置信息。在RPM製作源包時, 它提取的是最後的檔案名lze-6.0-2.tar.gz,而不是http://zhsoft.myetang.com/lze– 6.0-2.tar.gz(URL前面的內容被RPM忽略了)。

5.2 NoSource :

在上例中,假如在打包時不想包含Source1與Source2定義的檔,那該怎麼辦?

辦法之一是將其所在行刪除掉;

辦法之二是將其所在行注釋掉(即所在行前面加#號);

辦法之三就是定義Nosource域,此域可重複。其描述格式為:

NoSource : 源碼域編號

本例可寫作:

NoSource : 1

NoSource : 2

注: 其中的1與2為編號,表示Source1和Source2。

注意: 如果套裝軟體描述檔中沒有NoSource域,則RPM生成的源碼包名字格式為”軟體名-版本號-釋出號.src.rpm”。如果使用了NoSource 域,則RPM生成的源碼包名字格式為”軟體名-版本號-釋出號.nosrc.rpm”(單從名字就可看出源碼包包含的檔不完整)。

5.3 Patch :

Patch的本義是補丁,用在這裏指的是根源程式的補丁,它是用diff命令比較新老根源程式所產生的輸出(命令為“diff -Nur 舊檔 新文件 >補丁檔”),而系統中的patch命令又可利用此輸出將老版本的根源程式升級為新版本。

此域定義RPM製作源碼包時所要包含的補丁檔,該檔的命名建議用”軟體名-版本號.補丁功能.patch”的格式。一個套裝軟體描述檔中可有多個 Patch域,當有多個這樣的域時,也需要象Source域那樣進行編號(注:第1個域編為Patch0,也可省略0,用Patch)。

此域的描述格式為:

Patch[編號] : 源碼補丁文件

注: []所括為可選項。具體用法如:

Patch0 : blather-4.5-bugfix.patch

Patch1 : blather-4.5-config.patch

Patch2 : blather-4.5-somethingelse.patch

注: 此域的域值也可以象Source域一樣,採用URL的形式,RPM僅提取其中的檔案名供其使用。

5.4 NoPatch :

此域的功能類似NoSource,其定義的編號對應的補丁檔RPM不作打包處理。此域在描述檔中可重複出現。如上例,若不想讓源碼包包含Patch0與Patch2域所指示的補丁檔,則可在描述檔寫上這麼兩行:

NoPatch : 0

NoPatch : 2

注意: 如果套裝軟體描述檔中沒有NoPatch域,則RPM生成的源碼包名字格式為”軟體名-版本號-釋出號.src.rpm”。如果使用了NoPatch域, 則RPM生成的源碼包名字格式為”軟體名-版本號-釋出號.nosrc.rpm”(單從名字就可看出源碼包包含的檔不完整)。

三、功能段

見第19-86(即檔頭以下的部分)。

何謂功能段?可以這麼說,功能段是描述套裝軟體的重要資料和操作指令的段落,它包括段名與段內容兩部分。沒有功能段,RPM便製作不出任何包裹檔。功能段的段名都是以百分號(%)開始的,佔用一行。功能段的段內容範圍是這樣界定的:它從該功能段段名下一行開始到下一個功能段段名的前一行或到描述檔結束。如LZE描述檔,%description段是從第19行到第28行(%prep段從第29行開始),第19行為段名,第20-28行為段內容。而%prep段是從第29行到第32行(第33行%build段開始),其段名在第29行,段內容在第30-32行。另外要注意的是,各個功能段的位置是自由的,可放在檔頭以下的任何位置,不必拘泥某一固定位置。

必選的功能段

描述檔中,必選的功能段有:

1. %description

本段是描述段,段的內容是對套裝軟體進行較為詳細的介紹,不象檔頭的Summary域僅用一句話說明。介紹的文本形式自由,可任意換行,不受限制。具體請參見LZE描述文件第20-27行。

本段段名描述格式是:

%description [子包選項]

其中,子包選項的格式為:[-n] 子包名

注: []所括為可選項。

三種形式的描述段段名:

(1) 段名格式為“%description”時:

本功能段描述的內容是關於父包的。父包也可叫作主套裝軟體,它用軟體名來命令,其名字格式是:軟體名-版本號-釋出號.體系.rpm。如:lze-6.0-2.i386.rpm。

(2) 段名格式為“%description 子包名”時:

本功能段描述的內容是關於子包的。子包選項中沒有-n選項時,子包是用軟體名加子包名的形式命名,格式為: 軟體名-子包名-版本號-釋出號.體系.rpm。如分成兩個子包的LZE軟體:lze-bin-6.0-2.i386.rpm(執行套裝程式),lze- config-6.0-2.i386.rpm(配置檔包)。

(3) 段名格式為“%description -n 子包名”時:

本功能段描述的內容也是關於子包的。當子包選項中有-n選項時,子包直接採用子包名的形式命名。它不包含軟體名,命名格式為: 子包名-版本號-釋出號.體系.rpm。如分成兩個子包的LZE軟體: bin-6.0-2.i386.rpm(執行套裝程式),config-6.0-2.i386.rpm(配置檔包)。注意:這種類型的子包內容通常是可被其他套裝軟體共用的函數庫,如果專用,則儘量不要採用這樣形式來定義子包。

2. %files

本段是檔段,它定義的是套裝軟體需要包含哪些檔。本段通常放在描述檔尾部,以便於添加檔案名,便於編輯。

本段段名描述格式為:

%files [子包選項] [-f 檔案名]

注: []所括為可選項。

當沒有任何選項時,本段內容定義的是父包要打包的檔列表;

當有子包選項時,本段內容定義的則是子包要打包的檔列表;

當選擇-f選項時,RPM除了從檔段讀取打包檔列表外,還將從指定的檔中讀取要打包的檔列表。指定的檔中,一個檔案名佔用一行。此選項方便了套裝軟體製作者,他們可以通過程式自動產生有關軟體的檔列表,並將其寫入到一個特定的檔中,這樣製作套裝軟體時,只需引用一下這個檔,RPM就會自動從這個檔中讀取檔案名並將其加入包中。如果沒有此選項,套裝軟體製作者只能在檔段裏,將要打包的檔案名一個一個寫進去,有點麻煩。

檔段的內容格式為:

[修飾符1 [修飾符2] …] 檔案名

其中:修飾符是可選的,一個檔可以有多個修飾符,檔案名必須以/開頭(絕對路徑形式)。

修飾符有以下幾類:

(1) 檔相關

* %doc :

此修飾符設定檔類型為說明文檔(參見LZE描述檔第72,73行);

* %config :

此修飾符設定檔類型為配置檔(參見LZE描述檔第70,71行);

* %config(missingok) :

此修飾符設定檔類型為配置檔,且此檔可丟失。即使丟失了,RPM在卸載套裝軟體時並不認為這是個錯誤,並不報錯。

此修飾符通常用於那些套裝軟體安裝後建立的符號連接檔,如/etc/rc.d/rc2.d/S55named等。此類檔在套裝軟體卸載後可能需要刪除,所以丟失了也不要緊。

* %config(noreplace) :

此修飾符設定檔類型為配置檔,且如果安裝時系統中有同名的檔,則套裝軟體中的這個檔將換個名字安裝,其檔案名尾碼加個.rpmnew。(如果不用此修飾符,則安裝時RPM若發現有同名檔,則RPM會將系統中的這個檔換個名字,其尾碼加上.rpmorig,而套裝軟體中的文件則還用原來的名字。) 在套裝軟體卸載時,系統中的同名檔被RPM換個名字保存起來,其尾碼加上了.rpmsave。

如描述檔的檔段中定義了這麼一行:

%config(noreplace) /etc/hello

則製成的包在安裝時,若系統中已有此檔/etc/hello,則RPM會提示:

warning: /etc/hello created as /etc/hello.rpmnew

這表明包中的/etc/hello檔被創建為/etc/hello.rpmnew文件了。

如果卸載這個套裝軟體,則系統中的/etc/hello將會改名為/etc/hello.rpmsave。

* %ghost :

此修飾符所修飾的檔,其內容不被包含到套裝軟體中。這樣的檔一般是日誌檔(log file)一類的檔,其檔屬性(檔案名,屬主,屬組等)很重要,但是檔內容並不重要。用此修飾符後,RPM僅將其檔屬性加入包中。

* %attr :

此修飾符設定檔的屬性資訊,使用格式為:

%attr(許可權,屬主,屬組)

注: 許可權常用數位形式(八進制),屬主和屬組可以是數位,也可以是字串。如果檔的許可權,屬主和屬組想使用系統預設值,則可用減號(-)表示它。

如下例採用兩個修飾符,定義/etc/funkey.def文件的許可權為755,屬主默認,屬組為root,類型為配置檔:

%attr(755,-,root) %config /etc/funkey.def

* %verify :

此修飾符設定檔需要校驗的那些屬性。這些屬性有:owner(屬主),group(屬組),mode(許可權),md5(MD5檢查和),size(大小),maj(主設備號),min(從設備號),symlink(符號連接),mtime(最後修改時間)。

此修飾符使用格式為:

%verify([not] owner group mode md5 size maj min symlink mtime)

注: not可選。當選用not時,表明需要校驗除選定屬性以外的那些屬性。

如下例指示RPM校驗/dev/ttyS0檔時,要校驗其許可權,MD5檢查和,大小,主設備號,從設備號,符號連接和最後修改時間共七項屬性資訊:

%verify(mode md5 size maj min symlink mtime) /dev/ttyS0

這也可以採用not選項來實現,因為除去屬主owner和屬組group兩項屬性,剩下的就是需要校驗的屬性了:

%verify(not owner group) /dev/ttyS0

(2) 目錄相關

* %docdir :

此修飾符定義說明文檔首碼,這樣,後面所有含指定檔名作為首碼的檔,RPM打包時會將其類型統一設定為說明文檔。

例如某描述檔的檔段中有這麼三行:

/root/readme

%docdir /root

/root/mydoc.txt

此例指明/root為說明文檔的首碼,因為/root/mydoc.txt在%docdir的下一行,所以RPM打包時會設定此檔的類型為說明文檔。而/root/readme檔則不做此設定,因為它在%docdir定義之前。

通過此修飾符,用戶可以很方便地設定說明文檔一類的檔,因為它們通常固定在某個目錄下面,有著共同的首碼。

* %dir :

RPM在製作套裝軟體時,如果要打包的檔是個目錄,那麼RPM會將該目錄下面的所有檔包含到套裝軟體中。(注意:如果要打包的檔是個符號連接,此符號連接又指向一個目錄,則RPM並不會將其視作目錄,只會把它當為普通檔處理。)如果僅想將這個目錄名包含到套裝軟體中,製作者用此修飾符修飾一下這個目錄名就行了。

如: /etc是個系統目錄,其下有多個檔,如果想將其均加入包中,描述檔的文件段裏可寫上這麼一行:

/etc

如果僅想包含此目錄,則可用:

%dir /etc

(3) 另類修飾符

此類只有一個%defattr。說它是另類修飾符,是由於它設定的是默認的檔屬性,而非特定的某個檔。它一般放在檔段內容的第一行。

其使用格式為:

%defattr(許可權,屬主,屬組)

其中: 許可權,屬主和屬組都可以使用減號(-)。使用減號的屬性將由系統設定。

例如: %defattr(022,zzz,zhsoft) 設定其後的所有檔許可權為022,屬主為zzz,屬組為zhsoft;又如: %defattr(-,zzz,-) 則是設定其後的所有檔屬主為zzz,許可權與屬組由系統設置。

可選的功能段

描述檔中,可選功能段的內容都是些腳本程式。(LZE描述檔中多個腳本程式中僅含一個echo命令)

可選的功能段的描述格式為:

功能段名 [子包選項]

注: 子包選項為”[-n] 子包名”。當無子包選項時,段內容描述的是父包的腳本程式。當有子包選項時,段內容則是描述子包的腳本程式。

可選的功能段可分為如下三類:

1. 建包用功能段:

RPM通過根源程式來建立一個套裝軟體時,要執行預處理,編譯,安裝和清理四項操作,分別對應於%prep,%build,%install和%clean四個段。

下面按其執行順序逐段進行說明:

1.1 %prep :

此為預處理段,其內容為預處理腳本程式。該程式完成以下任務:

* 建立軟體編譯用目錄;

* 將根源程式解壓縮;

* 通過打補丁,升級根源程式;

* 執行其他一些操作,使根源程式隨時可進行編譯。

在此腳本程式中,可使用如下兩個巨集命令:

1.1.1 %setup

這個巨集利用系統中的gzip與tar等命令,來解壓根源程式包。RPM會自動探測根源程式包是否壓縮,如果壓縮,它會用gzip將其解壓縮,否則直接用tar命令展開包中檔。其使用格式為:

%setup [-n name] [-c] [-D] [-T] [-b N] [-a N]

注: []所括為可選項。

(1) 當沒有任何選項時:

這個宏用來解壓默認的根源程式包(由檔頭Source或Source0域指定)。注意:根源程式包中的文件應用”軟體名-版本號”作為其上層目錄,這樣%setup巨集就可以正常工作。如果不以”軟體名-版本號”作為其上層目錄,則%setup巨集工作時有一個指令”cd 軟體名-版本號”(轉目錄)會因為系統中沒有此目錄而出錯退出(除非在此巨集上面加上建立此目錄的命令)。如LZE軟體根源程式所在的目錄為lze-6.0, 我需要用命令”tar cvzf lze-6.0-2.src.tgz lze-6.0″將根源程式打包並壓縮,這樣的包就可以被%setup宏正確使用了。

下麵是%setup巨集命令所執行的一系列命令: (指令前面為行號)

1 cd /usr/src/dist/BUILD

2 echo “預處理腳本程式(prep)開始執行”

3 cd /usr/src/dist/BUILD

4 rm -rf lze-6.0

5 /bin/gzip -dc /usr/src/dist/SOURCES/lze-6.0-2.src.tgz | tar -xvvf –

6 STATUS=$?

7 if [ $STATUS -ne 0 ]; then

8exit $STATUS

9 fi

10 cd lze-6.0

11 [ `/usr/bin/id -u` = ‘0’ ] && /bin/chown -Rhf root .

12 [ `/usr/bin/id -u` = ‘0’ ] && /bin/chgrp -Rhf root .

13 /bin/chmod -Rf a+rX,g-w,o-w .

14 exit 1

看,第10行就有一個轉到lze-6.0目錄的命令,如果沒有這個目錄,程式就會出錯退出了。也許你要問:這些指令你是怎麼知道的?其實這很簡單,只要在%setup宏下面加上一句”exit 1″命令,讓預處理腳本程式非正常退出即可。這樣RPM所執行的預處理腳本程式作為暫存檔案在其退出時並未刪除,只要看一下這個檔(在/var/tmp 目錄下以rpm-tmp開頭)就知道%setup巨集命令做什麼了。

(2) -n name :

上面已經談到,根源程式包中的檔應採用”軟體名-版本號”作為上層目錄。如果用了別的什麼目錄(如name),%setup宏無法正常工作,那該怎麼辦?沒關係,可以用 -n選項,引用一下這個目錄(name)就行了。假如我的LZE根源程式包中的檔是以lze為上層目錄,那麼我就可以用”%setup -n lze”巨集命令來解壓縮該包。

(3) -c :

此選項的作用是創建上層目錄(“軟體名-版本號”目錄)並轉到這個目錄。對於LZE軟體,其效果相當於在上例的第4行與第5行之間加上這麼兩行命令:

mkdir -p lze-6.0

cd lze-6.0

它適用的情況是:有的根源程式包是在根源程式所在目錄下打的包,所以其中的檔都沒有上層目錄。這樣的話,要想正確解壓,必須創建上層目錄。

(4) -D :

本選項的作用是在解壓根源程式包之前不要刪除軟體的上層目錄(軟體名-版本號)。在上例中,其效果是不執行第4行的命令(rm -rf lze-6.0)。

(5) -T :

本選項的作用是不解壓默認的根源程式包(由檔頭的Source或Source0域所定義)。在上例中,其效果是不執行第5-9行的命令:第5行是解壓根源程式包(用gzip -dc將包的內容解壓縮到管道中,再由tar -xvvf -從管道中讀取資料並展開),第6-9行是檢查解壓命令的返回值,非0時執行非正常退出。

(6) -b N :

本選項指示RPM在轉到上層目錄前解壓第N個根源程式包(由檔頭SourceN域定義)。這適用於含上層目錄的根源程式包。注意:如果使用此選項時不同時使用-T選項,則RPM解壓的是兩個根源程式包,一個是默認的包(由Source或Source0域定義),一個是-b選項指定的包(由SourceN域定義)。這樣,當N等於0時,默認的根源程式包將被解壓兩次。所以,如果想僅解壓指定根源程式包,請同時使用-T選項,以禁止解壓默認的根源程式包。

下面的巨集命令僅解壓第1個根源程式包,然後轉到上層目錄:

%setup -b 1 -T

(7) -a N :本選項指示RPM在轉到上層目錄後再解壓第N個根源程式包(由檔頭SourceN域定義)。這適用於不含上層目錄的根源程式包。使用本選項時,一般加上 -c選項,以創建上層目錄並轉到此目錄。注意:如果使用此選項時不同時使用-T選項,則RPM解壓的是兩個根源程式包,一個是默認的包(由Source或 Source0域定義),一個是-a選項指定的包(由SourceN域定義)。這樣,當N等於0時,默認的根源程式包將被解壓兩次。所以,如果想僅解壓指定根源程式包,請同時使用-T選項,以禁止解壓默認的根源程式包。

下麵的巨集命令讓RPM先轉到上層目錄,再僅解壓第2個根源程式包:

%setup -T -a 2

1.1.2 %patch

此巨集利用系統中的patch命令,來給指定的根源程式包打補丁,從而將程式升級。其使用格式為:

%patch [-P N] [-p N] [-b name] [-E]

注: []所括為可選項。

為了說明下列選項的作用,我們為LZE套裝軟體描述檔中定義三個補丁檔:

Patch0 : lze-patch.zero

Patch1 : lze-patch.one

Patch2 : lze-patch.three

(1) 當沒有任何選項時:

沒有任何選項時,該巨集使用的是默認的補丁檔(第0個補丁文件),即由檔頭Patch或Patch0域所定義的檔(LZE包使用lze-patch.zero)。

該巨集在執行時,擴展為以下指令:

echo “Patch #0:”

patch -p0 -s < /usr/src/dist/SOURCES/lze-patch.zero

注: 第一行指令是利用echo命令向螢幕輸出字串“Patch #0:”。第二行指令則是利用patch命令讀取補丁檔lze-patch.zero升級根源程式。

patch命令用了兩個選項:(有關patch命令用法,詳見其用戶手冊)

* -p : 這個選項用於確定patch所要操作的檔。它針對補丁檔頭部的檔案名,刪除名字中指定數目個斜杠(/)前面的所有字元,從而得到要操作的檔案名。如補丁檔裏有個檔案名/usr/zzz/src/lze.c,則用-p0時patch操作的檔案名不變,用-p1時則變為usr/zzz/src /lze.c,用-p2時則變為zzz/src/lze.c,如用-p4則操作的檔案名變為lze.c。

* -s : 這個選項指示patch在打補丁過程中不輸出任何資訊,即使有錯誤發生。

(2) -P N :

使用此選項以指示RPM使用第N個補丁檔(由檔頭PatchN域定義)。如想讓RPM使用LZE的第2個補丁檔Patch2(lze-patch.three)時,可使用”-P 2″來指定。

(3) -p N :

此選項與其參數是由%patch宏直接傳給patch命令的。請參見上面patch命令所用的-p選項的介紹。

(4) -b name :

當有多個patch命令操作同一個檔時,patch會將原文件換名保存(其尾碼變作.orig),如lze.c會變作lze.orig。如果想用別的名字作尾碼,則可用-b設置一下,這樣原文件會換名為”原檔案名+尾碼”,如用-b ZZZ時,lze.c會換名保存為lze.cZZZ。

此選項在執行時,實際上是給patch命令傳遞了一個選項及參數,即–suffix name。

(5) -E :

此選項直接傳給patch命令,其作用是:如果一個檔打完補丁後內容為空(位元組數為0),則刪除這個檔。

1.2 %build :

此為編譯段,其內容為編譯腳本程式。該程式完成根源程式的編譯和連接。一個最簡單的例子就是程式中僅有一個make命令。這適用於大部分情況,因為多數軟體均有自己的makefile,這樣通過make命令就可實現編譯與連接。如果沒有makefile的話,需要套裝軟體製作者自己在編譯段書寫上一系列的編譯連接命令。

1.3 %install :

此為安裝段,其內容是安裝腳本程式。該程式將已編譯連接好的執行程式或其他檔存放到指定目錄下,這些程式或檔供RPM打包時使用。一個最簡單的例子就是程式中僅用一個make install命令,從而完成安裝。這也需要相應的軟體有makefile維護檔。沒有的話,套裝軟體製作者也得自己寫指令。

1.4 %clean :

此為清理段,其內容是清理腳本程式。此程式在RPM製作好套裝軟體後才執行,它通常是刪除那些編譯連接時產生的暫存檔案或目錄,完成繕後工作。

2. 管理用功能段:

此類段用於套裝軟體自身的管理(安裝,卸載和校驗),包括%pre,%post,%preun,%postun,和%verifyscript五個功能段。

2.1 %pre :

該段內容為安裝前腳本程式。它在套裝軟體安裝之前執行,通常是檢測操作環境,建立有關目錄,清理多餘檔等等,為套裝軟體的順利安裝做準備。本段很少使用。

其段名格式為: %pre [子包選項]

2.2 %post :

該段內容為安裝後腳本程式。它在套裝軟體安裝完成之後執行,常用來建立符號連接,修改系統配置檔,運行ldconfig程式等,以利軟體的正常運行。

其段名格式為: %post [子包選項]

2.3 %preun :

該段內容為卸載前腳本程式。它在套裝軟體卸載之前執行,主要為卸載做準備。具體如,要卸載的套裝軟體中某個程式當前正在運行時,此腳本程式必須殺掉它,否則無法正確卸載。

其段名格式為: %preun [子包選項]

2.4 %postun :

該段內容為卸載後腳本程式。它在套裝軟體卸載後執行,完成卸載的繕後工作,如將系統配置檔inetd.conf改回原來的樣子,重新運行一下ldconfig命令,將已卸載的共用庫從緩衝檔ld.so.cache中刪除等等。

其段名格式為: %postun [子包選項]

2.5 %verifyscript :

該段內容為校驗腳本程式。RPM校驗套裝軟體時,除了執行標準的校驗外,如果套裝軟體製作者設定有此校驗腳本程式,還將執行之。

其段名格式為: %verifyscript [子包選項]

下麵是XFree86-libs-3.3.6-6.i386.rpm套裝軟體中的校驗腳本程式,它校驗的是動態連結程式庫目錄/usr/X11R6/lib。校驗時,在/etc/ld.so.cache檔中查找/usr/X11R6/lib,如果找不到,則顯示”missing”,找到則顯示”found”。

# verifyscript

echo -n “Looking for /usr/X11R6/lib in /etc/ld.so.conf… ”

if ! grep “^/usr/X11R6/lib$” /etc/ld.so.conf > /dev/null

then

echo “missing”

echo “/usr/X11R6/lib missing from /etc/ld.so.conf” >&2

else

echo “found”

fi

3. 交互用功能段:

這類功能段有%triggerin,%triggerun,%triggerpostun,它們的內容都是RPM用於套裝軟體之間交互控制的腳本程式。這些腳本程式都是在系統滿足指定的條件下才觸發執行的:

1) %triggerin : 段內為安裝時觸發腳本程式,當其所在套裝軟體與指定套裝軟體僅有一方已安裝時,安裝另一方將觸發此程式執行;

2) %triggerun : 段內為卸載時觸發腳本程式,當其所在套裝軟體與指定套裝軟體都已安裝時,卸載二者中的任一個將觸發此程式執行;

3) %triggerpostun : 段內為卸載後觸發腳本程式,只有指定套裝軟體卸載後才觸發此程式執行。

3.1 段名格式

它們的段名描述格式均為:

交互段名 [子包選項] [-p 解釋程式] — 觸發條件1 [,觸發條件2] …

注: []所括為可選項。子包選項見前面介紹,不贅述。

3.1.1 -p選項:

此選項用於指定一個解釋程式,來解釋執行交互功能段的腳本程式。默認情況下,RPM使

用/bin/sh來執行腳本(此類腳本用SHELL語言編寫,也叫SHELL程式)。有的RPM包則是使用/usr/bin/perl

來執行腳本(此類腳本是用PERL這種解釋性語言寫的),這就需要用-p選項來指定解釋程式為

/usr/bin/perl,如:

%triggerin — sendmail

ln -sf /usr/bin/sendmail /etc/mymailer/mailer

%triggerin — vmail

ln -sf /usr/bin/vmail /etc/mymailer/mailer

注: 此例中定義package子套裝軟體安裝時觸發腳本程式:當觸發條件(fileutils>3.0,perl<1.2)滿足時,用/usr/bin/perl執行腳本,即用print命令輸出字串”I’m in my trigger!”。

3.1.2 觸發條件:

交互功能段的觸發條件格式是:

功能名 [比較符 版本號]

其中:比較符與版本號可選。僅有一個功能名時,表明該功能存在時觸發程式執行。比較符可用大於(>),等於(=),小於(<),大於等於(>=)和小於等於(<=)。

如觸發條件bash,又如觸發條件fileutils>3.0,這種使用均合法。

交互功能段最少有一個觸發條件。當有多個觸發條件時,這些條件間均以逗號(,)分隔,它們之間是”或”的關係,即只要其中有一個條件系統滿足,RPM就將執行觸發腳本程式。如上面介紹-p選項時舉的例子:例子中有兩個觸發條件fileutils>3.0和perl<1.2,在安裝套裝軟體時, 只要有一個條件滿足,RPM就會執行觸發腳本,即輸出”I’m in my trigger!”。

3.2 交互用功能段的使用

為什麼要使用交互用功能段?下面的例子很能說明問題。

假定mymailer套裝軟體需要/etc/mymailer/mailer這個符號連接檔指向當前使用的郵件發送代理程式。如果sendmail包安裝了,那麼這個符號連接檔應指向/usr/bin/sendmail程式。如果vmail包安裝了,那麼它應當指向/usr/bin/vmail程式。如果這兩個套裝軟體都安裝了(實際上,sendmail與vmail彼此是衝突的),那麼我們也無需考慮符號連接指向哪個檔了。當然,如果這兩個包都未安裝,那麼/etc/mymailer/mailer符號連接檔也沒有理由存在了。

上述要求,我們通過為mymailer套裝軟體編寫觸發腳本程式來實現,這些腳本程式在下列事件發生時,將改變/etc/mymailer/mailer符號連接的內容:

1) sendmail已安裝;

2) vmail已安裝;

3) sendmail卸載時;

4) vmail卸載時。

前兩個事件觸發的腳本程式可以這樣寫:

%triggerin — sendmail

ln -sf /usr/bin/sendmail /etc/mymailer/mailer

%triggerin — vmail

ln -sf /usr/bin/vmail /etc/mymailer/mailer

這是兩個安裝時被sendmail或vmail所觸發腳本程式。它們將在下列情況下執行:

1) 在mymailer包已安裝的情況下,安裝或升級sendmail包;

2) 在mymailer包已安裝的情況下,安裝或升級vmail包;

3) 在sendmail包已安裝的情況下,安裝或升級mymailer包;

4) 在vmail包已安裝的情況下,安裝或升級mymailer包。

後兩個事件觸發的腳本程式可以這麼寫:

%triggerun — sendmail

[ $2 = 0 ] || exit 0

if [ -f /usr/bin/vmail ]

then

ln -sf /usr/bin/vmail /etc/mymailer/mailer

else

rm -f /etc/mymailer/mailer

fi

%triggerun — vmail

[ $2 = 0 ] || exit 0

if [ -f /usr/bin/sendmail ]

then

ln -sf /usr/bin/sendmail /etc/mymailer/mailer

else

rm -f /etc/mymailer/mailer

fi

這兩個腳本程式在下列情況下觸發執行:

1) 在sendmail包已安裝的情況下,卸載mymailer包;

2) 在vmail包已安裝的情況下,卸載mymailer包;

3) 在mymailer包已安裝的情況下,卸載sendmail包;

4) 在mymailer包已安裝的情況下,卸載vmail包。

為了確保在mymailer包卸載後符號連接檔/etc/mymailer/mailer也被刪除,可以在

mymailer套裝軟體描述檔的%postun功能段內,加上刪除該檔的命令:

%postun

[ $1 = 0 ] && rm -f /etc/mymailer/mailer

注: %postun段內為卸載後執行腳本程式,在mymailer包卸載後執行。

由上看出,當一個套裝軟體與另一個套裝軟體存在密切關係時,我們可以通過交互用功能段實現某些檔的管理,這不僅擴展了RPM套裝軟體管理的功能,又有助於套裝軟體的正常運行。

4. 其他功能段

其他功能段只有一個,即%changelog。這個段的內容是軟體維護記錄,它記錄每次軟體維護的時間,維護人及其EMAIL,維護的專案等。

%changelog段內容格式為:

* 星期 月份 日子 年份 維護內容

注: 每個維護記錄均以*開頭,星期,月份均須為英文縮寫。維護內容多時可分行編寫,

每行開頭最好以減號(-)開頭。可以採用類似LZE方式的維護記錄寫作格式:(見LZE描述檔第80-85行)

一個RPM的套裝軟體描述檔,可以僅生成一個父包或一個子包,也可以生成一個父包和多個子包。通過設定子包選項,可以使生成的子包採用”軟體名-子包名”的標準命名,也可使生成的子包採用自己的名字。一個子包,通常是按照其包含的檔的用途或類型來歸併檔進而打成包裹的。象前面的LZE描述檔很簡單,它將所有檔都包含進了父包中。我們也可以將檔分類作成子套裝軟體,如可分成執行程式子包(lze-bin),配置檔子包(lze-config) 和說明文檔包(lze-doc)。我們還可以只分出一個配置檔子包(lze-config),其餘檔均打入父包中(lze)。通過這樣詳細地分類,有助於用戶管理套裝軟體,避免安裝多餘的東西,同時也有助於升級。

要想創建子套裝軟體,必須描述以下內容:

1. %package :

用此段創建一個子包。其名字由子包選項控制。子包選項為”[-n] 子包名”,不選-n時,生成的子包檔為”軟體名-子包名-版本號-釋出號.體系.rpm”;選-n時,生成的子包檔為”子包名-版本號-釋出號.體系.rpm”。其應用格式為:

%package 子包選項

2. Summary

此域必須在%package下面,它定義子包功能簡介(一句話說明)。格式為:

Summary : 子包簡介

3. Group

此域必須在%package下面,其定義子包所屬軟體類別(軟體類別請參見<<精通RPM之五–查詢篇>>)。格式為:

Group : 軟體類別

4. %description :

此描述段的內容是較為詳細的子包功能介紹,介紹為文本形式,格式不作要求,可任意換行或分段。格式為:

%description 子包選項

…介紹子包功能的內容…

5. %files :

此檔段的內容是子包所要包含的檔列表。檔列表中,一個檔佔用一行,還可使用多種檔修飾符。(詳見<<精通RPM之七–製作篇(上)>>)

段名應用格式為:

%files 子包選項 [-f 檔案名]

注意: 上述%description與%files段所用的子包選項形式,必須與%package所用的子包選項形式一致,否則的話,它們定義的不是同一個子包,RPM檢查時將報錯退出。如定義過%package name後,描述段名須用%description name,檔段名須用%files name方可。而用%description -n name則不行,%files -n name也不行。

子套裝軟體也可使用%pre,%post,%preun,%postun,%triggerin,%triggerun和%triggerpostun等七個可選的功能段,因為它們都可使用子包選項。當使用子包選項時,它們的段內容就是用來管理子套裝軟體的腳本程式。要注意的是,這些段使用的子包選項形式也必須與%package段使用的子包選項形式一致。

條件語句的使用

在套裝軟體描述檔中,可以靈活地使用條件語句,位置不限制。這些語句,用於當前體系與作業系統的判斷,當條件為真或為假時,RPM均會引用其相應的描述內容。

條件語句有兩種格式:

1. {%ifarch,%ifnarch,%ifos,%ifnos} 值1 [值2] …

描述內容

%endif

注: {}所括內容必選其中之一,[]所括為可選項,各個值之間以空格分隔,%endif表示條件語句結束。

此語句的含義是:

1) 使用%ifarch時,表示如果當前體系為值1或值2…,則引用描述內容。

2) 使用%ifnarch時,表示如果當前體系不為值1或值2…,則引用描述內容。

3) 使用%ifos時,表示如果當前作業系統為值1或值2…,則引用描述內容。

4) 使用%ifnos時,表示如果當前作業系統不為值1或值2…,則引用描述內容。

如果想在LZE包描述檔的檔段增加只適用於sparc體系的檔/etc/sparc.lze和 /etc/sparc.ime,則可在文件段內加入如下語句:

%ifarch sparc

/etc/sparc.lze

/etc/sparc.ime

%endif

這樣做以後,如果當前體系為sparc,則RPM在打包時會加入這兩個文件。

2. {%ifarch,%ifnarch,%ifos,%ifnos} 值1 [值2] …

描述內容1

%else

描述內容2

%endif

注: {}所括內容必選其中之一,[]所括為可選項,各個值之間以空格分隔,%else表示另外一種情況,%endif表示條件語句結束。

此語句的含義是:

1) 使用%ifarch時,表示如果當前體系為值1或值2…,則引用描述內容1,否則引用描述 內容2。

2) 使用%ifnarch時,表示如果當前體系不為值1或值2…,則引用描述內容1,否則引用描述內容2。

3) 使用%ifos時,表示如果當前作業系統為值1或值2…,則引用描述內容1,否則引用描述內容2。

4) 使用%ifnos時,表示如果當前作業系統不為值1或值2…,則引用描述內容1,否則引用描述內容2。

如果想根據當前作業系統來確定LZE包的名字,則可在描述檔頭使用如下語句定義Name域:

%ifos linux

Name : lzeforlinux

%else

%ifos aix

Name : lzeforaix

%else

Name : lzeforothersys

%endif

%endif

本例中使用了嵌套的條件語句,它說明的情況是:如果作業系統為linux,則軟體名定為lzeforlinux,如果作業系統為aix,則軟體名定為lzeforaix,如果不是上述兩個作業系統,則將軟體名定為lzeforothersys。

如何在描述檔中使用宏(macros)

1. 宏是什麼?

學過C語言的人都知道,巨集是用來實現文本替換的,即定義了巨集名與巨集體後,檔中所有有宏名的地方在預處理時將被宏體替換掉。使用巨集可以減少文字的錄入量,方便了編程人員。在套裝軟體描述檔中使用巨集,也是基於這個目的,只不過這個巨集與C語言的巨集定義格式不同而已。

2. 宏的定義

描述檔中宏的定義格式為:

%define [(opts)]

注: []所括為可選項。為巨集名,巨集名可用字母,數位和下劃線(_),並且其長度最小為3。opts為一個或多個選項,各選項之間無分隔,選項採用getopt 函數要求的形式,即選項為單個字元,如果某個選項需要參數,則需要在這個選項後加個冒號(:)。為巨集體,它周圍的空字元將被刪掉。巨集體的內容須在一行上。

如沒有選項的巨集定義:

%define aaa “This is my software”

如僅有一個選項的巨集定義:

%define xxx(p:Z) echo %{-p:%{-p*}} %{-Z}

3. 宏的使用

宏的使用格式為:

% [opt1] [opt2]… [arg1] [arg2]…

%{} [opt1] [opt2]… [arg1] [arg2]…

注: []所括為可選項;為所應用的巨集名,巨集名可以用{}括住;opt1,opt2…為選項,均須以減號(-)開頭,並且如果選項需要參數,則必須提供一個選項參數;arg1,arg2…則為宏的參數。

如上面定義的xxx宏,可這樣使用:

%xxx -p zhsoft hello world<

br>

例子中,xxx巨集使用一個選項-p,zhsoft為-p選項的參數,還有兩個宏的參數hello和world。

注意: 巨集使用時最好多換一行(即宏下面空一行),因為宏在擴展後並不換行,這樣如果不多換行,則下面一行若有內容的話,巨集擴展後的內容將和下面一行的內容合併在一起,極容易出現錯誤。這也是筆者發現RPM宏的問題之一。還有一個問題,如果注釋行上存在巨集,則這個巨集也將擴展,錯矣!因為注釋本來就是要忽略掉的,有宏也不必再擴展了。這兩個問題都需要引起RPM開發者的注意,並切實加以解決。

4. 巨集體專用的巨集

巨集體中可使用如下專用的宏:(類似SHELL形式的宏)

1) %0 : 表示所在巨集的巨集名;

2) %* : 表示宏的所有參數;

3) %# : 表示宏的參數個數;

4) %{-f} : 表示如果巨集使用了-f選項,則它表示-f及其選項參數;

5) %{-f*} : 表示如果巨集使用了-f選項,則它表示-f所帶的參數;

6) %{-f:X} : 表示如果巨集使用了-f選項,則它表示X;

7) %{!-f:Y} : 表示如果巨集沒有使用-f選項,則它表示Y;

8) %1,%2,… : 表示宏的參數1,參數2…

如,上例中xxx巨集執行時,若巨集體中有上述專用的巨集,則專用巨集將會擴展為:

1) %0擴展為xxx;

2) %*擴展為hello world;

3) %#擴展為2;

4) %{-p}擴展為-p zhsoft;

5) %{-p*}擴展為zhsoft;

6) %{-p:good}擴展為good;

7) %{!-Z:bad}擴展為bad; (因為xxx巨集未使用-Z選項)

8) %1為hello,%2為world,沒有其他參數。

5. 系統內置的巨集

系統內置的巨集可分如下三類:

5.1 定義類

1) %define … : 定義一個宏;(原來,%define也是一個宏啊)
2) %undefine … : 取消一個宏;(宏取消後,此語句下面的描述檔就不能再使用這個宏了,即使使用,該宏也不會被擴展了)

5.2 調試類

1) %trace : 列印巨集擴展前後的調試資訊;

2) %dump : 列印活動的巨集(巨集名及巨集體);

3) %{echo:…} : 列印…到標準錯誤設備;

4) %{warn:…} : 列印…到標準錯誤設備;

5) %{error:…} : 列印…到標準錯誤設備,並且返回BADSPEC值;

5.3 特殊類

這類宏的預設值通常放在/usr/lib/rpm/macros檔中,用戶通過編輯自己主目錄(HOME)下的.rpmmacros文件(~/.rpmmacros),可重定義這類宏,改變其預設值,以供RPM在套裝軟體製作,安裝及查詢時使用自己的定義。

這類宏的定義格式為:

%

注: 為巨集名,為巨集體。

1) %packager,%vendor,%distribution :

這三個宏用於定義描述檔中Packager,Vendor,Distribution三個可選域的默認的域值,即如果這三個域中有哪個未在描述檔中定義,且其相對應的宏有定義,則RPM會採用其對應的巨集的巨集體。

如我的~/.rpmmacros檔中有這樣三行:

%vendor 縱橫軟體製作中心

%packager 雨亦奇

%distribution 小趙’2001

這樣,套裝軟體描述檔中再也不用定義那三個域了,由此製作出來的套裝軟體在查詢時,其打包者(Packager),銷售商(Vendor)及發行版(Distribution)均自動搞定了,一勞永逸。

2) %buildroot,%_provides :

這兩個巨集定義套裝軟體建包時用的根目錄及套裝軟體所提供的功能。它們在打包時不會象 上面那三個宏一樣主動被RPM採用,而是必須在描述檔中寫那麼幾行。即:

%vendor 縱橫軟體製作中心

%packager 雨亦奇

%distribution 小趙’2001

Buildroot : %buildroot

Provides : %_provides

3) %_topdir,%_builddir,%_rpmdir,%_sourcedir,%_specdir,%_srcrpmdir :

這六個宏都是RPM製作套裝軟體時要用的,它們在/usr/lib/rpm/macros檔中的預設值為:

%_topdir %{_usrsrc}/dist

%_builddir %{_topdir}/BUILD

%_rpmdir %{_topdir}/RPMS

%_sourcedir %{_topdir}/SOURCES

%_specdir %{_topdir}/SPECS

%_srcrpmdir %{_topdir}/SRPMS

%_topdir巨集定義的是RPM製作套裝軟體時所用目錄的頂層目錄,一般為/usr/src/dist(%{_usrsrc} 宏的值為/usr/src)。在頂層目錄下麵,又有五個子目錄:

* 編譯連接根源程式時用的目錄,由%_builddir巨集定義,常用BUILD;

* 生成的RPM執行套裝程式存放的目錄,由%_rpmdir巨集定義,常用RPMS;

* 軟體根源程式存放的目錄,由%_sourcedir巨集定義,常用SOURCES;

* 套裝軟體描述檔存放的目錄,由%_specdir巨集定義,常用SPECS;

* 生成的RPM根源程式包存放的目錄,由%_srcrpmdir巨集定義,常用SRPMS。

由於宏的遞迴特性,我們可以通過只定義%_topdir宏來達到改變%_builddir等五個巨集的目的。(注意:%_builddir等五個巨集的巨集體如無特殊要求,儘量不要改變,它們是標準的定義,應該採用)這對於普通用戶來說,意義非常重大。因為RPM默認的頂層目錄/usr/src/dist並不是每個用戶都可以隨便使用的,普通用戶更想在自己所有的目錄下用RPM來製作些套裝軟體。我也有這種想法,所以在~/.rpmmacros文件里加上這麼一行:

%_topdir /usr/zzz/rpm

同時,在此巨集定義的目錄下面建立了RPM所需的子目錄,使用命令為:

$ cd /usr/zzz

$ mkdir -p rpm/{BUILD,RPMS/i386,SOURCES,SPECS,SRPMS}

$

命令中的i386是RPM默認的體系名,RPM生成的執行套裝程式是存放在“RPMS/體系名”目錄下面的。這麼做以後,我就可以在自己的目錄下製作RPM套裝軟體了,象超級用戶一樣自由。

4)%_excludedocs,%_ftpport,%_ftpproxy,%_httpport,%_httpproxy,%_netsharepath :

這六個宏對RPM套裝軟體的安裝和查詢起作用。

* %_excludedocs : 如果其值定義為1,則RPM安裝套裝軟體時,對說明文檔的默認作法是不安裝;

* %_ftpport : 此宏用於定義RPM默認的FTP埠;

* %_ftpproxy : 此巨集用於定義RPM默認的FTP代理伺服器;

* %_httpport : 此宏用於定義RPM默認的HTTP埠;

* %_httpproxy : 此巨集用於定義RPM默認的HTTP代理伺服器;

* %_netsharepath : 此巨集用於定義RPM默認的網路共用目錄,適用於網路檔系統(NFS)。

6. 一種特殊的宏

這種宏的用法是:

%(SHELL命令及其參數)

它的結果是取指定的SHELL命令的標準輸出的結果作為描述檔內容的一部分。如套裝軟體描述檔的某個部分需要加上當前日期,則可以用:

%(date +%Y-%m-%d)

執行後,該宏將擴展為類似2001-10-31的日期資料。用戶不妨在自己的描述檔的預處理段(%prep)內加上這麼兩行試試:

%(date +%Y-%m-%d)

exit 1

注: exit 1用於中止RPM的執行。

描述檔範本

以下所有描述檔範本均以LZE套裝軟體製作為例,以根源程式現場編譯後產生的檔為准生成套裝軟體。描述檔中一般只描述必要的部分。另外,如果檔段的所有檔已存在於系統中,並且想直接利用打包,則可以去掉Source域,去掉RPM建包用功能段 (%prep,%build,%install,%clean)。

1. 只有父包,沒有任何子包:

此描述檔見<<精通RPM之七–製作篇(上)>>。此檔中還可以去掉幾個可選的功能段, 如%pre,%post,%preun,%postun,%triggerin,%triggerun,%triggerpostun。這幾個段在此檔中無實質用途,執行時僅顯示RPM開始執行某個腳本程式的資訊。此描述檔僅生成套裝軟體lze-6.0-2.i386.rpm(父包)。

2. 有父包,也有子包:

描述文件如下:

1 # 檔案名稱: lze-6.0-2.spec1

2 # 檔功能: lze套裝軟體描述資訊

3 # 檔作者: 縱橫軟體製作中心雨亦奇 國防大學研究生二隊趙建利

4 # 修改時間: 2001.10.31

5

6 Name: lze

7 Version: 6.0

8 Release: 2

9 Summary: 小趙全螢幕中英文多視窗多功能編輯器(LINUX/UNIX系統適用)

10 Group: Applications/Editors

11 License: Share

12 Source: http://zhsoft.myetang.com/lze-6.0-2.src.tgz

13

14 %description

15 小趙編輯器,是為使用SCO UNIX,LINUX多用戶系統的廣大用戶專門設計的全螢幕多窗

16 口中英文多功能編輯器。

17 它主要有以下十大特點:1.全螢幕功能表操作。2.顯示方式多樣。3.塊操作豐富。4.十

18 字製錶功能強大。5.多視窗操作靈活自如。6.檔操作功能齊全。7.解釋輸出功能獨具特

19 色。8.自帶中文輸入法(增強五筆和增強拼音),實用方便。9.十六進位編輯功能,如虎

20 添翼。10.即時翻譯,按到即譯。

21 總之,小趙編輯器會成為您在UNIX,LINUX系統上編制程式和書寫一般性文稿的好幫手。

22 它將在工作中助您一臂之力,輕鬆上陣,遊刃有餘!

23

24 %prep

25 echo “預處理腳本程式(prep)開始執行”

26 %setup

27

28 %build

29 echo “編譯連接腳本程式(build)開始執行”

30 make

31

32 %install

33 echo “安裝腳本程式(install)開始執行”

34 make install

35

36 # 配置檔子包

37 %package config

38 summary : 小趙編輯器LZE的配置檔

39 group : Applications/Editors

40

41 %description config

42 小趙編輯器用配置檔包括功能鍵定義檔與

43 輸入法控制檔,用戶可根據實際情況加以修改。

44

45 %files config

46 %config /etc/funkey.def

47 %config /etc/inputme.def

48

49 # 說明文檔子包

50 %package doc

51 summary : 小趙編輯器LZE的說明文檔

52 group : Applications/Editors

53

54 %description doc

55 小趙編輯器說明文檔,詳細介紹了該編輯器的

56 命令行用法及內置的各項功能表的功能與操作,對用

57 戶熟悉小趙編輯器有很大作用。

58

59 %files doc

60 %doc /usr/doc/lze-6.0/README

61 %doc /usr/doc/lze-6.0/LICENSE

62

63 # 執行程式子包

64 %package bin

65 summary : 小趙編輯器LZE的執行程式

66 group : Applications/Editors

67

68 %description bin

69 小趙編輯器執行程式為lze,五筆輸入法伺服器執行程式

70 為lzeime.wb,拼音輸入法伺服器執行程式為lzeime.py。

71

72 %files bin

73 %defattr (-,root,root)

74 /usr/bin/lze

75 /usr/bin/lzeime.py

76 /usr/bin/lzeime.wb

77 /etc/wbzc.dat

78

此描述檔生成三個套裝軟體:lze-config-6.0-2.i386.rpm(配置檔子包),lze-doc-6.0-2.i386.rpm(說明文檔子包),lze-bin-6.0-2.i386.rpm(執行程式子包)。

製作篇(下)

(雨亦奇 趙建利

2001年12月10日 09:38)

要想製作RPM格式的套裝軟體,需使用如下命令格式:

rpm-bX[製作選項1製作選項2…]描述檔1描述檔2…

注:-bX可用-tX替換,效果有所不同:使用-b時,需要在命令行上指定套裝軟體描述檔;而使用-t時,在命令行上需要指定的不是套裝軟體描述檔,而是含有此描述檔的TAR格式的包裹檔(必須用gzip壓縮),RPM在準備製作套裝軟體時,會自動從此包裹文件中提取描述檔,根據其中的建包指令,生成RPM格式的套裝軟體。注意:此描述檔必須以.spec為尾碼,其中必須有Source域,並且此域定義的根源程式包必須存放在當前目錄下,否則的話,RPM將報錯退出。

注意,-bX與-tX當中的X,取不同的值時,RPM將執行不同的操作:(下面各個例子均對LZE的描述檔lze-6.0-2.spec進行操作,有的則通過管道技術,用nl命令給輸出加上行號,以便解釋)

1)X=p時,指示RPM執行描述檔中的預處理段(%prep)的腳本程式。該腳本程式一般用來解壓根源程式包,並且為根源程式打補丁,升級根源程式。

#rpm-bplze-6.0-2.spec2>&1|nl

1Executing:%prep

2+umask022

3+cd/usr/src/dist/BUILD

4+echo’預處理腳本程式(prep)開始執行’

5預處理腳本程式(prep)開始執行

6+cd/usr/src/dist/BUILD

7+rm-rflze-6.0

8+/bin/gzip-dc/usr/src/dist/SOURCES/lze-6.0-2.src.tgz

9+tar-xvvf-

10drwxr-xr-xroot/root02001-11-0216:02lze-6.0/

11-rw——-root/root2462262001-11-0216:00lze-6.0/lze.c

12-rw——-root/root982492001-11-0216:00lze-6.0/lzeime.wb.c

13-rw——-root/root3399022001-11-0216:00lze-6.0/lzeime.py.c

14-rw-r–r–root/root12832001-11-0216:00lze-6.0/funkey.def

15-rwxr–r–root/root2502001-11-0216:00lze-6.0/inputme.def

16-rw-r–r–root/root8132742001-11-0216:00lze-6.0/wbzc.dat

17-rw——-root/root4742001-11-0216:02lze-6.0/makefile

18+STATUS=0

19+'[‘0-ne0′]’

20+cdlze-6.0

21++/usr/bin/id-u

22+'[‘0=0′]’

23+/bin/chown-Rhfroot.

24++/usr/bin/id-u

25+'[‘0=0′]’

26+/bin/chgrp-Rhfroot.

27+/bin/chmod-Rfa+rX,g-w,o-w.

28+exit0

#

注:本例中第1行顯示的”Executing:%prep”表明RPM開始執行預處理段的腳本程式。例中行號後那些以加號(+)開始的行均為預處理段腳本程式的指令,其他內容則為指令執行所輸出的結果。從預處理段腳本程式所執行的指令,我們就可以看出RPM正在做什麼:

第2行:設置檔創建遮罩;

第3行:轉到RPM默認的編譯目錄;

第4行:回顯字串,這才是用戶所寫的預處理段腳本程式的開始,第2,3行均是RPM增加的指令;

第6-27行:為%setup所擴展出來的指令及其執行結果,其中可以看到RPM用gzip命令解壓LZE的根源程式包(第8行),而後用tar命令展開根源程式包(第9行)。

第28行:正常退出,返回值為0。

2)X=l時,指示RPM檢查檔段(%files),看其中的檔是否存在。如果不存在,則RPM會報錯退出。

#rpm-bl-vvlze-6.0-2.spec|nl

1Processingfiles:lze

2D:File0:0100644root.root/etc/funkey.def

3D:File1:0100644root.root/etc/inputme.def

4D:File2:0100644root.root/usr/doc/lze-6.0-2/README

5Filenotfound:/usr/doc/lze-6.0-2/LICENSE

6D:File3:0100555root.root/usr/bin/lze

7D:File4:0100511root.root/usr/bin/lzeime.py

8D:File5:0100511root.root/usr/bin/lzeime.wb

9D:File6:0100644root.root/etc/wbzc.dat

10Provides:lze-edit

11PreReq:/bin/sh

12Requires:/bin/sh

#

注:本例命令中使用了通用選項-vv,以輸出RPM檢查時的調試資訊(以行號和D:開始的行)。

由上看出,RPM對檔段的所有檔逐一進行檢查,找到的檔顯示其許可權,屬主和屬組資訊,結果發現/usr/doc/lze- 6.0-2.LICENSE檔不存在,於是報出錯誤(File not found)(見第5行)。RPM在檢查過檔後,還顯示出描述檔要求LZE提供的功能(Provides)和所需的功能(Requires)。

3)當X=c時,指示RPM依次執行預處理段(%prep),編譯段(%build)的腳本程式。編譯段的腳本程式用來編譯連接軟體的根源程式,生成可執行程式,通常一個make命令足夠。因為一個有良好習慣的程式師會把Makefile(程式維護檔)寫好,以便其他程式師編譯該軟體。如果某個軟體沒有維護檔的話,用戶要麼自己寫個Makefile,要麼在編譯段裏寫上軟體編譯與連接的各項命令。

4)當X=i時,指示RPM依次執行預處理段(%prep),編譯段(%build)和安裝段(%install)的腳本程式。安裝段的腳本程式的任務是將編譯連接好的執行程式拷貝到適當的目錄(如/bin,/usr/bin等公共執行目錄),以便打包或執行。它通常執行的指令是make install。

5)當X=b時,指示RPM依次執行預處理段(%prep),編譯段(%build),安裝段(%install)的腳本程式,之後根據檔段(%files)的檔列表,將檔打包,生成RPM執行套裝程式,最後執行清理段(%clean)。

#rpm-bblze-6.0-2.spec2>&1|nl

1Executing:%prep

2+umask022

3+cd/usr/src/dist/BUILD

4+echo’預處理腳本程式(prep)開始執行’

5預處理腳本程式(prep)開始執行

6+cd/usr/src/dist/BUILD

7+rm-rflze-6.0

8+tar-xvvf-

9+/bin/gzip-dc/usr/src/dist/SOURCES/lze-6.0-2.src.tgz

10drwxr-xr-xroot/root02001-11-0217:04lze-6.0/

11-rw——-root/root2462262001-11-0216:00lze-6.0/lze.c

12-rw——-root/root982492001-11-0216:00lze-6.0/lzeime.wb.c

13-rw——-root/root3399022001-11-0216:00lze-6.0/lzeime.py.c

14-rw-r–r–root/root12832001-11-0216:00lze-6.0/funkey.def

15-rwxr–r–root/root2502001-11-0216:00lze-6.0/inputme.def

16-rw-r–r–root/root8132742001-11-0216:00lze-6.0/wbzc.dat

17-rw——-root/root4742001-11-0216:02lze-6.0/makefile

18-rw-r–r–root/root12552001-11-0217:04lze-6.0/getinputme.c

19+STATUS=0

20+'[‘0-ne0′]’

21+cdlze-6.0

22++/usr/bin/id-u

23+'[‘0=0′]’

24+/bin/chown-Rhfroot.

25++/usr/bin/id-u

26+'[‘0=0′]’

27+/bin/chgrp-Rhfroot.

28+/bin/chmod-Rfa+rX,g-w,o-w.

29+exit0

30Executing:%build

31+umask022

32+cd/usr/src/dist/BUILD

33+cdlze-6.0

34+echo’編譯連接腳本程式(build)開始執行’

35編譯連接腳本程式(build)開始執行

36+make

37cc-fwritable-strings-DUSE_AS_LZE-DFOR_LINUX-s-I/usr/zzz/src/include-DFOR_LZE_INPUTME-olze/usr/zzz/src/li-

38bsrc/mycurses.clze.cgetinputme.c/usr/zzz/src/my.a

39cc-DFOR_LINUX-s-I/usr/zzz/src/include-olzeime.wbgetinputme.clzeime.wb.c/usr/zzz/src/my.a

40lzeime.wb.c:Infunction`do_service’:

41lzeime.wb.c:1409:warning:passingarg5of`bsearch’fromincompatiblepointertype

42cc-DFOR_LINUX-s-I/usr/zzz/src/include-olzeime.pygetinputme.clzeime.py.c/usr/zzz/src/my.a

43+exit0

44Executing:%install

45+umask022

46+cd/usr/src/dist/BUILD

47+cdlze-6.0

48+echo’安裝腳本程式(install)開始執行’

49安裝腳本程式(install)開始執行

50+makeinstall

51installing…

52done

53+exit0

54Processingfiles:lze

55FindingProvides:(using/usr/lib/rpm/find-provides)…

56FindingRequires:(using/usr/lib/rpm/find-requires)…

57Provides:lze-edit

58PreReq:/bin/sh

59Requires:/bin/shld-linux.so.2libc.so.6libc.so.6(GLIBC_2.0)libc.so.6(GLIBC_2.1)

60Wrote:/usr/src/dist/RPMS/i386/lze-6.0-2.i386.rpm

61Executing:%clean

62+umask022

63+cd/usr/src/dist/BUILD

64+cdlze-6.0

65+echo’建包結束後清理腳本程式(clean)開始執行’

66建包結束後清理腳本程式(clean)開始執行

67+exit0

#

注:本例中,各行解釋如下:

第1行:顯示RPM開始執行預處理段(%prep);

第2-29行:為預處理段(%prep)腳本程式執行的命令與結果,命令前有加號(+),結果前面則沒有。預處理完成了LZE根源程式包的解壓縮(gzip-dc)與包的展開(tar-xvvf),從而為根源程式的編譯打下了基礎;

第30行:RPM表示開始執行編譯段(%build);

第31-43行:為編譯段(%build)腳本程式執行的命令與結果。腳本程式執行的make維護命令,該命令執行了cc編譯程序,以編譯與連接LZE軟體;

第44行:RPM表示開始執行安裝段(%install);

第45-53行:為安裝段(%install)腳本程式執行的命令與結果。本段程式執行了makeinstall命令,將LZE的執行程式等檔拷貝到系統目錄下;

第54行:RPM顯示:開始處理LZE的檔(為%files檔段的內容);

第55-59行:RPM利用/usr/lib/rpm/find-provides程式查找LZE提供的功能,又利用/usr/lib/rpm/find-requires查找LZE所依賴的功能,以設定LZE的依賴關係;

第60行:製作完成LZE執行套裝程式,檔案名為lze-6.0-2.i386.rpm,在/usr/src/dist/RPMS/i386目錄下;

第61行:RPM顯示:開始執行清理段(%clean)腳本程式,本段程式用於清理暫存檔案;

第62-67行:為清理段(%clean)腳本程式執行的命令與結果。

從上我們可以清楚看出RPM製作套裝軟體的工作流程:預處理段,編譯段,安裝段,套裝軟體製作,清理段。

6)當X=s時,指示RPM建立源碼包。RPM源碼包的內容包括套裝軟體描述檔(SPEC),軟體根源程式,軟體補丁程式,圖示檔等幾項。建立源碼包不需要執行套裝軟體描述檔中的各個功能段,僅需將所需檔包含到包中即可。

#rpm-bslze-6.0-2.spec

Wrote:/usr/src/dist/SRPMS/lze-6.0-2.src.rpm

#rpm-qplv/usr/src/dist/SRPMS/lze-6.0-2.src.rpm

-rw——-rootroot206711月215:44lze-6.0-2.spec

-rw-r–r–rootroot53870611月217:05lze-6.0-2.src.tgz

#

注:本例中,使用rpm-bs命令生成了LZE源碼包lze-6.0-2.src.rpm(在RPM標準源碼目錄/usr/src/dist /SRPMS下),然後用rpm -qplv命令查詢源碼包中所含的檔資訊,從中可以看到LZE源碼包中有兩個檔:一個是套裝軟體描述檔lze-6.0-2.spec,一個是LZE源代碼包lze-6.0-2.src.tgz(TAR打包再用gzip壓縮),此檔由描述檔中的Source域確定。

7)當X=a 時,指示RPM依次執行預處理段(%prep),編譯段(%build),安裝段(%install)腳本程式,之後先生成RPM源碼包,再根據檔段 (%files)的檔列表,將檔打包,生成RPM執行套裝程式,最後執行清理段(%clean)腳本程式,清除中間檔。此命令執行的結果相當於先執行 rpm-bs命令生成源碼包,再執行rpm-bb命令生成執行碼包。

選項列表

選項詳解

通用選項的解釋見<<精通RPM之二–安裝篇>>,本文不再贅述。

1.–short-circuit:單步執行

此選項的目的在於單步執行功能段,僅適用命令為RPM-bc(或-tc)和-bi(或-ti)時。當用rpm-bc–short-circuit命令時,RPM將不再執行預處理段(%prep)的腳本程式,直接執行編譯段(%build)的腳本程式。當用rpm-bi–short-circuit命令時,RPM將不再執行預處理段(%prep)和編譯段(%build)的腳本程式,僅執行安裝段(%install)的腳本程式。

為什麼要使用這個選項?其原因可能是根源程式包中的檔有問題,導致RPM在編譯或安裝過程中出現了這樣或那樣的錯誤,如不能單步執行,則無法排除這些錯誤。單步執行後,用戶可以進入根源程式所在的目錄,查看根源程式,修改錯誤,然後再用tar命令生成一個正確的根源程式包,覆蓋掉原包即可。這樣,RPM再製作時就不會有問題了。

2.–timecheck:設置時間檢查值

該選項的用法是:–timecheck

注:為檢查的時間段,單位是秒,如–timecheck600設置檢查的時間段為600秒,即10分鐘。

設置時間檢查值的目的,在於檢驗打包檔是否是指定時間段內產生的新檔,如果不是,則RPM會產生警告資訊,提醒用戶某個檔不是新檔,而是老檔,可能是某種錯誤導致的。這種錯誤,可能是由於makefile(維護檔)或描述檔中的安裝段腳本程式書寫不正確,從而使某個程式不能正確安裝到指定目錄,因而RPM打包時總是引用老的程式檔。如下面的例子:

#rpm-bl–timecheck600lze-6.0-2.spec

Processingfiles:lze

warning:TIMECHECKfailure:/usr/bin/lze

FindingProvides:(using/usr/lib/rpm/find-provides)…

FindingRequires:(using/usr/lib/rpm/find-requires)…

Provides:lze-edit

PreReq:/bin/sh

Requires:/bin/shld-linux.so.2libc.so.6libc.so.6(GLIBC_2.0)libc.so.6(GLIBC_2.1)

#

注:本例中利用RPM檢查檔列表,看哪個檔是在10分鐘以前產生的老檔,結果RPM發出警告資訊:“warning:TIMECHECKfailure:/usr/bin/lze”,這說明文件/usr/bin/lze時間檢查出現錯誤,這是個老檔。經查,是makefile的問題,裏面少了一句“cplze/usr/bin”。修正後,再次編譯連接程式,再進行時間檢查就沒有這個問題了。

3.–buildroot:設定建包用根目錄

該選項的用法是:

–buildroot

 

注:
為用戶指定的建包用的根目錄。

此選項相當於在套裝軟體描述檔的檔頭加上一行:

Buildroot:
只不過在命令行上設定比較自由罷了。

通過設定建包用根目錄,一般用戶也可以建立那些只有超級用戶(root)才能建立的RPM包了。下面以普通用戶zzz建立LZE套裝軟體為例,說明一下這種形式的包的建立過程。

1)在用戶zzz的HOME目錄(/usr/zzz)下,建立RPM建包所用的目錄:

$cd/usr/zzz

$mkdir-prpm/{BUILD,RPMS/i386,SOURCES,SPECS,SRPMS}

$

2)拷貝描述檔lze-6.0-2.spec到rpm/SPECS目錄,拷貝根源程式包lze-6.0-2.src.tgz到rpm/SOURCES目錄。

$cd/usr/zzz

$cp/root/lze-6.0-2.specrpm/SPECS

$cp/root/lze-6.0-2.src.tgzrpm/SOURCES

$

3)建立.rpmmacros檔,編輯它:

$cd/usr/zzz

$vi.rpmmacros

在此檔中增加一行:

%_topdir/usr/zzz/rpm

用於確定RPM建包用的頂層目錄為/usr/zzz/rpm。

4)轉到描述檔目錄,編輯修改lze-6.0-2.spec安裝段的腳本程式:

$cd/usr/zzz/rpm/SPECS

$vilze-6.0-2.spec

$

用於確定RPM建包用的頂層目錄為/usr/zzz/rpm。

安裝段腳本程式修改為:(原make命令被注釋掉)

%install

echo”安裝腳本程式(install)開始執行”

#makeinstall

mkdir-p$RPM_BUILD_ROOT/usr/bin

mkdir-p$RPM_BUILD_ROOT/etc

mkdir-p$RPM_BUILD_ROOT/usr/doc/lze-6.0

cplzelzeime.wblzeime.py$RPM_BUILD_ROOT/usr/bin

cpinputme.deffunkey.defwbzc.dat$RPM_BUILD_ROOT/etc

cp/usr/doc/lze-6.0/*$RPM_BUILD_ROOT/usr/doc/lze-6.0

注:腳本程式中,使用建包用根目錄的環境變數RPM_BUILD_ROOT,相繼在建包用根目錄下創建若干子目錄(usr/bin,etc,usr /doc/lze-6.0),然後拷貝程式或檔到相應的子目錄中,從而完成完裝。 5)選用–buildroot選項,執行RPM建包命令:

$cd/usr/zzz/rpm/SPECS

$rpm-bb–buildroot/usr/zzz/tmplze-6.0-2.spec

Executing:%prep

+umask022

+cd/usr/zzz/rpm/BUILD

+echo’預處理腳本程式(prep)開始執行’

預處理腳本程式(prep)開始執行

+cd/usr/zzz/rpm/BUILD

+rm-rflze-6.0

+/bin/gzip-dc/usr/zzz/rpm/SOURCES/lze-6.0-2.src.tgz

+tar-xvvf-

drwxr-xr-xroot/root02001-11-0217:04lze-6.0/

-rw——-root/root2462262001-11-0216:00lze-6.0/lze.c

-rw——-root/root982492001-11-0216:00lze-6.0/lzeime.wb.c

-rw——-root/root3399022001-11-0216:00lze-6.0/lzeime.py.c

-rw-r–r–root/root12832001-11-0216:00lze-6.0/funkey.def

-rwxr–r–root/root2502001-11-0216:00lze-6.0/inputme.def

-rw-r–r–root/root8132742001-11-0216:00lze-6.0/wbzc.dat

-rw——-root/root4742001-11-0216:02lze-6.0/makefile

-rw-r–r–root/root12552001-11-0217:04lze-6.0/getinputme.c

+STATUS=0

+'[‘0-ne0′]’

+cdlze-6.0

++/usr/bin/id-u

+'[‘500=0′]’

++/usr/bin/id-u

+'[‘500=0′]’

+/bin/chmod-Rfa+rX,g-w,o-w.

+exit0

Executing:%build

+umask022

+cd/usr/zzz/rpm/BUILD

+cdlze-6.0

+echo’編譯連接腳本程式(build)開始執行’

編譯連接腳本程式(build)開始執行

+make

 cc-fwritable-strings-DUSE_AS_LZE-DFOR_LINUX-s-I/usr/zzz/src/include-DFOR_LZE_INPUTME-olze/usr/zzz/src/libsrc/mycurses.clze.cgetinputme.c/usr/zzz/src/my.a

cc-DFOR_LINUX-s-I/usr/zzz/src/include-olzeime.wbgetinputme.clzeime.wb.c/usr/zzz/src/my.a

lzeime.wb.c:Infunction`do_service’:

lzeime.wb.c:1409:warning:passingarg5of`bsearch’fromincompatiblepointertype

cc-DFOR_LINUX-s-I/usr/zzz/src/include-olzeime.pygetinputme.clzeime.py.c/usr/zzz/src/my.a

+exit0

Executing:%install

+umask022

+cd/usr/zzz/rpm/BUILD

+cdlze-6.0

+echo’安裝腳本程式(install)開始執行’

安裝腳本程式(install)開始執行

+mkdir-p/usr/zzz/tmp/usr/bin

+mkdir-p/usr/zzz/tmp/etc

+mkdir-p/usr/zzz/tmp/usr/doc/lze-6.0

+cplzelzeime.wblzeime.py/usr/zzz/tmp/usr/bin

+cpinputme.deffunkey.defwbzc.dat/usr/zzz/tmp/etc

+cp/usr/doc/lze-6.0/LICENSE/usr/doc/lze-6.0/README/usr/zzz/tmp/usr/doc/lze-6.0

+exit0

Processingfiles:lze

FindingProvides:(using/usr/lib/rpm/find-provides)…

FindingRequires:(using/usr/lib/rpm/find-requires)…

Provides:lze-edit

PreReq:/bin/sh

Requires:/bin/shld-linux.so.2libc.so.6libc.so.6(GLIBC_2.0)libc.so.6(GLIBC_2.1)

Wrote:/usr/zzz/rpm/RPMS/i386/lze-6.0-2.i386.rpm

Executing:%clean

+umask022

+cd/usr/zzz/rpm/BUILD

+cdlze-6.0

+echo’建包結束後清理腳本程式(clean)開始執行’

建包結束後清理腳本程式(clean)開始執行

+exit0

$

注:RPM建包成功後,生成了/usr/zzz/rpm/RPMS/i386/lze-6.0-2.i386.rpm包裹文件,

通過RPM的查詢命令,我們就可以知道該包與由超級用戶建成的包內容毫無二致:

$rpm-qplv/usr/zzz/rpm/RPMS/i386/lze-6.0-2.i386.rpm

-rw-r–r–rootroot128311月609:24/etc/funkey.def

-rwxr-xr-xrootroot25011月609:24/etc/inputme.def

-rw-r–r–rootroot81327411月609:24/etc/wbzc.dat

-rwxr-xr-xrootroot40863211月609:24/usr/bin/lze

-rwxr-xr-xrootroot8292011月609:24/usr/bin/lzeime.py

-rwxr-xr-xrootroot3856811月609:24/usr/bin/lzeime.wb

-rw-r–r–rootroot121511月609:24/usr/doc/lze-6.0/LICENSE

-rw-r–r–rootroot369011月609:24/usr/doc/lze-6.0/README

$

現在我們可以說,普通用戶也可以自由地建立各種形式的RPM套裝軟體了!

4.–target:設定目標平臺

該選項的用法為:–target體系-平臺-作業系統

注:RPM製作出來的套裝軟體默認的體系為i386,平臺為pc,作業系統為linux。如果用戶想加以改變,就需要使用此選項來確定一下,如下例:

#rpm-bb–targeti686-pc-solaris–quietlze-6.0-2.spec

創建目標平臺:i686-pc-solaris

正在創建目標:i686-pc-solaris

#

本例設定生成的RPM包適用的目標平臺為:i686-pc-solaris(即體系為i686,平臺為pc,作業系統為solaris)。注意:必須在 /usr/src/dist/RPMS目錄下創建一個i686的子目錄,沒有指定體系的子目錄,RPM將無法生成套裝軟體。我們可以查詢一下生成的套裝軟體, 看其適用的體系與作業系統是什麼:

#rpm-qp–qf”archis%{arch}nosis%{os}n”/usr/src/dist/RPMS/i686/lze-6.0-2.i686.rpm

archisi686

osissolaris

#

從輸出上可以看到,其體系與作業系統正是我們所設定的。

5.–quiet:儘量減少資訊輸出

此選項的目的,是讓RPM減少資訊的輸出。使用此選項後,如果沒有錯誤發生,RPM就不會輸出多餘的資訊,這時的RPM也顯得比較“安靜”(quiet)了。

$rpm-bl–quietlze-6.0-2.spec

$

6.–clean:執行檔清理

如果套裝軟體描述檔的清理段(%clean)沒有刪除暫存檔案的命令,那麼RPM建包結束後那些暫存檔案還是存在的,佔用了一定的空間。如果想讓RPM自動刪除那些暫存檔案,可以在建包時使用–clean選項。此選項執行一條命令,即:

rm-rf軟體名-版本號

用它來刪除”軟體名-版本號”目錄及該目錄下的所有檔。這個”軟體名-版本號”目錄,也即RPM默認的存放解壓後的根源程式的目錄。

#rpm-bl–cleanlze-6.0-2.spec

Processingfiles:lze

FindingProvides:(using/usr/lib/rpm/find-provides)…

FindingRequires:(using/usr/lib/rpm/find-requires)…

Provides:lze-edit

PreReq:/bin/sh

Requires:/bin/shld-linux.so.2libc.so.6libc.so.6(GLIBC_2.0)libc.so.6(GLIBC_2.1)

Executing:–clean

+umask022

+cd/usr/src/dist/BUILD

+rm-rflze-6.0

+exit0

注:例中的“Executing:–clean”表示RPM開始執行自己的檔清理操作。

7.–rmsource:刪除根源程式及描述檔

此選項用於指示RPM在建包後刪除軟體根源程式和包描述檔,軟體根源程式由包描述檔中的Source域定義。此選項也可單獨使用,如:

#rpm–rmsourcelze-6.0-2.spec

#lslze-6.0-2.spec../SOURCES/lze-6.0-2.src.tgz

ls:lze-6.0-2.spec:檔或目錄不存在

ls:../SOURCES/lze-6.0-2.src.tgz:檔或目錄不存在

#

8.–sign:套裝軟體內置數字簽名

此選項用於在套裝軟體內添加PGP數位簽名,通過數位簽名,用戶可以校驗套裝軟體是否原裝,是否修改過。要使用PGP數位簽名,必須先安裝好PGP應用程式及產生自己的密鑰對。(有關數位簽名的內容,詳見<<精通RPM之八–簽名篇>>)

使用此選項建包時,RPM會要求輸入密碼,驗證正確後開始執行建包的系列操作,在建包前會產生數位簽名,以便寫入包中。請看下例:(省略不少輸出,……表示)

#rpm-bb–signlze-6.0-2.spec

Enterpassphrase:mypass

Passphraseisgood.

Executing:%prep

……

Executing:%build

……

Executing:%install

……

Processingfiles:lze

……

Requires:/bin/shld-linux.so.2libc.so.6

Generatingsignature:1002

GeneratingsignatureusingPGP.

PrettyGoodPrivacy(tm)Version6.5.8

(c)1999NetworkAssociatesInc.

UsestheRSAREF(tm)Toolkit,whichiscopyrightRSADataSecurity,Inc.

ExportofthissoftwaremayberestrictedbytheU.S.government. Wrote:/root/test/RPMS/i386/lze-6.0-2.i386.rpm

Executing:%clean

……

#

注:例中要求輸入密碼,輸入mypass後校驗成功,之後RPM開始建包操作。(實際上,mypass在螢幕上並不顯示出來)例中的Generatingsignature之下的幾行就是產生數位簽名時輸出的東西。

其他建包相關的命令

其他建包相關的命令有兩個,它們都是針對RPM格式的源碼包進行操作的,執行時先安裝源碼包,然後再根據套裝軟體描述檔進行下一步的工作。 1.重編譯命令:

用法為:rpm–recompileRPM源碼包1RPM源碼包2…

如:

rpm–recompilelze-6.0-2.src.rpm

此命令執行時,首先安裝此源碼包,然後依次執行源碼包內套裝軟體描述檔的預處理段(%prep),編譯段(%build),安裝段(%install)的腳本程式。此命令相當於以下兩條命令:

1)rpm-ilze-6.0-2.src.rpm

2)rpm-bilze-6.0-2.spec

2.重建立命令:

用法為:rpm–rebuildRPM源碼包1RPM源碼包2…

如:

rpm–rebuildlze-6.0-2.src.rpm

重編譯命令執行後並不建立新的RPM套裝軟體,而此重建立命令執行後則會製作出一個新的RPM套裝軟體。重建立命令執行時,首先安裝RPM源碼包,然後依次執行源碼包內套裝軟體描述檔的預處理段(%prep),編譯段(%build),安裝段(%install),清理段(%clean)的腳本程式,生成一個新的RPM執行包,最後刪除根源程式包,描述檔及其它暫存檔案。此命令相當於以下兩條命令:

1)rpm-ilze-6.0-2.src.rpm

2)rpm-bb–clean–resourcelze-6.0-2.spec

------------

RPM的另類用法

RPM不僅在安裝,升級,卸載方面工作出色,而且在查詢方面比其他套裝軟體管理工具更勝一籌。這從以下幾種情況可以看出:

* 當你在流覽系統檔時,發現一個檔,想知道它來自哪個套裝軟體時,可以用RPM來查詢得知;

* 當你的朋友給你發送來一個套裝軟體,但你不知道這是個什麼樣的套裝軟體,不知道它做些什麼,安裝些什麼,來源是哪里。這時,你可以用RPM查詢搞定;

* 幾個月前你安裝了XFree86視窗軟體,但現在你忘了它的版本號,也不知它的說明文檔在哪里。這時,你可以用RPM查詢一下這個套裝軟體,得到這方面的資訊。

RPM的查詢還有一個高級功能,即定制輸出功能。你可用–queryformat(或-qf)來定制一下輸出格式,這樣,RPM查詢得到的資訊將以你定制的格式輸出,這樣很是方便,尤適合於程式的自動處理。

命令格式

查詢RPM格式的套裝軟體,可使用如下命令格式:

rpm -q [查詢選項1 查詢選項2…]

注: 也可使用–query代替-q,效果相同。

選項列表

選項詳解

指定用選項中ftp與http相關的四個選項(–ftpproxy,–ftpport,–httpproxy,–httpport)和通用選項的解釋,請參見<<精通RPM之二–安裝篇>>,本文不再贅述。下面對指定用選項做些解釋:

指定用選項可分為如下幾類:

一、套裝軟體選擇類

此類選項在一次只能選擇一個,選擇多個時RPM將提示錯誤:

rpm: one type of query/verify may be performed at a time

從查詢方面看,一個是查詢那些已安裝的套裝軟體,一個是查詢未安裝的套裝軟體。

1. 查詢已安裝的套裝軟體,使用下列選項:

(1) -a (或–all) : 查詢所有已安裝的套裝軟體

# rpm -q -a

setup-2.0.2-1

filesystem-1.3.4-5

basesystem-6.0-5

agrep-2.04-5

aktion-0.3.6-2

amor-0.5-1

dhcpcd-1.3.17pl2-1

ldconfig-1.9.5-15

glibc-2.1.2-12

chkconfig-1.0.6-2

……

#

注: 本例查找當前系統中安裝的所有套裝軟體,輸出很多,僅列出幾個,剩下的省略掉了(以……表示)。

(2) -g (或–group) : 查詢有哪些套裝軟體屬於指定類別

RPM根據軟體功用的不同,將軟體分為以下若干類:(括弧內為注釋)

Amusements/Games (娛樂/遊戲)

Amusements/Graphics(娛樂/圖形)

Applications/Archiving (應用/檔案)

Applications/Communications (應用/通訊)

Applications/Databases (應用/資料庫)

Applications/Editors (應用/編輯器)

Applications/Emulators (應用/模擬器)

Applications/Engineering (應用/工程)

Applications/File (應用/文件)

Applications/Internet (應用/網際網路)

Applications/Multimedia (應用/多媒體)

Applications/Productivity (應用/產品)

Applications/Publishing (應用/印刷)

Applications/System (應用/系統)

Applications/Text (應用/文本)

Development/Debuggers (開發/調試器)

Development/Languages (開發/語言)

Development/Libraries (開發/函數庫)

Development/System (開發/系統)

Development/Tools (開發/工具)

Documentation (說明文檔)

System Environment/Base (系統環境/基礎)

System Environment/Daemons (系統環境/守護)

System Environment/Kernel (系統環境/內核)

System Environment/Libraries (系統環境/函數庫)

System Environment/Shells (系統環境/介面)

User Interface/Desktops (用戶介面/桌面)

User Interface/X (用戶介面/X視窗)

User Interface/X Hardware Support (用戶介面/X硬體支援)

Other (其他)

注意: 類別是大小寫敏感的,這一點輸入時要小心。如果用戶想要查詢當前系統安裝了哪些遊戲類的套裝軟體,可這樣做:

# rpm -q -g Amusements/Games

clanbomber-1.01-1

kdegames-1.1.2-1

xbill-2.0-6

xboard-4.0.0-3

xboing-2.4-7

xgammon-0.98-14

xjewel-1.6-11

xpat2-1.04-10

xpilot-3.6.2-6

xpuzzles-5.4.1-7

xtrojka-1.2.3-6

#

如果用戶想查詢若干類別的套裝軟體時,可以把類別都列出來,一起查詢,如:

# rpm -q -g Applications/Editors Applications/File

emacs-20.3-15

emacs-nox-20.3-15

emacs-X11-20.3-15

vim-common-5.6-12

vim-minimal-5.6-12

vim-X11-5.6-12

fileutils-4.0-3

bzip2-0.9.5d-1

findutils-4.1-32

git-4.3.17-6

gzip-1.2.4-15

slocate-1.4-7

stat-1.5-12

file-3.26-6

#

注: 本例查詢結果中前6個為”應用/編輯器”類別,後8個為”應用/文件”類別。

(3) -f (或–file) : 查詢有哪些套裝軟體擁有指定檔這個選項非常有用。當用戶不清楚某個檔屬於哪個套裝軟體時,可試試這個選項。假如我記不清/usr/sbin/ftpd這個檔在哪個包中,現在用RPM查詢:

# rpm -qf /usr/sbin/ftpd

inet6-apps-0.36-3

#

現在知道了,它在inet6-apps-0.36-3包中。命令中-qf是-q -f的縮寫,當選項僅帶一個減號時,多個選項可以合併在一起,如-a -b -c三個選項可寫作-abc,執行效果相同。

(4) –whatrequires : 查詢有哪些包需要指定功能

本選項指示RPM從所有已安裝的套裝軟體中,查詢有哪些套裝軟體提供了用戶指定的功能,命令行上可輸入一個或多個功能。

# rpm -q –whatrequires /bin/ps libc.so.6 | head

autofs-3.1.3-2

agrep-2.04-5

aktion-0.3.6-2

amor-0.5-1

chkconfig-1.0.6-2

libtermcap-2.0.8-16

bash-2.03-10

ncurses-4.2-18

info-3.12f-4

fileutils-4.0-3

#

注: 本例從系統中查詢哪些套裝軟體需要/bin/ps和libc.so.6功能,通過管道輸出前10行內容。

(5) –whatprovides : 查詢有哪些包提供指定功能

本選項指示RPM從所有已安裝的套裝軟體中,查詢有哪些套裝軟體提供了用戶指定的功能。命令行上可輸入一個或多個功能。

# rpm -q –whatprovides libc.so.6 /bin/ps

glibc-2.1.2-12

no package provides /bin/ps

#

注: 本例從系統中查詢有哪些套裝軟體提供libc.so.6與/bin/ps功能,結果是glibc-2.1.2-12包提供了libc.so.6,而沒有包提供/bin/ps功能。

(

6) –triggeredby : 查詢有哪些包被指定的包觸發本選項指示RPM從所有已安裝的套裝軟體中,查詢有哪些包可被用戶指定的包觸發。指定的包可輸入一個或多個。

# rpm -q –triggeredby file

foo-8.0-1

#

注: 本例查詢後得知,安裝或卸載foo-8.0-1包,將會觸發與file包相關的腳本程式執行。

2. 查詢未安裝的套裝軟體: (僅有一個選項可用)

(1) -p : 查詢指定包裹檔的資訊

使用本選項,通過指定一個或多個包裹檔案名,RPM就可以獲取相應包裹的有關資訊。包裹檔可以是一般形式,也可是ftp/http形式。

# rpm -qp -l –ftpport 2121 ftp://zzz:pass@linux/zhsoft/file-3.26-6.i386.rpm

/usr/bin/file

/usr/man/man1/file.1

/usr/man/man4/magic.4

/usr/share/magic

#

注: 本例查詢ftp形式的包裹,顯示其檔列表(-l選項使然,下麵要講到)。ftp用戶名zzz,密碼為pass,遠端機為linux,檔案名為/zhsoft/file-3.26-6.i386.rpm,ftp使用2121埠。

二、資訊顯示類

本類選項可同時選擇多個,以顯示多種資訊。

1. -i : 顯示套裝軟體資訊

當用戶需要瞭解套裝軟體的頭部資訊時,要使用該選項。

# rpm -qi file

Name: file Relocations: /usr

Version : 3.26 Vendor: Red Hat Software

Release : 6 Build Date: 1999年03月23日 星期二 05時32分29秒

Install date: 2001年10月14日 星期日 21時18分25秒 Build Host: porky.devel.redhat.com

Group : Applications/File Source RPM: file-3.26-6.src.rpm

Size: 211946 License: distributable

Packager: Red Hat Software

Summary : A utility for determining file types.

Description :

The file command is used to identify a particular file according to the

type of data contained by the file. File can identify many different

file types, including ELF binaries, system libraries, RPM packages, and

different graphics formats.

You should install the file package, since the file command is such a

useful utility.

#

上述輸出中,包含多個域,各個域的含義為:

Name : 軟體名;Relocations : 重定位目錄首碼(一個或多個);

Version : 版本號;Vendor : 開發商;

Release : 釋出號;Build Date : 包建立時間;

Install date : 安裝時間; Build host : 包建立主機;

Group: 類別; Source RPM : 源代碼包;

Size : 大小; License : 許可證;

Packager : 打包者;

Summary : 軟體簡介;

Description : 詳細描述。

2. -l (或–list) : 顯示套裝軟體檔列表

當用戶想知道套裝軟體包含哪些檔時,要使用該選項。輸出時,一行一個檔案名,形成文

件列表。下例列出file包中文件:

# rpm -qlv file

-rwxr-xr-x root root23948 3月 23 1999 /usr/bin/file

-rwxr-xr-x root root12023 3月 23 1999 /usr/man/man1/file.1

-rwxr-xr-x root root 6625 3月 23 1999 /usr/man/man4/magic.4

-rwxr-xr-x root root 169350 3月 23 1999 /usr/share/magic

#

注: 本例列檔時選用了通用選項-v,這樣列出的格式同ls命令列出的格式,從中可以看到各個檔的許可權,屬主,屬組,大小,最後修改時間及檔案名等資訊。

3. -d (或–docfiles) : 顯示套裝軟體說明文檔RPM將套裝軟體中的檔分為三類,一是配置檔,一是說明文檔,再一是其他檔(包括可執行程式及資料檔案等)。通過-d選項,可列出包中所有說明文檔。下例列出file包中說明文檔:

# rpm -qd file

/usr/man/man1/file.1

/usr/man/man4/magic.4

#

4. -c (或–configfiles) : 顯示套裝軟體配置檔使用本選項可列出包中所有配置檔。下例列出lze包中的配置檔:

# rpm -qc lze

/etc/funkey.def

/etc/inputme.def

#

5. -s (或–state) : 顯示套裝軟體檔狀態RPM已安裝的套裝軟體中各個文件可擁有如下4種狀態:

* normal(正常): 這表明文件未被其他套裝軟體修改過。

* replaced(已替換): 這表明檔已被其他軟體包修改替換過了,不再是原先的檔了。* not installed(未安裝): 這表明檔未安裝。有一種原因可導致這種情況發生,這就是當安裝套裝軟體時使用了–excludedocs選項(或是通過設置%_excludedocs 宏為1),說明文檔未被安裝到系統中。當用RPM查詢此套裝軟體狀態時,所有說明文檔均顯示此狀態。

* net shared(網路共用): 這表明檔處於網路共用狀態。這一狀態是RPM用來支援NFS(網路檔系統)的,用於避免一個NFS用戶端系統刪除一個正在共用的檔時,另一NFS用戶端系統無法正常使用含此檔的套裝軟體。有兩種情況可使檔在此狀態,一是檔安裝在真實網路共用的目錄裏,二是檔安裝在RPM資源配置檔中%_netsharedpath巨集所確定的目錄裏。

# rpm -i –excludedocs file-3.26-6.i386.rpm

# rpm -qs file

normal/usr/bin/file

not installed /usr/man/man1/file.1

not installed /usr/man/man4/magic.4

normal/usr/share/magic

#

注: 本例先安裝file包裹檔,選用–excludedocs表明不安裝說明文檔。而後再查詢file包檔的狀態,可以看到其說明文檔均為not installed(未安裝),其他文件為normal(正常)狀態。

6. -R (或–requires) : 顯示套裝軟體所需的功能

所謂功能,可以是套裝軟體標識,可以是檔(如共用庫libc.so.6等),也可以是虛擬的名字。套裝軟體的依賴關係,就是依靠功能來實現的。RPM安裝套裝軟體時,如果所需功能不存在,則其依賴關係不滿足,RPM將中斷安裝過程。

# rpm -q -R lze

/bin/sh

ld-linux.so.2

libc.so.6

libc.so.6(GLIBC_2.0)

libc.so.6(GLIBC_2.1)

#

注: 本例查詢lze包所需的功能。

7. –provides : 顯示套裝軟體提供的功能

一個套裝軟體,可以提供若干功能,這些功能可以是動態連結程式庫等實際的檔,也可以是虛擬的名字(只要其他套裝軟體可以用就行了)。如果想查詢某個包提供了哪些功能,要用–provides

選項。

下面的例子查詢一個包裹檔所提供的功能:

# rpm -qp –provides zlib-1.1.3-6.i386.rpm

libz.so.1

libz.so.1(GCC.INTERNAL)

#

注: 本包裹檔提供的功能是libz.so.1動態連結程式庫。

8. –conflicts : 顯示套裝軟體衝突的功能

何謂衝突?衝突就是不同套裝軟體之間不能共存的現象。RPM製作套裝軟體時,可以記錄下與本套裝軟體不能共存的功能,這樣安裝該包時,若衝突的功能已然存在,則RPM將中止安裝。

下面的例子查詢at-3.1.7-8包是否有與其衝突的功能:

# rpm -q –conflicts at-3.1.7-8

crontabs <= 1.5

#

注: 本例顯示at包與版本號小於1.5的crontabs包有衝突存在。

9. –scripts : 顯示套裝軟體內置的腳本程式

scripts即腳本,指的是用SHELL語言編寫的程式。選用本選項時,RPM將輸出套裝軟體所含的各類腳本程式的內容。總共有5類這樣的腳本程式,即安裝前腳本程式(preinstall),安裝後腳本程式(postinstall),卸載前腳本程式(preuninstall),卸載後腳本程式 (postuninstall)和校驗腳本程式(verify)。

下面的例子列出zsh包的腳本程式:

# rpm -q –scripts zsh-3.0.7-4 | nl

1 postinstall script (through /bin/sh):

2 if [ ! -f /etc/shells ] ; then

3 echo “/bin/zsh” > /etc/shells

4 else

5 echo “/bin/zsh” >> /etc/shells

6 fi

7 /sbin/install-info /usr/info/zsh.info.gz /usr/info/dir

8 –entry=”* zsh: (zsh). An enhanced bourne shell.”

9 preuninstall script (through /bin/sh):

10 if [ “$1″ = 0 ] ; then

11 /sbin/install-info –delete /usr/info/zsh.info.gz /usr/info/dir

12 –entry=”* zsh: (zsh). An enhanced bourne shell.”

13 fi

14 postuninstall script (through /bin/sh):

15 if [ “$1” = 0 ] ; then

16 if [ -f /etc/shells ] ; then

17 TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX`

18 grep -v ‘^/bin/zsh$’ /etc/shells > $TmpFile

19 cp -f $TmpFile /etc/shells

20 rm -f $TmpFile

21 chmod 644 /etc/shells

22 fi

23 fi

#

注: 本例利用管道技術給查詢的每行輸出加上了行號,便於觀察解釋。

第2-8行: 為安裝後腳本程式(postinstall)的源代碼;

第10-13行: 為卸載前腳本程式(preuninstall)的源代碼;

第15-23行: 為卸載後腳本程式(postuninstall)的源代碼。

例中所有腳本程式均通過/bin/sh解釋執行,本例沒有安裝前腳本程式(preinstall)和

校驗腳本程式(verify)。

10. –triggers : 顯示套裝軟體內置的觸發腳本程式

觸發腳本程式是scripts類腳本程式的擴展,它用於套裝軟體之間的交互控制。觸發腳本

程式有安裝時觸發腳本程式(triggerin),卸載前觸發腳本程式(triggerun)和卸載後觸發腳

本程式(triggerpostun)三種。

下面的例子列出zsh包中的觸發腳本程式:

# rpm -q –triggers zsh-3.0.7-4

triggerpostun script (through /bin/sh) — zsh <= 3.0.7-2

if [ ! -f /etc/shells ] ; then

echo “/bin/zsh” > /etc/shells

else

echo “/bin/zsh” >> /etc/shells

fi

#

注: 輸出的第1行說明腳本程式的類別(為卸載後觸發腳本程式triggerpostun),用什麼程式解釋(一般為/bin/sh),和觸發的條件(在–之後描述)。本例的觸發條件為zsh的版本小於或等於3.0.7-2。如果條件成立,則此腳本程式將會執行。輸出的第2-6行為卸載後觸發腳本程式的源代碼。

11. –changelog : 顯示軟體維護記錄

changelog即軟體維護記錄,用它來記錄什麼人,什麼時間,改動了軟體的什麼地方。通

過查看維護記錄,開發者或用戶可以瞭解軟體的開發進展情況。

下面的例子查詢lze包的維護情況:

# rpm -q –changelog lze-6.0-2

* 五 5月 01 1998 雨亦奇

– 增加多視窗操作

* 一 3月 24 1997 雨亦奇

– 增加塊操作命令

#

注: 從本例中就可以看出來,維護記錄的書寫有一定的規範:以星號(*)開頭的行記錄維護時間,維護人及其電子郵箱,而以減號(-)開頭的行則記錄維護的具體內容。

12. –dump : 顯示套裝軟體中所有檔的屬性資訊

如果用戶想查看某個套裝軟體內檔的屬性資訊,請用–dump選項。

# rpm -q –dump file

/usr/bin/file 23948 922138347 abaf6cfd51588ac7c484526fbdb84e5b 0100755 root root 0 0 0 X

/usr/man/man1/file.1 12023 922138346 76d9ff6567ab64a53eab50911272f5c1 0100755 root root 0 1 0 X

/usr/man/man4/magic.4 6625 922138346 b8d126803709f0da7f39f5125a132cd3 0100755root root 0 1 0 X

/usr/share/magic 169350 922138346 3bd2eaf3c5e0e84153ba7df38b7561fc 0100755 root root 0 0 0 X

#

現在根據例子的輸出,解釋一下RPM包中各個檔所擁有的屬性資訊:(以第1行為例)

/usr/bin/file : 為檔案名;

23948 : 指檔大小(位元組數);

922138347 : 指檔最後修改時間(秒數);

abaf6cfd51588ac7c484526fbdb84e5b : 指根據檔內容計算出的MD5檢查和;

0100755 : 指文件存取許可權;

root : 指文件屬主;

root : 指文件屬組;

0 : 配置檔標誌,為0表示該檔非配置檔,為1表明該檔是配置檔;

0 : 說明文檔標誌,為0表示該檔非說明文檔,為1表明該檔是說明文檔;

0 : 指檔類型,為0表示普通檔,非0表示設備檔,包含主從設備號;
 
原文出處:http://doc.linuxpk.com/153.html

This entry was posted in Linux.

Comments are closed.

在线客服系统