RPM(Rpm Package Management)在ReadHat等發行版下被用作軟件包管理程序,其將某個軟件相關的文件置入一個.rpm包中,用rpm命令,我們可以方便地完成Linux下軟件安裝、文件查看等操作。在《rpm包管理》一文中我們學習了rpm安裝、查看軟件包的相關方法,下面介紹如何制作rpm包。
1.兩種rpm包
用rpm打包,將會產生兩種rpm包,一是源碼包(xxx.src.rpm),一是binary包(xxx.rpm)。源碼包可用於開源軟件發布源碼,一般包含xxx.spec文件和xxx.tar.gz文件;binary包用於直接軟件安裝,包含已完成編譯的可執行文件以及相關配置文件等:
# rpm -qlp ../SRPMS/hello-0.1-1.src.rpm hello-0.1-1.spec hello-0.1-1.tar.gz # rpm -qlp ../RPMS/x86_64/hello-0.1-1.x86_64.rpm /bin/hello /usr/share/doc/packages/hello /usr/share/doc/packages/hello/README
2.打包目錄
從.tar.gz等格式的源碼文件,到.rpm文件,需要經過編譯過程,為此rpm提供了專門的目錄進行打包:
- SOURCES目錄:存放.tar.gz源碼文件
- SPECS目錄:存放.spec文件
- SRPMS目錄:存放生成的xxx.src.rpm文件
- BUILD目錄:存放解壓后的源碼文件或其他中間的臨時文件
- RPMS目錄:存放生成的xxx.rpm文件
對於suse,以上目錄在/usr/src/packages路徑下,對於RedHat,以上目錄在/usr/src/redhat路徑下。
3.spec文件
rpm包制作過程中最主要一步就是編寫spec文件,spec文件用於提供軟件相關描述以及如何編譯、安裝等信息,以下是一個spec文件示例:
Summary: rpm hello world. Name: hello Version: 0.1 Source: $RPM_SOURCE_DIR/hello-0.1-1.tar.gz Release: 1 Vendor: lx License: Share Group: Application/test %description print hello %prep rm -rf $RPM_BUILD_DIR/hello-0.1-1 zcat $RPM_SOURCE_DIR/hello-0.1-1.tar.gz | tar xvf - %build cd $RPM_BUILD_DIR/hello make %install cd $RPM_BUILD_DIR/hello make install %files %doc $RPM_BUILD_DIR/hello/README /bin/hello
以上開頭一段用於描述軟件包相關信息,除了Summary/Name/Version/Source/Release/Vonder/License/Group外還有其他可選域,以上所列除Source外其他為必選域,建議在spec中提供Source信息,生成.src.rpm時軟件包由Source提供的路徑獲取,否則.src.rpm中不包含.tar.gz源碼包。
后面%xx為spec文件的宏定義,在/usr/lib/rpm/macros文件找到相關定義,最重要的是以下幾個部分:
- %prep:編譯前的准備部分,一般為刪除之前的中間文件(BUILD目錄),解壓縮源碼文件
- %build:完成make編譯部分,如果源碼中提供了Makefile文件,就是一條make命令
- %install:完成安裝部分,如果源碼中提供了Makefile文件,就是一條make install命令
- %files:列出軟件被安裝后,目標機器上由該文件新建的文件,包括可執行文件、配置文件、man文件等
4.生成目標文件
.tar.gz文件放到SOURCES目錄下,.spec文件編輯完成並放到SPECS目錄下,這些完成后我們就可以打包生成.src.rpm文件和.rpm文件了:
# rpmbuild -ba hello-0.1-1.spec
以上rpmbuild命令用到 -ba 選項,表示既生成.src.rpm文件,又生成.rpm文件。以上命令執行后,我們來看各打包目錄下生成的文件:
/usr/src/packages # ll *
BUILD:
drwxr-xr-x 2 root root 4096 04-13 20:49 hello
RPMS:
drwxrwxrwt 2 root root 4096 04-13 20:49 x86_64
SOURCES:
-rw-r--r-- 1 root root 346 04-13 00:42 hello-0.1-1.tar.gz
SPECS:
-rw-r--r-- 1 root root 411 04-13 22:46 hello-0.1-1.spec
SRPMS:
-rw-r--r-- 1 root root 2076 04-13 20:49 hello-0.1-1.src.rpm
RPMS的x86_64目錄下:
/usr/src/packages # ll RPMS/x86_64/ -rw-r--r-- 1 root root 5102 04-13 20:49 hello-0.1-1.x86_64.rpm
5.rpm解包
rpm2cpio xxx.rpm | cpio -div
Reference: Maximum RPM
RPM HOWTO