rpm包的管理和创建
RPM 是 Red Hat Package Manager 的缩写即 Red Hat 软件包管理工具。
在 Fedora 、Redhat、Mandriva、SuSE、YellowDog、RedFlag 等发行版本,
以及在这些版本基础上开发出来的发行版中采用。除了 RPM 外另一个著名的 Linux 包管
理方式是 APT(Advanced Packaging Tool),目前主要在 Debian 和类 Debian
系统中使用,例如 Ubuntu.
RPM 包里面包如下内容:
1. 可执行的二进制文件
2. 配置文件
3. 安装脚本
4. 包依赖关系判断文件
在选择 RPM 包和编译 RPM 包的时候要注意编译环境参数,不同的环境参数针对不同的
运行环境,包括针对不同硬件架构、CPU 型号、内存寻址范围、依赖库版本和模块选择。
另一个要注意问题是,RedHat 不支持用户自己编译的 RPM 包,即使此 RPM 包是使用
RedHat 官方提供的 SRPM 编译出来的。



RPM包组件
1:rpm-build包和/usr/src/redhat目录
2:开始点 1)spec file 2)source code tar.gz 方式 3)补丁 patch file
3:生成文件(产品)二进制的RPM包;源代码RPM包(SRPM)


使用 RPM 创建软件包
RPM 编译工具通过 spec 文件得到如何处理编译过程的指示,spec 文件是由一系列的
指令和脚本段组成的,这个文件对于 RPM 包的生成必需且重要。它定义了源代码包的文件
名、补丁包的文件名、打入补丁包的顺序、不同硬件架构环境和 cpu 型号的操作、安装过程
中需要执行的脚本和软件包的信息等。



在 RedHat 中这个目录结构如下:

[root@localhost ~]# tree /usr/src/redhat/
/usr/src/redhat/                                                                                                                                             
|-- BUILD                                此目录便是RPM进行所有build动作的工作目录                                                                                                                   
|-- RPMS                                 此目录存放编译后产生的所有RPM文件                                                                                                                    
|   |-- noarch                                                                                                                                               
|   `-- x86_64                                                                                                                                               
|-- SOURCES                              此目录存放源代码 tar .gz 文件、 与相关的 patch 文件, RPM 默认寻找本目录                                                                                                                   
|-- SPECS                 存放spec文件
`-- SRPMS                 此目录存放编译后产生的所有SRPMS文件




rpmbuild创建keepalived
1:
    mkdir   rpmbuild
    mkdir   rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
    mkdir   rpmbuild/RPMS/{athlon,i386,i486,i586,i686,noarch}

2:
vi /root/.rpmmacros
[root@localhost x86_64]# cat ~/.rpmmacros
%_topdir  /usr/local/rpmbuild

3:
cd ~
wget wget http://keepalived.org/software/keepalived-1.1.19.tar.gz
tar -xf keepalived-1.1.19.tar.gz
cd keepalived-1.1.19
vim keepalived.spec

4:
[root@localhost keepalived-1.1.19]# cat keepalived.spec
Summary: keepalived
Name: keepalived
Version: 1.1.19
Release: 1
Source0: %{name}-%{version}.tar.gz
License: MIT
Group: Applications/Internet
Buildroot: %{_tmppath}/%{name}-%{version}-root
Requires: bash
%description
keepalived
%prep
%setup -q
%build
./configure --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.18-194.el5-x86_64
make
%install
make DESTDIR=$RPM_BUILD_ROOT install
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root)
/etc/keepalived/keepalived.conf
/etc/keepalived/samples/client.pem
/etc/keepalived/samples/dh1024.pem
/etc/keepalived/samples/keepalived.conf.HTTP_GET.port
/etc/keepalived/samples/keepalived.conf.SMTP_CHECK
/etc/keepalived/samples/keepalived.conf.SSL_GET
/etc/keepalived/samples/keepalived.conf.fwmark
/etc/keepalived/samples/keepalived.conf.inhibit
/etc/keepalived/samples/keepalived.conf.misc_check
/etc/keepalived/samples/keepalived.conf.misc_check_arg
/etc/keepalived/samples/keepalived.conf.quorum
/etc/keepalived/samples/keepalived.conf.sample
/etc/keepalived/samples/keepalived.conf.status_code
/etc/keepalived/samples/keepalived.conf.track_interface
/etc/keepalived/samples/keepalived.conf.virtual_server_group
/etc/keepalived/samples/keepalived.conf.virtualhost
/etc/keepalived/samples/keepalived.conf.vrrp
/etc/keepalived/samples/keepalived.conf.vrrp.localcheck
/etc/keepalived/samples/keepalived.conf.vrrp.lvs_syncd
/etc/keepalived/samples/keepalived.conf.vrrp.routes
/etc/keepalived/samples/keepalived.conf.vrrp.scripts
/etc/keepalived/samples/keepalived.conf.vrrp.static_ipaddress
/etc/keepalived/samples/keepalived.conf.vrrp.sync
/etc/keepalived/samples/root.pem
/etc/keepalived/samples/sample.misccheck.smbcheck.sh
/etc/rc.d/init.d/keepalived
/etc/sysconfig/keepalived
/usr/local/bin/genhash
/usr/local/sbin/keepalived
/usr/local/share/man/man1/genhash.1
/usr/local/share/man/man5/keepalived.conf.5
/usr/local/share/man/man8/keepalived.8


