【1. 基本流程】html
(1) 下載&安裝相應的src.rpm包
wget xxx.src.rpm && rpm -ivh xxx.src.rpm
這裏的「安裝」是指把xxx.src.rpm中的tar.gz、patches、xxx.spec等文件分別輸出到/usr/src/redhat/的SOURCES、SPECS等子目錄中;node
(2) 根據本身的須要修改linux
相關需求概括:生成可編譯版、打新補丁、使能/禁用某些功能、取消某些限制(如只能root用戶才能使用等)。。。 。。。數組
1)打新補丁:rpm -ivh xxx.src.rpm && 修改xxx.spec文件(在其中加入Patchnum: $new_patch_name.patch並在%prep中加入相應命令)
2)根據需求修改xxx.spec文件的相應字段;如在CFLAGS上加入-g參數以生成可調試版;app
若是沒有相應的xxx.spec文件&&在發行商的網站上也沒有相應的xxx.spec文件,能夠經過rpmdev-newspec命令來生成一個spec文件的模板文件,而後根據實際狀況編輯生成的spec文件。ide
(3) 從新生成rpm文件:rpmbuild -ba /usr/src/redhat/SPECS/xxx.spec
這時在/usr/src/redhat/RPMS/i386/下就生成了新的xxx.rpm文件。工具
(4)使用 Mock 和 Koji 去測試 RPM 包 from 「Fedora新維護人員指南」,若是本身使用可略去此步。測試
參考:「file.src.rpm使用方法簡單介紹」 @ http://fedora.linuxsir.org/main/src.spec.html網站
【2. 經常使用的rpm參數組合】ui
(1)rpm -qx file_name, x={f,i,l,a,p...}, file_name能夠是命令名、動態庫名稱、配置文件名等等。
使用此命令的前提:相應的rpm包已經安裝。
rpm -qf file:查詢文件file是哪一個rpm包中的;rpm -qf `which your_cmd`, rpm -qf `locate file_name`
rpm -qi rpm_name:查看指定rpm包安裝的詳細信息;
rpm -ql installed_rpm_name:列出已經安裝的rpm包中包含了哪些文件及他們的安裝路徑。如rpm -ql iptraf
用如下選項與 -q 連用來指明要查詢哪些軟件包的信息。這些選項被稱之爲「軟件包指定選項」:
-a 查詢全部已安裝的軟件包。
-f <file> 將查詢包含有文件 <file>的軟件包。
-p <packagefile> 查詢軟件包文件名爲 <packagefile>的包。
有幾種方式來指定查詢軟件包時所顯示的信息。 如下選項可經過讀取rpm包頭部的辦法顯示rpm包的信息,這樣的選項被稱做「信息選擇選項」:
-i 顯示軟件包信息,如描述、發行號、大小、編譯日期、安裝日期、硬件平臺、以及其它一些各種信息。
-l 列出軟件包中包含的文件。(列出已經安裝的rpm包中包含了哪些文件及他們的安裝路徑)
-s 顯示軟件包中全部文件的狀態。
-d 列出被標註爲文檔的文件 (如,man 手冊、 info 信息、README,等等) 。
-c 列出被標註爲配置文件的文件。這些文件是須要在安裝完畢後加以定製的,如 (sendmail.cf, passwd, inittab, 等) 。
若是要在執行上述選項的同時,顯示文件列表, 能夠同時使用 -v 命令行選項,就能得出與 ls -l 格式相似的輸出。
(2)查看未安裝的rpm/src.rpm包中包含的文件列表
- 在本地暫時只能使用(4)中提供的方法;
- 經過rpmfind.net等網站進行查詢;
(3)rpm -ivh xxx.rpm:從新安裝;(和-Uvh相比,建議用-ivh)
rpm -ivh --relocate /=/tmp/test/ xxx.rpm
(4)rpm2cpio xxx.rpm/xxx.src.rpm:將rpm解壓爲cpio歸檔;
rpm2cpio xxx.rpm/xxx.src.rpm | cpio -idmv (rpm2cpio xxx.rpm | cpio --extract --make-directories)
參數-i(或--extract)表示提取文件; v表示指示執行進程;-d(或--make-directory)表示根據包中文件原來的路徑創建目錄;m表示保持文件的更新時間。
【3. 關於rpmbuild -bSTAGE語法的分析】
關於「打包」的說明
使用rpmbuild工具來發布rpm格式的源碼包(xxx.src.rpm)或者二進制包(xxx.rpm)。若是已經根據本地源碼包創建了spec文件(該文件要以.spec結束,能夠用rpmdev-newspec生成spec文件模板)和rpm包構建環境(由 /usr/src/redhat/{BUILD,SOURCE,SPEC,SRPM,RPM}等5個目錄組成的rpm構建環境,其中BUILD目錄用來存 放打包過程當中的源文件,SOURCE用來存放打包是要用到的源文件和patch,SPEC用來存放spec文件,SRPM、RPM分別存放打包生成的 rpm格式的源文件和二進制文件),就能夠根據須要來選用不一樣的參數打包文件。下面總結了幾種常見的打包參數組合:
1) 只生成二進制格式的rpm包:rpmbuild -bb xxx.spec。用此命令生成軟件包,執行後屏幕將顯示以下信息:(每行開頭爲行號)
1 Executing: %prep 2 + umask 022 3 + cd /usr/src/dist/BUILD 4 + exit 0 5 Executing: %build 6 + umask 022 7 + cd /usr/src/dist/BUILD |
2)只生成src格式的rpm包:rpmbuild -bs xxx.spec。生成的文件會在剛纔創建的SRPM目錄下存在。
3) 只須要生成完整的源文件:rpmbuild -bp xxx.spec。源文件存在目錄BUILD下,生成相應rpm包後,BUILD下的源文件不會被自動刪除。這個命令的做用就是把tar包解開而後把全部的補丁文件合併而生成一個完整的具最新功能的源文件。
4) 徹底打包:rpmbuild -ba xxx.spec
5)from rpmbuild's manpage
-ba:"build binary and source packages (after doing the %perp, %build and %install stages)";
-bp:"execute the %prep stage from the spec file. Normally this involves unpacking the sources and applying any patches.";
rpmbuild經常使用參數: -bb 只編譯二進制rpm包 -bs 只編譯源碼rpm包(src.rpm) -ba 同時編譯二進制和源碼rpm包(src.rpm) -bp解開tar包而後把全部的補丁文件合併而生成一個完整的具最新功能的源文件
b=build(-b); a=after, p=prep, s=source, b=binary;
參考:
(1)「RPM 打包技術與典型 SPEC 文件分析」一.4打包 @ http://www.ibm.com/developerworks/cn/linux/l-rpm/?S_TACT=105AGX52&S_CMP=tech-51CTO
(2)「Fedora新維護人員指南」 fedoraproject.org/wiki/Zh/Fedora新維護人員指南
【4. Use alien to convert RPM to Deb or Deb2RPM】
========================= 附錄:RPM命令手冊 ===========================
1、安裝
命令格式: 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 不運行預安裝和後安裝腳本(spec文件中的%prep和%clean部分的腳本)
--prefix 將軟件包安裝到由 指定的路徑下 (已驗證:僅限於二進制rpm安裝包,不支持src.rpm)
--ignorearch 不校驗軟件包的結構
--ignoreos 不檢查軟件包運行的操做系統
--nodeps 不檢查依賴性關係
--ftpproxy 用 做爲 FTP代理(直接安裝遠程的rpm包,而非先下載到本地再安裝)
--ftpport 指定FTP的端口號爲
通用選項:
-v 顯示附加信息
-vv 顯示調試信息
--root 讓RPM將指定的路徑作爲"根目錄",這樣預安裝程序和後安裝程序都會安裝到這個目錄下
--rcfile 設置rpmrc文件爲
--dbpath 設置RPM 資料庫存所在的路徑爲
2、刪除
命令格式: rpm -e ( or --erase) options pkg1 ... pkgN
參數:pkg1 ... pkgN :要刪除的軟件包
詳細選項:
--test 只執行刪除的測試
--noscripts 不運行預安裝和後安裝腳本程序
--nodeps 不檢查依賴性
通用選項:
-vv 顯示調試信息
--root 讓RPM將指定的路徑作爲"根目錄",這樣預安裝程序和後安裝程序都會安裝到這個目錄下
--rcfile 設置rpmrc文件爲
--dbpath 設置RPM 資料庫存所在的路徑爲
3、升級
命令格式: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 資料庫存所在的路徑爲
4、查詢
命令格式: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 資料庫存所在的路徑爲
5、校驗已安裝的軟件包
命令格式: 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 資料庫存所在的路徑爲
6、校驗軟件包中的文件
語法: rpm -K ( or --checksig) options file1.rpm ... fileN.rpm
參數: file1.rpm ... fileN.rpm 軟件包的文件名
Checksig--詳細選項
--nopgp 不校驗PGP簽名
通用選項:
-v 顯示附加信息
-vv 顯示調試信息
--rcfile 設置rpmrc文件爲
7、其它RPM選項
--rebuilddb 重建RPM資料庫 --initdb 建立一個新的RPM資料庫 --quiet 儘量的減小輸出 --help 顯示幫助文件 --version 顯示RPM的當前版本