当我们需要自己制作yum仓库的时候,第一步应该是准备rpm包。一般rpm包的来源有两种办法:1、通过别人的镜像拉取rpm包 ;2、自己通过源码包来制作rpm包;下面来讲怎么通过源码包自定义RPM包。

目录

  • 一、自定义RPM包的制作流程
  • 二、自定义RPM包的具体操作
    • 1、需要编译的中间件的rpm包制作方法
    • 2、不需要编译的中间件的rpm包制作方法
  • 三、RPM包的spec文件解析
    • 1、rpmbuild命令的用法
    • 2、spec文件编写规则
  • 四、小结

一、自定义RPM包的制作流程

  • 在linux服务器上可以直接自定义RPM包
  • 自定义RPM包的流程如下

二、自定义RPM包的具体操作

自定义RPM包的时候,未编译的中间件源码包制作方法与不需要编译的中间件包制作的方法不一样。

1、需要编译的中间件的rpm包制作方法

1、安装centos开发环境集成包及中间件的依赖包

yum groupinstall "Development Tools"
yum install pcre-devel
yum install openssl openssl-devel

2、创建app目录

mkdir /app

3、自定义工作目录

vi app/.rpmmacros
%_topdir        /app/rpmbuild    ##目录可以自定义 mkdir /app/rpmbuild

4、创建rpmbuild所需要的目录mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
│   └── tengine-1.5.0.tar.gz
├── SPECS
│   └── tengine.spec
├── SRPMS
└── tmp

​目录解析

 **目录解析**BUILD   源代码解压后的存放目录​    RPMS   制作完成后的RPM包存放目录,里面有与平台相关的子目录​  SOURCES 收集的源材料,补丁的存放位置​  SPECS  SPEC文件存放目录​  SRMPS  存放SRMPS生成的目录

5、将源码包放在SOURCES目录下

cp /源码包路径  /app/rpmbuild/SOURCE

6、配置SPECS下的配置文件

vi tengine.spec ### 0.define section               #自定义宏段,这个不是必须的
### %define nginx_user nginx       #这是我们自定义了一个宏,名字为nginx_user值为nginx,%{nginx_user}引用 ### 1.The introduction section      #介绍区域段 Name:           tengine            #名字为tar包的名字
Version:        1.4.2              #版本号,一定要与tar包的一致哦
Release:        1%{?dist}          #释出号,也就是第几次制作rpm
Summary:        tengine from TaoBao  #软件包简介,最好不要超过50字符 Group:          System Environment/Daemons  #组名,可以通过less /usr/share/doc/rpm-4.8.0/GROUPS 选择合适组
License:        GPLv2                       #许可,GPL还是BSD等
URL:            http://laoguang.blog.51cto.com   #可以写一个网址
Packager:       Laoguang <ibuler@qq.com>
Vendor:         TaoBao.com
Source0:        %{name}-%{version}.tar.gz
#定义用到的source,也就是你收集的,可以用宏来表示,也可以直接写名字,上面定义的内容都可以像上面那样引用
#patch0:            a.patch                 #如果需要补丁,依次写
BuildRoot:      %_topdir/BUILDROOT
#这个是软件make install 的测试安装目录,也就是测试中的根,我们不用默认的,我们自定义,
#我们可以来观察生成了哪此文件,方便写file区域
BuildRequires:  gcc,make                           #制作过程中用到的软件包
Requires:       pcre,pcre-devel,openssl,chkconfig  #软件运行需要的软件包,也可以指定最低版本如 bash >= 1.1.1
%description                                       #软件包描述,尽情的写吧
It is a Nginx from Taobao.                         #描述内容 ###  2.The Prep section 准备阶段,主要目的解压source并cd进去 %prep                                              #这个宏开始
%setup -q                                          #这个宏的作用静默模式解压并cd
#%patch0 -p1                                       #如果需要在这打补丁,依次写 ###  3.The Build Section 编译制作阶段,主要目的就是编译
%build
./configure \                                      #./configure 也可以用%configure来替换 --prefix=/usr \                                  #下面的我想大家都很熟悉 --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx/nginx.pid  \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_flv_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/tmp/nginx/client/ \ --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ --http-scgi-temp-path=/var/tmp/nginx/scgi \ --with-pcre
make %{?_smp_mflags}          #make后面的意思是:如果就多处理器的话make时并行编译 ###  4.Install section  安装阶段
%install
rm -rf %{buildroot}                #先删除原来的安装的,如果你不是第一次安装的话
make install DESTDIR=%{buildroot}
#DESTDIR指定安装的目录,而不是真实的安装目录,%{buildroot}你应该知道是指的什么了 ###  4.1 scripts section #没必要可以不写
%pre        #rpm安装前制行的脚本
if [ $1 == 1 ];then    #$1==1 代表的是第一次安装,2代表是升级,0代表是卸载 /usr/sbin/useradd -r nginx 2> /dev/null  ##其实这个脚本写的不完整
fi
%post       #安装后执行的脚本 %preun      #卸载前执行的脚本
if [ $1 == 0 ];then /usr/sbin/userdel -r nginx 2> /dev/null
fi
%postun     #卸载后执行的脚本 ###  5.clean section 清理段,删除buildroot %clean
rm -rf %{buildroot} ###  6.file section 要包含的文件
%files
%defattr (-,root,root,0755)   #设定默认权限,如果下面没有指定权限,则继承默认
/etc/           #下面的内容要根据你在%{rootbuild}下生成的来写
/usr/
/var/ ###  7.chagelog section  改变日志段
%changelog