5:
tar -czf keepalived-1.1.19.tar.gz keepalived-1.1.19
rpmbuild -tb keepalived-1.1.19.tar.gz
`-- x86_64                                                                                                                                                   
    |-- keepalived-1.1.19-1.x86_64.rpm                                                                                                                       
    |-- keepalived-debuginfo-1.1.19-1.x86_64.rpm
-------------------------------------------------------------------------------------------------------------

rpm宏的相关解释

#最前面的一段主要定义一些关键字和变量
#name用来定义软件包的名称,后面可以使用%{name}的方式引用
Name:           nginx
#version用来定义软件的实际版本号,后面可以使用%{version}使用
Version:        1.0.5
#release用来定义发布序列号,后面可以使用%{release}使用
Release:        1
#summary软件包的内容摘要
Summary:        Test
#group定义软件分组
Group:          System Enviroment/Daemons
#license定义软件授权方式
License:        BSD
#buildroot定义了安装或者编译时的虚拟目录,通常为如下定下,后面可以使用%{buildroot}引用
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
#source制定源代码包,后面可以用%{source1}引用
Source0:        nginx-1.0.5.tar.gz
#下面定义了nginx的安装目录,后面使用%{nginx_datadir}引用
%define nginx_datadir /usr/local/nginx
#%description用来定义描述软件的详细说明
%description
This is a test for nginx.spec
#另外还有其他诸如:
#URL:软件的主页
#Vendor:发行商或打包组织的信息
#Disstribution:发行版标识
#Patch:补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
#Prefix: %{_prefix} 指/usr
#Prefix: %{_sysconfdir} 指/etc
#Requires:该rpm包所依赖的软件包名称,例如libpng-devel >= 1.0.20 zlib
#Provides:指明本软件一些特定的功能,以便其他rpm识别
#Packager:打包者的信息
#####
#####
#%prep段后定义脚本预处理的一些操作,如解包打补丁等
%prep
#%setup -q 将tar.gz包解压出来
%setup -q
#%patch打补丁例如:
#%patch0 -p0 %patch0中0指定前面关键字段定义的补丁包
#%patch1 -p0
#%build段开始构建包
%build
#一下为编译nginx时使用的参数
export DESTDIR=%{buildroot}
./configure --user=nobody --group=nobody --prefix=%{nginx_datadir} --conf-path=%{nginx_datadir}/conf/nginx.conf --error-log-path=%{n
ginx_datadir}/logs/error.log --http-log-path=%{nginx_datadir}/logs/access.log
make
#%install段开始把软件安装到虚拟的根目录中
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot} INSTALLDIRS=vendor
#%clean清理临时文件
%clean
rm -rf %{buildroot}
##其他的操作还有:
#%pre rpm安装前执行的脚本
#%post rpm安装后执行的脚本
#%preun rpm卸载前执行的脚本
#%postun rpm卸载后执行的脚本
#%preun %postun 的区别是前者在升级的时候会执行,后者在升级rpm包的时候不会执行
#%file段定义哪些文件和目录会放入rpm中
%files
#%defattr指定包装文件的属性
%defattr(-,root,root,-)
%{nginx_datadir}
#%exclude 列出不想打包到rpm中的文件
#%changelog 变更日志

    以上是整个spec文件的内容,以及一些解释。

    编写完之后,使用rpmbuild命令生成rpm包

    rpmbuild -ba nginx.spec

    命令完成后rpm包会在/usr/src/redhat/RPMS/下生成。

    PS:

    rpm软件包系统的标准分组:/usr/share/doc/rpm-4.3.3/GROUPS
    各种宏定义: /usr/lib/rpm/macros
    已经安装的rpm包数据库: /var/lib/rpm
    避免生成debuginfo包:echo '%debug_package %{nil}' >> ~/.rpmmacros  

更多的延伸性阅读可以参看 http://www.rpm.org 网站的文档部分