首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

RPM包打造总结篇

2013-04-05 
RPM包制作总结篇RPM全称是 Red Hat Package Manager(Red Hat包管理器)。几乎所有的 Linux 发行版本都使用这

RPM包制作总结篇
     RPM全称是 Red Hat Package Manager(Red Hat包管理器)。几乎所有的 Linux 发行版本都使用这种形式的软件包管理安装、更新和卸载软件。目前,我从事通信行业MDS产品的开发,经常需要自己发布RPM安装包及使用RPM命令。下面就简单介绍下RPM一些基本的命令。

1) 安装
rpm -i ( or --install) options file1.rpm ... fileN.rpm 通过rpm -ivh可以把rpm软件包安装到系统中,当然也可以使用不同的参数选项,笔者建议使用-ivh ,使用该选项可以解决大部分rpm软件包的安装,至于详细的参数说明可用查看rpm的man 文档。一般在安装中为了去掉一些依赖或者强制安装需要加 --nodeps --force
2 )删除
rpm -e ( or --erase) options pkg1 ... pkgN 如果某个软件包你再也不想使用了,那就用以上这个命令彻底的把你指定的rpm软件包清除掉把。
3 )升级
rpm -U ( or --upgrade) options file1.rpm ... fileN.rpm 由于开源软件更新速度快,用户当然要使用最新版本的软件包,此时最合适的就是rpm升级功能,当然最理想的参数选项就是-Uvh。
4 )查询
rpm -q ( or --query) options 实际上我们通常使用rpm工具最多的功能还是它的查询功能,比如查看软件包的版本、依赖关系等软件包的详细说明都要用到。最有用的参数选项是-qpi。
5 )校验已安装的软件包
rpm -V ( or --verify, or -y) options 一般我们可用通过该命令来验证已安装软件包,根据笔者的经验该命令一般没什么用途,只做一个了解就ok了。

SPEC文件解读   下面内容很大一部分是在其他博客中黏贴过来的,写得很详细:Name: 引用软件包的名字,最终RPM软件包是用该名字与版本号,释出号及版本号来命名软件包的,后面可使用%{name}的方式。

Summary: 软件包的内容概要

Version: 软件的实际版本号,例如:1.0.1等,后面可使用%{version}引用

Release: 发布释出号,例如:1linuxing等,标明第几次打包,后面可使用%{release}引用

Group: 软件分组,建议使用标准分组

License: 软件授权方式,通常就是GPL

Source: 源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用;如 stardict-2.0.tar.gz。

BuildRoot: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:
%{_tmppath}/%{name}-%{version}-%{release}-root

%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}
该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。
后面可使用$RPM_BUILD_ROOT 方式引用。

URL: 软件的主页

Vendor: 发行商或打包组织的信息,例如RedFlag Co,Ltd

Disstribution: 发行版标识

Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用

Prefix: %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能

Prefix: %{_sysconfdir} 这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识

Build Arch: 指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值

Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:
libpng-devel >= 1.0.20 zlib 
※“>=”号两边需用空格隔开,而不同软件名称也用空格分开
还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定 

Provides: 指明本软件一些特定的功能,以便其他rpm识别

Packager: 打包者的信息

%description 软件的详细说明

spec脚本的主体中也包括了很多关键字和描述,下面会一一列举。我会把一些特别需要留意的地方标注出来。
%prep 预处理脚本

%setup -n %{name}-%{version} 把源码包解压并放好
通常是从/usr/src/asianux/SOURCES里的包解压到/usr/src/asianux/BUILD/%{name}-%{version}中。
一般用%setup -c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了。

%patch 打补丁
通常补丁都会一起在源码tar.gz包中,或放到SOURCES目录下。一般参数为:
%patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目录
%Patch2 -p1 -b xxx.patch 打上指定的补丁,-b是指生成备份文件

◎补充一下 
1 Executing: %prep2 + umask 0223 + cd /usr/src/dist/BUILD4 + exit 05 Executing: %build6 + umask 0227 + cd /usr/src/dist/BUILD

生成的文件会在刚才建立的RPM目录下存在。

2)只生成src格式的rpm包

rpmbuild -bs xxx.spec

生成的文件会在刚才建立的SRPM目录下存在。

3) 只需要生成完整的源文件

rpmbuild -bp xxx.spec

源文件存在目录BUILD下。

读者朋友可能对这个命令不太明白,这个命令的作用就是把tar包解开然后把所有的补丁文件合并而生成一个完整的具最新功能的源文件。

4) 完全打包

rpmbuild -ba xxx.spec

产生以上3个过程分别生成的包。存放在相应的目录下。

软件包制作完成后可用rpm命令查询,看看效果。如果不满意的话可以再次修改软件包描述文件,重新运行以上命令产生新的RPM软件包。


参考文件:http://www.ibm.com/developerworks/cn/linux/l-rpm/index.html
http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part2/index.html
http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part3/index.html
http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part1/index.html
http://www.ibm.com/developerworks/cn/linux/l-rpm1/index.html


热点排行