7、执行编译

rpmbuild -ba tengine.spec

8、编译成功后,编译好的包在RPM目录下

2、不需要编译的中间件的rpm包制作方法

1、安装centos开发环境集成包及中间件的依赖包

yum groupinstall "Development Tools"
yum install pcre-devel
yum install openssl openssl-devel

2、创建app目录

mkdir /app

3、自定义工作目录

vi app/.rpmmacros
%_topdir        /app/rpmbuild    ##目录可以自定义 mkdir /app/rpmbuild

4、创建rpmbuild所需要的目录mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

5、创建mkdir -p /root/app/rpmbuild/BUILDROOT/jdk-8u131-1.el7.x86_64/app/soft/jdk-8u131/

rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── BUILDROOT
│   └── jdk-8u131-1.el7.x86_64
│        └── app
│            └── soft
│                └── jdk-8u131/
├── SPECS
│   └── jdk-8u131.spec
├── SRPMS
└── tmp

6、解压中间件的jdk-8u131.tar.gz包到
/root/app/rpmbuild/BUILDROOT/jdk-8u131-1.el7.x86_64/app/soft/jdk-8u131/目录下

7、配置SPECS下的配置文件

BuildArch:     x86_64
Name:          jdk
Version:       8u131
Release:       1%{?dist}
License:       GPLv2+
Group:         System Environment/Daemons
Summary:       Load balancer and high availability service%description
Keepalived provides simple and robust facilities for load balancing
and high availability.  The load balancing framework relies on the
well-known and widely used Linux Virtual Server (IPVS) kernel module
providing layer-4 (transport layer) load balancing.  Keepalived
implements a set of checkers to dynamically and adaptively maintain
and manage a load balanced server pool according their health.
Keepalived also implements the Virtual Router Redundancy Protocol
(VRRPv2) to achieve high availability with director failover.
%files
%attr(0755, root, root) "/app/soft/jdk-8u131/*"   #此处文件目录为安装中间件的目录

7、执行编译

rpmbuild -ba tengine.spec

8、编译成功后,编译好的包在RPM目录下


三、RPM包的spec文件解析

在自定义RPM包的时候最难的地方就是spec文件的编写了,只能自己不断地修改,不断的编译。这个地方有点烦!!!,在编写spec文件的时候还是来参考一下下面的参数!

1、rpmbuild命令的用法

① 从spec文档建立有以下选项

-bp  #只执行spec的%pre 段(解开源码包并打补丁,即只做准备)
-bc  #执行spec的%pre和%build 段(准备并编译)
-bi  #执行spec中%pre,%build与%install(准备,编译并安装)
-bl  #检查spec中的%file段(查看文件是否齐全)
-ba  #建立源码与二进制包(常用)
-bb  #只建立二进制包(常用)
-bs  #只建立源码包

