-->

建立RPM包

工作过程

通过处理spec文件生成一个shell脚本,进行如下操作: 先将源代码(源码要放在相应的SOURCE目录下)在构建的机器上在BUILD目录下进 行解压(默认只对第一个SOURCE进行相关操作,其他SOURCE要自己处理),打补 丁(默认只处理第一个补丁),编译;然后在构建的机器上进行进行安装(这里可以可以设置构建根,使它安 装在构建根上),得到二进制文件再构建出安装包来。整个过程将在BUILD目录下 完成.

spec 文件

一个简单的spec文件

Summary: GNU indent
Name: indent
Version: 2.2.6
Release: 2
Source0: %{name}-%{version}.tar.gz
License: GPL
Group: Development/Tools
BuildRoot: %{_builddir}/%{name}-root
%description
The GNU indent program reformats C code to any of a variety of
formatting standards, or you can define your own.
%prep
%setup -q
%build
./configure
make
%install
rm -rf $RPM_BUILD_ROOT
make DESTDIR=$RPM_BUILD_ROOT install
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root)
/usr/local/bin/indent
%doc /usr/local/info/indent.info
%doc %attr(0444,root,root) /usr/local/man/man1/indent.1
%doc COPYING AUTHORS README NEWS

流程

spec文件内容

头定义了多种信息

各个宏的意义及选项

%setup

%setup 不加任何选项,仅将软件包打开。 %setup n newdir 将软件包解压在newdir目录。 %setup -c 解压缩之前先产生目录。 %setup b num 将第num个source文件解压缩。 %setup T 不使用default的解压缩操作。 %setup T b 0 将第0个源代码文件解压缩。 %setup c n newdir 指定目录名称newdir,并在此目录产生rpm套件。 %setup -a 于-b相似,只是它将当前目录变成最高层的build目录,在进行解压缩

工具命令

取出RPM包中的文件

rpm2cpio diskcheck-1.0-1.noarch.rpm > tmp.cpio

cpio -t -F tmp.cpio #这会列出其中的文件 cpio -i -F tmp.cpio filename.ext #取出文件

不安装但是获取rpm包中的文件

使用工具rpm2cpio和cpio rpm2cpio xxx.rpm | cpio -vi

rpm2cpio xxx.rpm | cpio -idmv

rpm2cpio xxx.rpm | cpio --extract --make-directories

参数i和extract相同,表示提取文件。v表示指示执行进程 d和make-directory相同,表示根据包中文件原来的路径建立目录 m表示保持文件的更新时间。

rpm 使用详解

用法: rpm [选项...]
查询选项 (参数 -q 或 --query):
-c, --configfiles           列出所有配置文件
-d, --docfiles             列出所有文档文件
--dump                   导出基本文件信息
-l, --list               列出包内的所有文件
--queryformat=QUERYFORMAT     使用紧跟的查询格式
-s, --state               显示文件列表的状态
-v, --verbose             显示详细的文件列表
-a, --all                 查询/校验所有包
-f, --file               查询/校验包的包含文件
-g, --group               查询/校验组内的包
-p, --package             查询/校验一个包文件(例如一个二进制的 *.rpm 文件)
--querytags               显示已知的查询标签
--specfile               查询规格文件
--whatrequires             查询/校验指定包的依赖关系
--whatprovides             查询/校验指定包的被依赖关系

校验选项 (参数 -V 或 --verify):
--nomd5[|=0x1]             不使用MD5分类校验文件
--nofiles[|=0x10000]         不校验包中的文件
--nodeps[|=0x20000]         不校验包的依赖关系
--noscript[|=0x40000]         不执行校验脚本(任何脚本)
-a, --all                 查询/校验所有包
-f, --file               查询/校验包所含的文件
-g, --group               查询/校验组内的包
-p, --package             查询/校验一个包文件(例如一个二进制的 *.rpm 文件)
--querytags               显示已知的查询标签
--specfile               查询规格文件
--whatrequires             查询/校验指定包的依赖关系
--whatprovides             查询/校验指定包的被依赖关系

