栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

定制RPM包(FPM和原生rpmbuild)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

定制RPM包(FPM和原生rpmbuild)

例子:
Redis打包(FPM工具)
Nginx打包RPM(FPM工具)
Nginx(SPEC文件打包)
Redis(SPEC文件打包)

一、FPM工具进行打包 1. 更新yum软件源
yum update
2. 安装fpm模块依赖
yum -y install ruby rubygems ruby-devel

3. 更换rubygems仓库
  1. 查看当前源
gem source list


2. 更换阿里源

gem sources -a  http://mirrors.aliyun.com/rubygems/


3. 移除原生源

gem sources --remove https://rubygems.org/

4. 安装fpm工具
gem install fpm

可能会出现的问题:


原因:ruby在centos7中yum最高支持到2.0.0,而fpm安装需要ruby支持到2.3.0
解决办法:

  1. 安装RAM密钥(二选一,失败重复尝试)

命令一:

gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

命令二:

command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -

command curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -

  1. 安装RAM(经常会失败,重复尝试直到成功)
curl -L get.rvm.io | bash -s stable

  1. 更新配置文件
source /etc/profile.d/rvm.sh
  1. 查看可安装脚本
rvm list known | grep ruby

  1. 安装ruby 2.6
rvm install 2.6

  1. 查看当前ruby版本
ruby -v

5. 检查是否正确安装
fpm --help
6. fpm参数

常用参数

1.-s 指定源类型
2.-t 指定目标类型,即想要制作为什么包
3.-n 指定包的名字
4.-v 指定包的版本号
5.-C 指定打包的相对路径 Change directory to here before searchingforfiles
6.-d 指定依赖于哪些包
7.-f 第二次打包时目录下如果有同名安装包存在,则覆盖它
8.-p 输出的安装包的目录,不想放在当前目录下就需要指定
9.–post-install 软件包安装完成之后所要运行的脚本;同–after-install
10.–pre-install 软件包安装完成之前所要运行的脚本;同–before-install
11.–post-uninstall 软件包卸载完成之后所要运行的脚本;同–after-remove
12.–pre-uninstall 软件包卸载完成之前所要运行的脚本;同–before-remove

7. 安装软件

将源代码软件进行编译安装。具体看软件。建议将一个编译后的软件存放到指定地方。

8. 编写shell脚本

以Nginx为例子:

#!/bin/bash

# 源码编译一般都要添加执行用户
useradd nginx -M -s /sbin/nologin

9.打包

打包格式:
fpm -s 源文件类型 -t 目标文件类型 -n 打包后名称 -v 打包后版本号 -d 所需要依赖 --post-install 安装完后执行的脚本 -f 源文件地址
以Nginx为例子:

fpm -s dir -t rpm -n nginx -v 1.20.1 -d 'pcre-devel,openssl-devel' --post-install /root/rpm_building/ngnix_rpm.sh -f /opt/nginx/

参数说明:

1.-s 指定源类型
2.-t 指定目标类型,即想要制作为什么包
3.-n 指定包的名字
4.-v 指定包的版本号
5.-d 指定依赖于哪些包
6.-f 第二次打包时目录下如果有同名安装包存在,则覆盖它
7.–post-install 软件包安装完成之后所要运行的脚本;同–after-install

可能会出现的错误:

  • Need executable ‘rpmbuild’ to convert dir to rpm {:level=>:error}

解决办法:安装rpm-build

yum install rpm-build -y
10.安装rpm包 方法一:rpm命令安装(离线麻烦)

使用rpm命令安装

rpm -ivh nginx-1.20.1-1.x86_64.rpm

这种方法直接安装会出现依赖错误,需要先 yum 或手动安装依赖才能安装 rpm 包。

方法二:yum命令安装(在线简单)
yum -y localinstall nginx-1.20.1-1.x86_64.rpm

这种方法会先安装依赖,再安装rpm包

11.注意点
  1. 测试centos7环境下编译的软件,在centos8下能运行;centos8下编译软件无法在centos7上运行。