②从tarball包建立,与spec类似

-tp #对应-bp
-tc #对应-bc
-ti #对应-bi
-ta #对应-ba
-tb #对应-bb
-ts #对应-bs

③ 从源码包建立

--rebuild  #建立二进制包,通-bb
--recompile  #同-bi

④rpmbuild的其他参数

--buildroot=DIRECTORY   #确定以root目录建立包
--clean  #完成打包后清除BUILD下的文件目录
--nobuild  #不进行%build的阶段
--nodeps  #不检查建立包时的关联文件
--nodirtokens
--rmsource  #完成打包后清除SOURCES
--rmspec #完成打包后清除SPEC
--short-cricuit
--target=CPU-VENDOR-OS #确定包的最终使用平台

2、spec文件编写规则

①spec的关键字

Name:用来定义软件包的名称,后面可以使用%{name}的方式引用,不能包含空格,且必须唯一
Summary: 软件包的内容概要,只能用一句话来概括
Version: 软件的实际版本号,具体命令需跟源包一致,后面可以使用%{version}使用,不允许出现连字符'-',会被认为非法字符
Release: 发布序列号,具体命令需跟源包一致,后面可以使用%{release}使用,一般是一个整数,也是rpm包版本信息的一部分
License: 软件授权方式,通常就是GPL
Source: 源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
buildroot在rpmbuild在制作rpm包的时候,会把编译生成的二进制文件和库文件先安装到一个临时目录,然后再结合spec文件从这个临时目录中提取文件 ,压缩生成rpm文件,这个临时目录就是buildroot所标示的目录
BuildRoot: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:%{_tmppath}/%{name}-%{version}-%{release}-root该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。后面可使用$RPM_BUILD_ROOT 方式引用。
URL: 软件的主页
Vendor: 发行商或打包组织的信息,例如RedFlag Co,Ltd
Disstribution: 发行版标识
Group: 软件分组,建议使用标准分组-----------------------------------------软件包所属类别,具体类别有:Amusements/Games (娱乐/游戏)Amusements/Graphics(娱乐/图形)Applications/Archiving (应用/文档)Applications/Communications(应用/通讯)Applications/Databases (应用/数据库)Applications/Editors (应用/编辑器)Applications/Emulators (应用/仿真器)Applications/Engineering (应用/工程)Applications/File (应用/文件)Applications/Internet (应用/因特网)Applications/Multimedia(应用/多媒体)Applications/Productivity (应用/产品)Applications/Publishing(应用/印刷)Applications/System(应用/系统)Applications/Text (应用/文本)Development/Debuggers (开发/调试器)Development/Languages (开发/语言)Development/Libraries (开发/函数库)Development/System (开发/系统)Development/Tools (开发/工具)Documentation (文档)System Environment/Base(系统环境/基础)System Environment/Daemons (系统环境/守护)System Environment/Kernel (系统环境/内核)System Environment/Libraries (系统环境/函数库)System Environment/Shells (系统环境/接口)User Interface/Desktops(用户界面/桌面)User Interface/X (用户界面/X窗口)User Interface/X Hardware Support (用户界面/X硬件支持)----------------------------------------------------
Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
prefix主要用于定义可重新定义安装位置的包,也就是在安装时可以通过--prefix来定义包的安装路径
Prefix: %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
Prefix: %{_sysconfdir} 这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识
Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,“>=”号两边需用空格隔开,而不同软件名称也用空格分开
Conflicts: 该包与哪些软件包冲突
Provides: 该包提供了什么,通常是包名或者虚拟包名
Packager: 打包者的信息,可以是名字或者邮件地址
%dscription 软件的详细说明,描述信息可以有多行,如果提供的描述信息是以空格开始的,则该信息单独显示在一行,如果信息前没有空格,则认为描述信息是一个段落

②spec的主体,主体中也包括了很多关键字和描述

