一、RPM包的分类

RPM有五种基本的操作功能:安装、卸载、升级、查询和验证。

linux软件包分为两大类:

(1)二进制类包,包括rpm安装包(一般分为i386和x86等几种)

(2)源码类包,源码包和开发包应该归位此类(.src.rpm)。

有时候为了方便源码包的安装,和我们自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包,当有了源码包就可以直接编译得到二进制安装包和其他任意包。spec file是制作rpm包最核心的部分,rpm包的制作就是根据spec file来实现的。在制作自定义rpm包的时候最好不使用普通用户实现。

二、修改宏及自定义车间位置

在redhat下,rpm包的默认制作路径在/usr/src/redhat下,这其中包含了6个目录(要求全部大写)

Directory     Usage
BUILD 	      源代码解压以后放的位置,只需提供BUILD目录,具体里面放什么,不用我们管,所以真正的制作车间是BUILD目录
RPMS          制作完成后的rpm包存放目录,为特定平台指定子目录(i386,i686,ppc)
SOURCES       收集的源文件,源材料,补丁文件等存放位置    
SPECS         存放spec文件,作为制作rpm包的领岗文件,以 rpm名.spec
SRPMS         src格式的rpm包位置 ,既然是src格式的包,就没有平台的概念了           
BuiltRoot     假根,使用install临时安装到这个目录,把这个目录当作根来用的,所以在这个目录下的目录文件,才是真正的目录文件。当打包完成后,在清理阶段,这个目录将被删除

centos下没有该目录,我们必须自定义工作车间,(即使在redhat下有该目录,一般也是自定义到普通用户的家目录下)

rpmbuild --showrc 显示所有的宏,以下划线开头,

一个下划线:定义环境的使用情况,

二个下划线:通常定义的是命令,

为什么定义宏?不同的系统,命令的存放位置可能不同,所以通过宏的定义找到命令的真正存放位置

查看默认工作车间

[root@localhost /]# rpmbuild --showrc | grep _topdir
-14: _builddir	%{_topdir}/BUILD
-14: _buildrootdir	%{_topdir}/BUILDROOT
-14: _desktopdir	%{_datadir}/applications
-14: _rpmdir	%{_topdir}/RPMS
-14: _sourcedir	%{_topdir}/SOURCES
-14: _specdir	%{_topdir}/SPECS
-14: _srcrpmdir	%{_topdir}/SRPMS
-14: _topdir	%{getenv:HOME}/rpmbuild

三、rpm包制作原理图

wKiom1RtybbxDoijAARlofRyCW4338.jpg

四、制作rpm包

1、安装rpm-build

# yum -y install rpm-build

2、增加普通用户并修改工作车间目录

# useradd rpmbuild
# su - rpmbuild
$ vim ~/.rpmmacros
  %_topdir        /home/rpmbuild/rpmbuild
  # mkdir -pv ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} 
  # rpmbuild --showrc | grep _topdir
  -14: _topdir    /home/rpmbuild/rpmbuild

3、收集源码文件

(1)文件列表

[rpmbuild@RS1 SOURCES]$ pwd
/home/rpmbuild/rpmbuild/SOURCES

(2)源码包

[rpmbuild@RS1 SOURCES]$ cp /wh_k/httpd-2.4.34.tar.gz .
[rpmbuild@RS1 SOURCES]$ ll
总用量 8888
-rw-r--r--. 1 rpmbuild rpmbuild 9098780 8月  29 15:16 httpd-2.4.34.tar.gz

(3)httpd脚本文件


4、在 SPECS 目录下创建 httpd.spec

$ cd rpmbuild/SPECS/
查看系统组:
[root@RS1 rpm-4.11.3]# less /usr/share/doc/rpm-4.11.3/GROUPS
$ vim httpd.spec
Name:httpd
Version:2.4.34
Release:        1%{?dist}
Summary:wang123

Group:  Applications/System
License:        GPLV2
URL:            350161345@qq.com
Source0:        /home/rpmbuild/rpmbuild/SOURCES/httpd-2.4.34.tar.gz

BuildRequires:  gcc
Requires:       gcc

%description
build by wang123

%prep
%setup -q


%build
%configure
make %{?_smp_mflags}


%install
make install DESTDIR=%{buildroot}


%files
%defattr(-,root,root)
/*
%doc

5、制作rpm包

[rpmbuild@RS1 SPECS]$ rpmbuild -bp httpd.spec 制作到%prep段
[rpmbuild@RS1 SPECS]$ rpmbuild -bc httpd.spec 制作到%build段
[rpmbuild@RS1 SPECS]$ rpmbuild -bi httpd.spec 执行 spec 文件的 "%install" 阶段 (在执行了 %prep 和 %build 阶段之后)。这通常等价于执行了一次 "make install"rpmbuild -bb nginx.spec 制作二进制包
[rpmbuild@RS1 SPECS]$ rpmbuild -ba httpd.spec 表示既制作二进制包又制作src格式包

五、rpm包的签名

1、查询软件包信息

[rpmbuild@RS1 x86_64]$ pwd
/home/rpmbuild/rpmbuild/RPMS/x86_64
[rpmbuild@RS1 x86_64]$ ll
总用量 10052
-rw-rw-r--. 1 rpmbuild rpmbuild 7428624 8月  29 16:12 httpd-2.4.18-1.el7.x86_64.rpm
-rw-rw-r--. 1 rpmbuild rpmbuild 2859268 8月  29 16:12 httpd-debuginfo-2.4.18-1.el7.x86_64.rpm

到这里,一个完整的 rpm 包就制作完成了!