签名选项:
--addsign                 往包内增加一个签名
--resign                 签名一个包(去除当前签名)
-K, --checksig             校验包的签名
--nogpg[&=~0x4]             忽略任何GPG的签名
--nomd5[&=~0x2]             不校验文件的MD5的校验数

数据库选项:
--initdb                 初始化数据库
--rebuilddb               从已安装包的头信息中重建数据库的反转列表

安装/升级/卸载选项:
--allfiles[|=0x40]           安装所有文件, 忽略找不到的配置项里面的部分
--allmatches[|=0x2]         卸载所有和<package>项匹配的包。(如果<package>中指定多个包则会产生一个错误信息)
--badreloc[|=0x8]           在非重定位包中重定位文件
-e, --erase=<package>+       卸载包
--excludedocs[|=0x20]         不安装文档
--excludepath=<path>         带引导组件的忽略文件<path>
--force[|=0x74]             --replacepkgs --replacefiles的快捷方式
-F, --freshen=<packagefile>+   在已安装的情况下升级包
-h, --hash[|=0x2]           为安装包打上哈希标记(最好带-v选项)
--ignorearch[|=0x2]         不校验包的体系
--ignoreos[|=0x1]           不校验包的操作系统
--ignoresize[|=0x180]         安装之前不检查磁盘空间
--includedocs             安装文档
--install=<packagefile>+       安装包
--justdb[|=0x8]             升级数据库,但是不修改文件系统
--nodeps                 不校验包的依赖关系
--noorder[|=0x8]           不重新记录包的安装信息到依赖性中
--noscripts[|=0xff0000]       不执行包的脚本
--notriggers[|=0x990000]       不执行被该安装包触发的任何脚本
--oldpackage[|=0x40]         升级到该包的一个旧版本
                      (--force 升级的时候,该操作自动执行)
--percent[|=0x1]           打印包的安装进度
--prefix=<dir>             如果允许重定位,则重定位包到<dir>
--relocate=<old>=<new>       从路径<old>到<new>重定位文件
--repackage[|=0x400]         重新打包保存下来的卸载包的文件
--replacefiles[|=0x30]       安装时用包文件替换已安装文件
--replacepkgs[|=0x4]         如果包已经存在,那么重新安装
--test[|=0x1]             不安装包,但是要检测能否正常运行
-U, --upgrade=<packagefile>+   升级包

所有rpm模式的通用选项:
--version                 打印所使用的rpm的版本信息
--quiet                 提供少量详细信息输出
-v, --verbose             提供更多的详细信息输出
--define='<name> <body>'       使用值<body>来定义宏<name>
--eval=<expr>+             打印<expr>+的宏扩展
-r, --root=<dir>           使用<dir>作为顶层目录(默认: "/")
--macros=<file:...>         读入<file:...>来代替默认的宏文件
--rcfile=<file:...>         读入<file:...>来代替默认的rpmrc文件
--showrc                 显示最终的rpmrc和macro配置

通过popt alias/exec 实现的选项:
--scripts                 列出包中的所有安装/卸载脚本
--setperms               在包中设置文件的权限
--setugids               在包中设置文件的用户/组关系
--conflicts               列出此包的兼容性
--obsoletes               列出安装此包需要卸载的别的包
--provides               列出此包提供的兼容性
--requires               列出此包所需要的兼容性
--info                   列出包中的叙述信息
--changelog               列出该包的变更日志
--triggers               列出包中的触发脚本
--last                   根据安装时间列出包,最近时间的优先
--filesbypkg               列出每个包的所有文件
--redhatprovides           根据所包含的提供的兼容性查找包名(需要安装包rpmdb-redhat)
--redhatrequires           根据所依赖的包的兼容性查找包名(需要安装包rpmdb-redhat)
--buildpolicy=<policy>       设置包的根目录<policy>(例如,压缩man手册)
--with=<option>             打开打包的<选项>配置
--without=<option>           关闭打包的<选项>配置
帮助选项:
-?, --help               显示该帮助信息
--usage                 显示用法摘要

相关资源

rpm建包原理 http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=86980rpm