%prep 预处理脚本,%setup -n %{name}-%{version} 把源码包解压并放好注:可根据你的源码的名字格式,来确认解压后名字的格式,否则可能导致install的时候找不到对应的目录◎补充一下
%setup 不加任何选项,仅将软件包打开。
%setup -n newdir 将软件包解压在newdir目录。
%setup -c 解压缩之前先产生目录。
%setup -b num 将第num个source文件解压缩。
%setup -T 不使用default的解压缩操作。
%setup -T -b 0 将第0个源代码文件解压缩。
%setup -q 指不显示输出(quietly)
%setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。
%patch 最简单的补丁方式,自动指定patch level。
%patch 0 使用第0个补丁文件,相当于%patch ?p 0。
%patch -s 不显示打补丁时的信息。
%patch -T 将所有打补丁时产生的输出文件删除。%build 开始构建包
在/usr/src/redhat/BUILD/%{name}-%{version}目录中进行make的工作 ,常见写法:
make %{?_smp_mflags} OPTIMIZE="%{optflags}"
都是一些优化参数,定义在/usr/lib/rpm/marcros中
%install 开始把软件安装到虚拟的根目录中
在/usr/src/redhat/BUILD/%{name}-%{version}目录中进行make install的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候就会失败。 常见内容有:
%makeinstall 这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写法:
make DESTDIR=$RPM_BUILD_ROOT install
或
make prefix=$RPM_BUILD_ROOT install%clean 清理临时文件
通常内容为:
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"※注意区分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
$RPM_BUILD_ROOT是指开头定义的BuildRoot,而$RPM_BUILD_DIR通常就是指/usr/src/redhat/BUILD,其中,前面的才是%file需要的。%pre rpm安装前执行的脚本
%post rpm安装后执行的脚本
%preun rpm卸载前执行的脚本
%postun rpm卸载后执行的脚本
%preun %postun 的区别是什么呢?
前者在升级的时候会执行,后者在升级rpm包的时候不会执行
%files 定义那些文件或目录会放入rpm中
这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径。如果描述为目录,表示目录中除%exclude外的所有文件。%deffattr (-,root,root) 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755
%exclude 列出不想打包到rpm中的文件
※小心,如果%exclude指定的文件不存在,也会出错的。
%changelog 变更日志

③ spec文档中常用的几个宏(变量)

1. RPM_BUILD_DIR:    /usr/src/redhat/BUILD
2. RPM_BUILD_ROOT:   /usr/src/redhat/BUILDROOT
3. %{_sysconfdir}:   /etc
4. %{_sbindir}:     /usr/sbin
5. %{_bindir}:       /usr/bin
6. %{_datadir}:      /usr/share
7. %{_mandir}:       /usr/share/man
8. %{_libdir}:       /usr/lib64
9. %{_prefix}:       /usr
10. %{_localstatedir}:   /usr/var

四、小结

  • 自定义RPM包,难点有两个地方:1、需要解决依赖问题,依赖包括编译时依赖与运行时依赖;2、spec文件要根据需求编写 ;如果通过spec文件编译实在有难度,我们可以先自己手动编译测试,使用本文的第二种办法进行自定义rpm包。
  • 在编写spec文件的时候我们可以参考已有的rpm包的spec文件,提取已有的rpm包的spec文件命令为rpmrebuild -e -p --notest-install zookeeper-3.4.2-1-omv2013.0.x86_64.rpm
  • rpm包安装是可以重定向路径的命令为rpm -i --badreloc --relocate /usr/local/nginx=/home/java nginx-1.10.3-2.x86_64.rpm

下一篇接着讲yum仓库的搭建