二、原生rpmbuild打包rpm包 1.打包流程
  1. 源代码放到%_sourcedir中
  2. 源代码解压到%_builddir中,并进行编译
  3. 将编译好的软件安装到%_buildrootdir中
  4. 编写SPEC文件,并存放到其他目录
  5. 执行打包程序,将打包好的二进制rpm包存放在%_rpmdir中,源码rpm包文件存放在%_srcrpmdir中。
默认位置宏代码名称用途
~/rpmbuild%_topdir工作空间目录保存rpmbuild时的相关文件
~/rpmbuild/SPECS%_specdirSpec 文件目录保存 RPM 包配置(.spec)文件
~/rpmbuild/SOURCES%_sourcedir源代码目录保存源码包(如 .tar 包)和所有 patch 补丁
~/rpmbuild/BUILD%_builddir构建目录源码包被解压至此,并在该目录的子目录完成编译
~/rpmbuild/BUILDROOT%_buildrootdir最终安装目录保存 %install 阶段安装的文件
~/rpmbuild/RPMS%_rpmdir标准 RPM 包目录生成/保存二进制 RPM 包
~/rpmbuild/SRPMS%_srcrpmdir源代码 RPM 包目录生成/保存源码 RPM 包(SRPM)

源码rpm包和二进制rpm包区别:

  • 源码rpm包运行后是出现源码文件,要运行程序还要进行make进行编译。打包原理:压缩源码文件目录,跟压缩包一样。
  • 二进制rpm包解压后直接就可以运行文件。打包原理:先进行源码包的编译和安装,然后将安装好的文件进行打包。
2.SPEC文件

SPEC文件说明:

阶段读取的目录写入的目录具体动作
%prep%_sourcedir%_builddir读取位于%_sourcedir目录的源代码和 patch。之后,解压源代码至%_builddir的子目录并应用所有 patch。
%build%_builddir%_builddir编译位于%_builddir构建目录下的文件。通过执行类似./configure && make的命令实现。
%install%_builddir%_buildrootdir读取位于%_builddir构建目录下的文件并将其安装至%_buildrootdir目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似make install的命令实现。
%check%_builddir%_builddir检查软件是否正常运行。通过执行类似make test的命令实现。很多软件包都不需要此步。
bin%_buildrootdir%_rpmdir读取位于%_buildrootdir最终安装目录下的文件,以便最终在%_rpmdir目录下创建 RPM 包。在该目录下,不同架构的 RPM 包会分别保存至不同子目录,noarch目录保存适用于所有架构的 RPM 包。这些 RPM 文件就是用户最终安装的 RPM 包。
src%_sourcedir%_srcrpmdirb创建源码 RPM 包(简称 SRPM,以.src.rpm作为后缀名),并保存至%_srcrpmdir目录。SRPM 包通常用于审核和升级软件包。
3.宏定义文件

宏定义:
宏的格式–> %_topdir
宏表示一个变量,如环境变量。这个变量指向一个路径或者其他含义。

查找rpmbuild定义文件

rpmbuild --showrc | grep Macro


从这张图中看出很多地方都可以定义宏。

查询宏命令路径

rpmbuild --showrc | grep _mandir

常用宏文件的定义

%{_sysconfdir} /etc
%{_prefix} /usr
%{_exec_prefix} %{_prefix}
%{_bindir} %{_exec_prefix}/bin
%{_libdir} %{_exec_prefix}/%{_lib}
%{_libexecdir} %{_exec_prefix}/libexec
%{_sbindir} %{_exec_prefix}/sbin
%{_sharedstatedir} /var/lib
%{_datarootdir} %{_prefix}/share
%{_datadir} %{_datarootdir}
%{_includedir} %{_prefix}/include
%{_infodir} /usr/share/info
%{_mandir} /usr/share/man
%{_localstatedir} /var
%{_initddir} %{_sysconfdir}/rc.d/init.d
%{_var} /var
%{_tmppath} %{_var}/tmp
%{_usr} /usr
%{_usrsrc} %{_usr}/src
%{_lib} lib (lib64 on 64bit multilib systems)
%{_docdir} %{_datadir}/doc
%{buildroot} %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
$RPM_BUILD_ROOT %{buildroot}

