【1. 基本流程】
(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等子目录中;
(2) 根据自己的需要修改
相关需求归纳:生成可编译版、打新补丁、使能/禁用某些功能、取消某些限制(如只能root用户才能使用等)。。。 。。。
1)打新补丁:rpm -ivh xxx.src.rpm && 修改xxx.spec文件(在其中加入Patchnum: $new_patch_name.patch并在%prep中加入相应命令)
2)根据需求修改xxx.spec文件的相应字段;如在CFLAGS上加入-g参数以生成可调试版;
如果没有相应的xxx.spec文件&&在发行商的网站上也没有相应的xxx.spec文件,可以通过rpmdev-newspec命令来生成一个spec文件的模板文件,然后根据实际情况编辑生成的spec文件。
(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参数组合】
(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命令手册 ===========================
一、安装
命令格式: 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 资料库存所在的路径为
二、删除
命令格式: 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的当前版本