rpm 打包及其命令
PRM打包:
RPM打包使用的是rpmbuild命令,這個命令來自rpm-build包,這個是必裝的。
$ yum install rpm-build
當然也可以直接安裝rpmdevtools,這個工具還包含一些其他的工具,同時它依賴rpm-build,所以直接安裝的話會同時把rpm-build裝上。
$ yum install rpmdevtools
原理
RPM打包的時候需要編譯原始碼,還需要把編譯好的配置檔案啊二進位制命令檔案啊之類的東西按照安裝好的樣子放到合適的位置,還要根據需要對RPM的包進行測試,這些都需要先有一個“工作空間”。rpmbuild命令使用一套標準化的“工作空間”:
$ rpmdev-setuptree
rpmdev-setuptree這個命令就是安裝rpmdevtools帶來的。可以看到運行了這個命令之後,在$HOME家目錄下多了一個叫做rpmbuild的資料夾,裡邊內容如下:
$ tree rpmbuild
rpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
如果沒有安裝rpmdevtools的話,其實用mkdir命令建立這些資料夾也是可以的。
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
從這些檔案的名字大體也能看得出來都是幹嘛用的。具體來說:
預設位置 |
巨集程式碼 |
名稱 |
用途 |
~/rpmbuild/SPECS |
%_specdir |
Spec 檔案目錄 |
儲存 RPM 包配置(.spec)檔案 |
~/rpmbuild/SOURCES |
%_sourcedir |
原始碼目錄 |
儲存原始碼包(如 .tar 包)和所有 patch 補丁 |
~/rpmbuild/BUILD |
%_builddir |
構建目錄 |
原始碼包被解壓至此,並在該目錄的子目錄完成編譯 |
~/rpmbuild/BUILDROOT |
%_buildrootdir |
最終安裝目錄 |
儲存 %install 階段安裝的檔案 |
~/rpmbuild/RPMS |
%_rpmdir |
標準 RPM 包目錄 |
生成/儲存二進位制 RPM 包 |
~/rpmbuild/SRPMS |
%_srcrpmdir |
原始碼 RPM 包目錄 |
生成/儲存原始碼 RPM 包(SRPM) |
環境搭好之後編輯一個.spec檔案。然後用這個檔案進行打包:
$ rpmbuild -ba hello.spec
從spec文件建立有以下選項:
-bp #只執行spec的%pre 段(解開原始碼包並打補丁,即只做準備)
-bc #執行spec的%pre和%build 段(準備並編譯)
-bi #執行spec中%pre,%build與%install(準備,編譯並安裝)
-bl #檢查spec中的%file段(檢視檔案是否齊全)
-ba #建立原始碼與二進位制包(常用)
-bb #只建立二進位制包(常用)
-bs #只建立原始碼包
spec文件中常用的幾個巨集(變數)
1. RPM_BUILD_DIR: /usr/src/redhat/BUILD
2. RPM_BUILD_ROOT: /usr/src/redhat/BUILDROOT
3. %{_sysconfdir}: /etc
4. %{_sbindir}: /usr/sbin
5. %{_bindir}: /usr/bin
6. %{_datadir}: /usr/share
7. %{_mandir}: /usr/share/man
8. %{_libdir}: /usr/lib64
9. %{_prefix}: /usr
10. %{_localstatedir}: /usr/var
其實以上引數值都是在/usr/lib/rpm/macros檔案中定義的。
RPM命令:
RPM是RedHat Package Manager(RedHat軟體包管理工具)類似Windows裡面的“新增/刪除程式”
rpm 執行安裝包
二進位制包(Binary)以及原始碼包(Source)兩種。二進位制包可以直接安裝在計算機中,而原始碼包將會由RPM自動編譯、安裝。原始碼包經常以src.rpm作為字尾名。
常用命令組合:
-ivh:安裝顯示安裝進度--install--verbose--hash
-Uvh:升級軟體包--Update;
-qpl:列出RPM軟體包內的檔案資訊[Query Package list];
-qpi:列出RPM軟體包的描述資訊[Query Package install package(s)];
-qf:查詢指定檔案屬於哪個RPM軟體包[Query File];
-Va:校驗所有的RPM軟體包,查詢丟失的檔案[View Lost];
-e:刪除包
rpm -q samba //查詢程式是否安裝
rpm -ivh /media/cdrom/RedHat/RPMS/samba-3.0.10-1.4E.i386.rpm //按路徑安裝並顯示進度
rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm //指定安裝目錄
rpm -ivh --test gaim-1.3.0-1.fc4.i386.rpm //用來檢查依賴關係;並不是真正的安裝;
rpm -Uvh --oldpackage gaim-1.3.0-1.fc4.i386.rpm //新版本降級為舊版本
rpm -qa | grep httpd #[搜尋指定rpm包是否安裝]--all搜尋*httpd*
rpm -ql httpd#[搜尋rpm包]--list所有檔案安裝目錄
rpm -qpi Linux-1.4-6.i368.rpm#[檢視rpm包]--query--package--install package資訊
rpm -qpf Linux-1.4-6.i368.rpm#[檢視rpm包]--file
rpm -qpR file.rpm#[檢視包]依賴關係
rpm2cpio file.rpm |cpio -div #[抽出檔案]
rpm -ivh file.rpm #[安裝新的rpm]--install--verbose--hash
rpm -ivh
rpm -Uvh file.rpm #[升級一個rpm]--upgrade
rpm -e file.rpm #[刪除一個rpm包]--erase
常用引數:
Install/Upgrade/Erase options:
-i, --install install package(s)
-v, --verbose provide more detailed output
-h, --hash print hash marks as package installs (good with -v)
-e, --erase erase (uninstall) package
-U, --upgrade=<packagefile>+ upgrade package(s)
--replacepkge 無論軟體包是否已被安裝,都強行安裝軟體包
--test 安裝測試,並不實際安裝
--nodeps 忽略軟體包的依賴關係強行安裝
--force 忽略軟體包及檔案的衝突
Query options (with -q or --query):
-a, --all query/verify all packages
-p, --package query/verify a package file
-l, --list list files in package
-d, --docfiles list all documentation files
-f, --file query/verify package(s) owning file
RPM原始碼包裝安裝
.src.rpm結尾的檔案,這些檔案是由軟體的原始碼包裝而成的,使用者要安裝這類RPM軟體包,必須使用命令:
rpm --recompile vim-4.6-4.src.rpm #這個命令會把原始碼解包並編譯、安裝它,如果使用者使用命令:
rpm --rebuild vim-4.6-4.src.rpm #在安裝完成後,還會把編譯生成的可執行檔案重新包裝成i386.rpm的RPM軟體包。