【自制yum仓库一】自定义RPM包相关推荐

  1. Linux 自定义 RPM 包及制作 YUM 仓库

    目录 一.定制 rpm 包概述 1.1 什么是定制 rpm 包 1.2 为什么要定制 rpm 包 1.3 如何定制 rpm 包 二.安装 FPM 工具 2.1 我在安装过程出现如下错误:ERROR: ...

  2. 使用fpm简单制作自定义rpm包

    我的环境是centos7.2的 一.安装FPM工具 yum -y install ruby rubygems ruby-devel gem sources list   查看gem包管理源仓库地址 g ...

  3. linux yum localinstall 解决本地rpm包的依赖问题

    yum install 会去yum仓库查找相应的软件并安装,仓库中的软件都是解决了依赖关系的, yum localinstall 是用来安装本地rpm包的命令,首先rpm包要先下载到本地,然后在本地目 ...

  4. 软件的安装(包括yum仓库与源码包的安装)

    软件的安装 实验背景: 为了提高Linux服务器的易用性.扩展功能,安装软件包是管理员必备的技能,这其中又以RPM方式的安装操作最基础.最常用. 另外有时候需要解决依赖关系,要配置yum仓库.YUM ...

  5. linux 卸载yum源,CentOS下rpm包与yum安装与卸载更新系统源

    CentOS下rpm包与yum安装与卸载 一.rpm包的安装: 1.安装一个包 # rpm -ivh 2.升级一个包 # rpm -Uvh 3.移走一个包 # rpm -e 4.安装参数 --forc ...

  6. 制作本地SCLo-scl镜像仓库(reposync下载rpm包、createrepo制作镜像仓库、httpd发布服务)

    记录:327 场景:在CentOS 7.9操作系统上,使用reposync从开源镜像站下载sclo镜像仓库的rpm包:使用createrepo制作本地SCLo-scl镜像仓库:使用httpd发布服务. ...

  7. yum更换源和下载rpm包、Linux软件源码包方式安装

    2019独角兽企业重金招聘Python工程师标准>>> 更换yum仓库源 cp -r /etc/yum.repos.d/ /etc/yum.repos.d.bak # 备份系统自带仓 ...

  8. yum localinstall 解决本地rpm包的依赖问题

    这次本想记录一个yum的特殊用法,没想到找了一个yum这么全的说明. 先说说那个特殊用法吧 [saomd@saomd linux]$ rpm -ivh VirtualBox-3.1-3.1.0_554 ...

  9. 怎么把本地rpm包导入linux,Linux在本地yum源中增加rpm包(示例代码)

    在内网中搭建自己的yum源,可以方便在内网中使用,下面简单介绍搭建局域网yum源的方法和后期更新yum源rpm包的方法. 一.搭建局域网yum源 1.需要在局域网访问,首先需要一个web服务器,比如a ...

最新文章

  1. Swift Objective-C 访问级别控制
  2. hexo的yelee主题使用本地自己指定的自定义字体
  3. mfc怎么显示jpg png图像
  4. git ssh拉取代码_阿里云搭建git服务器
  5. nginx php7 fastcgi,[Mac php7 nginx]解决nginx FastCGI sent in stderr: “Primary script unknown”
  6. TypeError: 'range' object doesn't support item deletion
  7. VssPlus1.1-微软VSS增强工具
  8. 优秀的产品管理促进了IBM的成功转型--和谐生产方式百题03
  9. c语言程序怎样缩进整体,C语言程序设计基础概念
  10. OpenPose人体姿态估计详细配置(win10)
  11. 微信小程序开发常用功能
  12. 截止失真放大电路_BJT的失真
  13. systemctl的常用命令和使用说明
  14. 华为“天才少年”的200万年薪里,藏着人力资源管理的下一个10年
  15. App渠道推广统计:安卓渠道分析和渠道效果统计方法
  16. 苹果电脑硬盘损坏数据是否可以恢复
  17. FoxyProxy插件在浏览器的配置
  18. UBIC推服务机器人Kibiro,明年正式发售
  19. 文竹越长越乱?教你7种修剪方法可保持文竹株形优美,矮壮浓密
  20. 全国二级c语言上机题库答案,二级C语言上机题库100题加答案

热门文章

  1. Java——集成开发环境
  2. 装破解软件时如何暂时关掉Windows Defender防火墙,只需简单几步即可
  3. ZYNQ | AXI DMA数据环路测试
  4. 自媒体系统应该这么发朋友圈~
  5. linux 有名管道使用 mkfifo
  6. python中divmod函数的用法
  7. 讯飞星火认知大模型 VS CHATGPT3.5
  8. 东大22春大学英语(四)X《大学英语(四)》在线平时作业2百分非答案
  9. web2py基础教程(2)
  10. 用vlc插件在页面上播放海康rtsp推流监控