4.安装rpmbuild工具
yum install rpm-build -y
5.建立工作路径

在家目录下分别创建rpmbuild/BUILD、rpmbuild/RPMS、rpmbuild/SOURCES、rpmbuild/SPECS、rpmbuild/SRPMS目录。

mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}


文件夹含义:

默认位置宏代码名称用途
~/rpmbuild%_topdir工作空间目录保存rpmbuild时的相关文件
~/rpmbuild/SPECS%_specdirSpec 文件目录保存 RPM 包配置(.spec)文件
~/rpmbuild/SOURCES%_sourcedir源代码目录保存源码包(如 .tar 包)和所有 patch 补丁
~/rpmbuild/BUILD%_builddir构建目录源码包被解压至此,并在该目录的子目录完成编译
~/rpmbuild/BUILDROOT%_buildrootdir最终安装目录保存 %install 阶段安装的文件
~/rpmbuild/RPMS%_rpmdir标准 RPM 包目录生成/保存二进制 RPM 包
~/rpmbuild/SRPMS%_srcrpmdir源代码 RPM 包目录生成/保存源码 RPM 包(SRPM)
6.下载源码
cd ~/rpmbuild/SOURCES
wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz

7.编写SPEC文件
cd ~/rpmbuild/SPECS
vim hello.spec

spec文件进去后会自动加载模板,模板初始样子如下:

编写好的文件如下:

# 软件名
Name:           hello
# 版本号
Version:        2.10
# 发布编号
Release:        1%{?dist}
# 软件说明
Summary:        The "Hello World" program from GNU
Summary(zh_CN): GUN "Hello Word" 程序
# 包所属类别,但目前基本已经被弃用,直接删除即可
Group:          Applications/Productivity
# 软件包的版权协议
License:        GPLv3+

URL:            http://ftp.gnu.org/gnu/hello
Source0:        http://ftp.gnu.org/gnu/hello/%{name}-%{version}.tar.gz

# 编译需要的依赖
BuildRequires: gettext
# 本软件需要的依赖
#Requires:      
# 安装后的依赖
Requires(post): info
# 卸载前的依赖
Requires(preun): info

# 描述
%description
The "Hello World" program, done with all bells and whistles of a proper FOSS
project, including configuration, build, internationalization, help files, etc.

%description -l zh_CN
"Hello World" 程序, 包含 FOSS 项目所需的所有部分, 包括配置, 构建, 国际化, 帮助文件等.

%prep
%setup -q

# 编译阶段执行的命令
%build
%configure
make %{?_smp_mflags}

# 安装阶段执行的命令
%install
make install DESTDIR=%{buildroot}
# 查找 install 中的语言文件
%find_lang %{name}
rm -f %{buildroot}/%{_infodir}/dir

# 安装后执行的命令
%post
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :

# 卸载前执行的命令
%preun
if [ $1 = 0 ] ; then
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
fi

# 将所需要打包的文件都存放到这边中;-f %{name}.lang 加上后的意思为声明找到的文件
%files -f %{name}.lang
# doc添加的是说明文档
%doc AUTHORS ChangeLog NEWS README THANKS TODO
%license COPYING
%{_mandir}/man1/hello.1.*
%{_infodir}/hello.info.*
%{_bindir}/hello

# 软件更新说明
%changelog
* Sun Dec 4 2016 Your Name  - 2.10-1
- Update to 2.10
* Sat Dec 3 2016 Your Name  - 2.9-1
- Update to 2.9
8.检查SPEC文件正确性
rpmlint hello.spec
9.构建rpm包
cd ~/rpmbuild/SPECS
rpmbuild -ba hello.spec


查看下输出的内容:

tree ~/rpmbuild/*RPMS

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/835550.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号