rpm安装文件制作和使用
?
一 介紹
RPM(RPM Package Manager)是一個開放的包管理器,它使用戶可以從源碼構建一個二進制的軟件發行包和利用補丁包給軟件打補丁。RPM包非常靈活易用,因此被作為很多linux發行版的默認軟件安裝包。在Redhat和CentOS中都是使用此打包格式。
?
二 制作
1 創建一個RPM安裝包是件很容易的事,特別是當你可以獲得軟件的源代碼包的時候。下面介紹怎么制做一個RPM軟件安裝包,在繼續之前,我們假設你已經知道怎么從源代碼安裝一個軟件包。制做一個RPM軟件安裝包有以下幾個步驟:
(1)獲得軟件的源代碼包
(2)如果你自己修改了軟件,那么給它做一個補丁
(3)編寫一個包含軟件包信息的spec文件
(4)確保軟件被正確的安裝到適當的位置
(5)創建RPM安裝包
?
2 從上面的幾步我們可以看到,制做一個RPM包最主要的就是第三步編寫一個spec文件,下面介紹怎么編寫這個spec文件。一個spec文件分成下面幾個小節:
? (1)前言(preamble)
當用戶查詢軟件包信息的時候,RPM程序會打印出前言包含的信息。這一小節包含的信息有軟件包的名稱、功能描述、版本號、發行號和類型等信息。
(2)準備(preparation)
從prep節開始是創建一個軟件包要做的實際工作。故名思意,這一小節所做的都是一些必須的準備工作,它的內容就像一個普通的shell腳,為了使工作更容易,這一小節提供了兩個可以使用的宏,一個是解壓tar文件,并把當前工作目錄設置為源代碼目錄,另一個是給源碼打補丁。
(3)創建(build)
就像prep小節一樣,build的內容也是一個普通腳本,這一小節包含的是怎么編譯源代碼,它可以是一個簡單的make命令或者一些更復雜的編譯命令。因為現在的大多數軟件都使用make編譯,所以這一小節沒有提供宏。
(4)安裝(install)
install小節同樣也是一個腳本,它提供一些安裝軟件包的命令,如果源代碼的makefile文件提供有make install命令,這一節你可以簡單的包含一個make install命令,否則你就得提供一些像cp, mv或者install之類的命令集。
(5)驗證(verify script)
這一小節包含一個驗證軟件包的腳本,驗證軟件包不屬于RPM的能力范圍。
(6)清除(clean)
這一小節包含一個編譯好以后用于清除無用信息的腳本。這一腳本很少會用到,因為在大多數環境下,RPM會做好這些工作。
(7)文件列表(file list)
這一小節包含一份文件列表,它們是組成RPM包的所有文件,當你用rpm -qpl 命令查看軟件包的時候就會得到這一份文件列表。在這一小節也有幾個宏可以用,它們指出哪些文件是文檔,哪些是配置文件,哪里是目錄等。
(8)維護日志(changelog)
這一小節記錄了軟件包的維護日志。
?
3 spec文件有一個命名規則,其文件名由以下幾部份組成:軟件包名-版本號-發行號.spec
?
4 下面我們舉一個簡單的spec文件,然后再來說明各部分的意思。文件如下:
Summary: GNU readline library
Name: readline
Version: 5.1
Release: 1
Copyright: GPL
Group: Library
Source: http://www.cnblogs.com/itech/admin/ftp://172.16.100.81/soft/readline-5.1.tar.gz
URL: http://www.gnu.org/index.html
Distribution: GNU Project
Vendor: GNU
Packager: Yan Dingcheng <dingcheng_yan@yahoo.com.cn>
%description
The GNU readline library gets a line from user with editing.
%prep
%setup
%build
./configure --prefix=/opt/%{name}
make
%install
make install
%files
/opt/%{name}/lib/libhistory.a
/opt/%{name}/lib/libhistory.so
/opt/%{name}/lib/libhistory.so.5
/opt/%{name}/lib/libhistory.so.5.1
/opt/%{name}/lib/libreadline.a
/opt/%{name}/lib/libreadline.so
/opt/%{name}/lib/libreadline.so.5
/opt/%{name}/lib/libreadline.so.5.1
/opt/%{name}/include/readline/chardefs.h
/opt/%{name}/include/readline/history.h
/opt/%{name}/include/readline/keymaps.h
/opt/%{name}/include/readline/readline.h
/opt/%{name}/include/readline/rlconf.h
/opt/%{name}/include/readline/rlstdc.h
/opt/%{name}/include/readline/rltypedefs.h
/opt/%{name}/include/readline/tilde.h
/opt/%{name}/info/dir
/opt/%{name}/info/history.info
/opt/%{name}/info/readline.info
/opt/%{name}/info/rluserman.info
/opt/%{name}/man/man3/history.3
/opt/%{name}/man/man3/readline.3
%changelog
* Wed Jan 31 2007 <dingcheng_yan@yahoo.com.cn>
+ create package
?
?
?
5 SPEC實例文件的具體解釋:
前言
Summary:這一行文字對軟件包進行簡短描述
Name:軟件包的名字
Version:軟件包的版本號,這里必須是你計劃要使用的RPM文件版本號
Release:軟件包的發行號,這里必須是你計劃要使用的RPM文件發行號
Copyright:軟件包的版權
Group:軟件包的分組,這里定義怎么打包軟件包
Source:軟件包的來源,當你想再次獲取該軟件包或者查看它是不是有更新的版本的時候,這一行就很有用了。
URL:URL與Source不一樣的地方就是,Source提供的是源代碼的文件名,URL提供的是指向軟件包文檔的鏈接。
Distribution:指明軟件包是屬于哪個產品的一部份。
Vendor:軟件包的生產廠商。
Packager:打包的組織或者個人。
discription:軟件包功能的一個詳細描述。
準備
%setup宏:解壓源代碼包并把當前工作目錄設置到源代碼目錄。%setup宏做的主要工作類似于下面兩條命令:
tar zxvf 源代碼包文件名
cd RPM包名-版本號
所以如果你的源代碼包解壓以后的目錄組成不是“RPM包名-版本號”的話,在這里使用%setup宏就會出問題。
創建
這里使用了一個configure和make命令組合
安裝
這里使用了make install命令,因為makefile里有install標簽了,所以就用它,簡便。
文件列表
這里是一個文件列表,列出的文件就是創建以后的RPM包將要包含的文件,文件路徑要求是一個絕對路徑,利用RPM命令安裝這個軟件包以后,這些文件將會按照這里指定的路徑安裝到系統中。在創建RPM包之前必須保證這里指定的文件在系統中都能找到,不然創建RPM包將會出錯。所以如果是為了學習怎么編寫一個spec文件的話,就像我上面那樣,把軟件安裝到一個干凈目錄下(比如/opt),這樣不會影響系統的正常工作。
這個文件列表目前還沒有什么好的工具能夠自動生成,因為RPM沒法知道執行make install的時候到底安裝了哪些文件。有的人建議用一個find命令來查找到底安裝了哪些文件,但是我覺得這未必會有用。我一般是在configure的時候使用configure --prefix=/opt/package_name指定一個干凈目錄,先把軟件安裝到該目錄下,然后查看軟件包安裝后都有哪些文件,通過這些文件生成一個文件列表,然后再使用configure命令重新安裝一次軟件包,這次把軟件包安裝到系統中,比如是/usr或者/usr/local目錄下,然后把文件列表中的目錄前輟改成相應的目錄前輟(比如/usr或者/usr/local)就可以了。
維護日志
維護日志是一些對軟件包維護的日志記錄,其中包含有一個時間信息,它有指定的格式:Wed Jan 31 2007。按順序是 星期 月 日 年。
?
6 生成rpm安裝包:
編寫好spec文件以后在redhat linux下把軟件源碼包放到/usr/src/redhat/SOURCE目錄下(如果是suse linux把軟件源碼包放到/usr/src/packages/SOURCE目錄下),
然后把spec文件放到/usr/src/redhat/SPECS目錄下(如果是suse linux放到/usr/src/packages/SPECS目錄下),
最后轉到/usr/src/redhat/SPECS目錄下執行如下命令:rpmbuild -ba spec文件名 。
執行成功以后會生成三個RPM文件并打印信息如下:Wrote: /usr/src/redhat/SRPMS/readline-5.1-1.src.rpm,Wrote: /usr/src/redhat/RPMS/i386/readline-5.1-1.i386.rpm,Wrote: /usr/src/redhat/RPMS/i386/readline-debuginfo-5.1-1.i386.rpm。
我們可以看到在RedHat系統下生成的RPM文件被放到/usr/src/redhat/RPMS/i386和/usr/src/redhat/SRPMS目錄下,如果打包的RPM包是為了i586架構打的,那么RPM包會被放到i586目錄下。其中readline-5.1-1.src.rpm是源碼包,可以通過命令 rpmbuild --rebuild readline-5.1-1.src.rpm重新生成二進制的RPM包。
?
三 使用
1 rpm -i (安裝)
在第一次安裝某個包時,您要使用 -i 或安裝模式。只需將 rpm 指向某個二進制包并執行它, rpm 就會把該包安裝到您的系統上。安裝過程一般只需幾秒鐘。我經常會在安裝包時使用 -v (詳細)開關來提供關于該過程的更多信息,以及使用 -h (哈希線)開關來通過輸出在控制臺上的哈希(#)符號提供安裝進度更新。下面是安裝某個包的例子:
?
$ rpm -ivh MyPackage-1.0.0.i386.rpm
Preparing...??????????????? ########################################### [100%]
?? 1:MyPackage????????????? ########################################### [100%]
就是這個樣子!MyPackage 現在已經安裝完成,可供使用了。
2 rpm -e (刪除)
要刪除已安裝的包,可使用 -e 開關。 rpm 將使用數據庫來刪除該包的所有文件。如果有已安裝的其他包依賴正在刪除的包, rpm 將會異常退出。您必須使用 nodeps 開關來執行強制刪除( nodeps 還可以用于強制安裝)。在使用這個開關來強制安裝或刪除時,務必 非常 小心。刪除其他包所依賴的包,可能會導致災難性的結果。下面這個命令刪除我們在上面安裝的包:
$ rpm -e MyPackage
?
?
注意,包的刪除并不一定需要它的完整名稱(包括版本號)。安裝時需要完整名稱,因為我們是在引用一個文件名稱。已安裝的包僅通過它們的名稱來引用。包的名稱是版本號之前的所有內容。
3 rpm -V(驗證)
驗證開關非常有用。它將包文件的當前狀態與它們在安裝時的原始狀態作比較。兩種狀態之間的區別將用一個代碼來顯示:
文件驗證結果
S
?文件大小不一致
?
M
?模式不一致(包括權限和文件類型)
?
5
?MD5 校驗和不一致
?
D
?設備主要/次要編號不匹配
?
L
?readLink(2) 路徑不匹配
?
U
?用戶擁有關系不一致
?
G
?群組擁有關系不一致
?
T
?mTime 不一致
?
如果您對某個包運行 rpm -V ,并且發現某個可執行文件的大小發生了變化,那可能就是安全漏洞的征兆。
4 rpm -U(升級)
一旦某個包已經安裝,嘗試安裝具有相同名稱的包將產生一條消息,指出該包已經安裝。 如果想要將某個包升級到更新的版本,可使用 -U 開關來升級。升級還具有另一個影響。當對多個包名稱運行升級時,它將設法按依賴關系的順序放置包。換句話說,必需的包將首先安裝。不管某個包是否已經安裝,都可以對它使用升級開關,許多人使用它而不是使用 -i 開關來執行安裝和升級。下面是使用升級開關來加載多個 rpm 包的例子:
$ rpm -Uvh My*.rpm
Preparing...??????????????? ########################################### [100%]
?? 1:bMyPackageDep????????? ########################################### [ 50%]
?? 1:aMyPackageNew????????? ########################################### [100%]
?
?
在上面的例子中,bMyPackageDep 是 aMyPackageNew 的前提條件,因此盡管文件名稱以相反的順序排列, rpm 也會對它們正確排序。
5 rpm -q(查詢)
可以從 rpm 數據庫中查詢多種有用的信息。對 rpm 數據庫擁有讀訪問權限的任何用戶都能夠運行查詢。默認情況下,全部用戶都擁有讀訪問權限。要運行一個查詢,可使用 -q 開關帶上要查詢的包的名稱。這樣將返回該包的版本。
$ rpm -q MyPackage????????
?
MyPackage-1.0.0
???????
?
?
包的名稱必須精確匹配,不允許使用通配符。然而,如果記不住包的完整名稱,您可以使用 grep 工具來幫助找到它。可以使用 -qa 開關來查詢所有已安裝的包,并用 grep 來管道輸出您能記住的信息。例如:
$ rpm -qa | grep IBM????????
?
IBMWSAppDev-Product-5.0-0?????????
?
IBMWSSiteDevExp-Core-5.0-0?????????
?
IBMWSSiteDev-Core-5.0-0?????????
?
IBMWSTools-WAS-BASE-V5-5.0-0?????????
?
IBMJava118-SDK-1.1.8-5.0?????????
?
IBMWSWB-samples-5.0-0?????????
?
IBMWSWB-5.0-0?????????
?
IBMWSAppDev-Core-5.0-0?????????
?
IBMWSAppDev-5.0-0?????????
?
IBMWSTools-5.0-0
???????
?
?
除了版本號外, rpm -q 還可以提供關于包的其他有用信息。下面就是這樣一些例子:
使用 rpm 查詢獲取信息
rpm -q changelog
?顯示包的開發變更歷史記錄
?
rpm -qc
?顯示包的配置文件
?
rpm -qd
?顯示包的文檔文件
?
rpm -qi
?顯示包描述
?
rpm -ql
?顯示包的文件的列表
?
rpm -qR
?顯示包的依賴關系
?
還有另一個有趣的查詢命令,它針對文件而不是針對包運行。
rpm -q whatprovides <filename>
?
?
上面這個命令將識別與給定的 filename(文件名)相關聯的包。filename 必須包括文件的絕對路徑,因為信息就是以這種方式存儲在 rpm 數據庫中的。
?
四 參考
1)http://hi.baidu.com/imace/blog/item/767c992677601c148b82a111.html
2)http://www.ibm.com/developerworks/cn/linux/l-roadmap/part9/index.html
五 完!
?
轉載于:https://www.cnblogs.com/itech/archive/2009/08/12/1544653.html
總結
以上是生活随笔為你收集整理的rpm安装文件制作和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现在不坚持,以后都会放弃
- 下一篇: ASP.NET用户登录模块代码