RPM打包

前言

本文只是一个RPM安装的例子,并没有对RPM做比较详尽的叙述。

RPM是啥?

RPM(Redhat Package Manager)是用于Redhat、CentOS、Fedora等Linux 分发版(distribution)的常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。

话不多说,让我们开始打RPM包!我们将以打Supervisor包为例。

安装rpmbuild

在开始之前,我们先做好准备工作:

RPM打包使用的是rpmbuild命令,这个命令来自rpm-build包。

$ yum install rpm-build

$ yum install rpmdevtools

打成的包要做什么?

接着,我们来看看如果手动安装Supervisor,我们可能要的步骤:

  • 将压缩包上传至: /tmp/
  • cd /tmp/
  • tar -C /opt/ -xzf supervisor-4.0.2.tar.gz
  • cd /opt/
  • mv supervisor-4.0.2 supervisor
  • cd supervisor
  • python setup.py install
  • echo_supervisord_conf > /etc/supervisord.conf
  • supervisord -c /etc/supervisord.conf

即解压 / 重命名文件夹 / 运行安装脚本 / 增加配置文件 / 启动进程

创建RPM文件

接下来,我们将上面的操作转为RPM操作,首先我们需要编写一个spec文件。我们可以通过spec文件来配置要生成的rpm包(有点类似Docker的Dockerfile)。

新建spec文档

我们不妨先找到rpmbuild所在目录,通过yum install安装,一般位置为

/用户名/rpmbuild
 

查看下面的目录

$ ll 
total 0
drwxr-xr-x 6 root root  88 May 13 14:30 BUILD
drwxr-xr-x 5 root root 129 May 13 14:30 BUILDROOT
drwxr-xr-x 3 root root  20 May 10 17:04 RPMS
drwxr-xr-x 3 root root 150 May 13 10:29 SOURCES
drwxr-xr-x 2 root root  88 May 13 14:30 SPECS
drwxr-xr-x 2 root root 163 May 13 14:30 SRPMS
 

$ ll 
total 0
drwxr-xr-x 6 root root  88 May 13 14:30 BUILD
drwxr-xr-x 5 root root 129 May 13 14:30 BUILDROOT
drwxr-xr-x 3 root root  20 May 10 17:04 RPMS
drwxr-xr-x 3 root root 150 May 13 10:29 SOURCES
drwxr-xr-x 2 root root  88 May 13 14:30 SPECS
drwxr-xr-x 2 root root 163 May 13 14:30 SRPMS

这些目录都是干嘛的呢?请看:

默认位置宏代码名称用途
~/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)

正如上文所说,我们不妨把编写的spec文件放在SPECS目录里面。

$ cd /root/rpmbuild/SPEC/

$ vim supervisor.spec

spec文档添加内容

基于哪个代码包?

首先我们要知道rpm包生成基于哪个文件生成,一般都是压缩包格式的源代码软件包,比如


supervisor-4.0.2.tar.gz

添加下面的内容

# 软件包的名称 
Name: supervisor
# 软件包的版本 
Version: 4.0.2
# 源代码软件包的名字 
Source0: %{name}-%{version}.tar.gz

上面的Source即指定了源代码软件包。我们同时需要将supervisor-4.0.2.tar.gz文件,放入
上面所说的SOURCES目录。

解压缩代码包

setup -q 命令会自动将上一步指定的压缩包解压,并将文件包内容放置到BUILD目录里;然后cd到解压后的目录中。

# 安装前的准备工作,一般用于解压源码包 
%prep
# 解压并cd到相关目录
%setup -q
进行安装

这一步,按照我的感觉,是要把python setup.py install内容加进来的,但是实验后发现,这句命令在%install区内无法执行,需要放置到下一步的区域中。

# 源码安装,如:make install 命令 
%install
mkdir -p %{buildroot}/opt/supervisor/
cp -rp %{_builddir}/%{name}-%{version}/*  %{buildroot}/opt/supervisor/

安装后置操作

所有文件安装成功后,就可以执行剩下的操作了。%post区域里就是存放这些操作的。

## 安装后执行的脚本
%post
cd /opt/supervisor/
python setup.py install
echo_supervisord_conf > /etc/supervisord.conf
supervisord -c /etc/supervisord.conf

这样一来,spec的主要内容部分就都写好了,剩下的就补充一些细枝末节了。

完善spec内容

将剩余的字段完善后,得到的最终文件如下所示:

# 软件包的名称 
Name: supervisor
# 软件包的版本 
Version: 4.0.2
# 软件包发布序列号,1表示第几次打包 
Release: 1%{?dist}
# 软件包的概要信息,不要超过50个 
Summary: The supervisor is a client/server system.
# 软件授权方式 
License: BSD-derived
# 软件分类
Group:System Environment/Daemons
# 源代码软件包的官方地址或源码包的下载地址 
URL: https://pypi.org/project/supervisor/
# 源代码软件包的名字 
Source0: %{name}-%{version}.tar.gz

# install使用的虚拟目录,安装后就在该目录下打包 
BuildRoot: %_topdir/BUILDROOT
#软件包详细描述信息 
%description
The supervisor is a client/server system that allows its users to control a number of processes on UNIX-like operating systems.

# 安装前的准备工作,一般用于解压源码包 
%prep
#解压并cd到相关目录
%setup -q

# 源码编译,如: ./configure && make命令 
%build

# 源码安装,如:make install 命令 
%install
mkdir -p %{buildroot}/opt/supervisor/
cp -rp %{_builddir}/%{name}-%{version}/*  %{buildroot}/opt/supervisor/

## 安装后执行的脚本
%post
cd /opt/supervisor/
python setup.py install
echo_supervisord_conf > /etc/supervisord.conf
supervisord -c /etc/supervisord.conf

# 清理临时文件 
%clean
# rm -rf %{buildroot}      

# 定义那些文件或目录放入RPM当中 %file是在虚拟根目录(BuildRoot)下进行,千万不要写绝对路径,应该使用宏或者变量表示相对路径 
%files
/

%doc
# RPM包软件的每次修改记录到这里 

%changelog
* Fri May 13 2019 MG
- Initial Supervisor 4.0.2 RPM release
 

生成RPM包并安装

我们可以使用上面所编写的spec文件来生成RPM包。

生成rpm

$ rpmbuild -ba supervisor.spec

运行完上述命令后,我们可以进入RPMS目录。发现多了一个rpm文件。

$ ll RPMS/x86_64/supervisor-4.0.2-1.el7.centos.x86_64.rpm 
-rw-r--r-- 1 root root 643728 May 13 14:16 RPMS/x86_64/supervisor-4.0.2-1.el7.centos.x86_64.rpm
 

安装RPM包

将生成的rpm文件复制到另外一台机器上,执行下面的命令,就可以发现rpm包可以正常安装了。

rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm

大功告成!

可能遇到的问题

问题1:rpm conflicts with file from package

安装的时候增加–replacefiles参数,例如

rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm --replacefiles

问题2:xxx is already installed

安装的时候增加--replacepkgs参数,例如

rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm --replacepkgs

问题3:如何查看当前系统发行版

$ cat /proc/version
Linux version 3.10.0-693.25.4.el7.x86_64 (mockbuild@x86-030.build.eng.bos.redhat.com) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Sat Apr 28 14:04:53 EDT 2018

新手教程 

1.安装 rpm-build 包

yum install rpm-build


可以先查看下rpmbuild版本,如果有就不需要再安装了


rpmbuild --version

2.安装 rpmdevtools

yum install rpmdevtools

3.创建工作空间

rpmdev-setuptreerpmdevtools中带的初始化环境脚本,执行后会在用户主目录下创建rpmbuild目录和.rpmmacros文件,同时生成所需的子目录和默认的控制参数,执行:


rpmdev-setuptree


自动生成的目录结构:

-- rpmbuild
    |-- BUILD
    |-- RPMS
    |-- SOURCES
    |-- SPECS
    |-- SRPMS

4.创建 SPEC 文件

SPEC文件控制整个rpm的打包过程,包含了打包的全部信息和控制参数,可以使用 rpmdev-newspec 命令来创建一个初始的SPEC文件,SPEC文件需放入rpmbuild/SPECS目录


rpmdev-newspec zookeeper.spec

SPEC 脚本主要定义了打包过程中的几个阶段的配置:

(1)信息定义阶段 :定义软件包的名字、版本等信息和打包过程中用到的变量等
(2)制作准备阶段 :解压源码包、补丁包并打补丁
(3)编译阶段 :设置编译参数并编译源码
(4)安装阶段 :定义安装过程所执行的命令,包括安装前、安装后、卸载前、卸载后执行的操作
(5)清理阶段 :清理打包过程中用到的目录文件等
(6)文件设置阶段 :要打包的文件和目录,并设置文件权限等

目前我的SPEC没有指定软件源码包路径(Source0参数),我是直接将文件夹打包,所直接将文件夹放到/root/rpmbuild/BUILDROOT/apache-zookeeper-3.6.1-1.x86_64/opt/zookeeper(opt/zookeeper必须是根据大家自己配置的打包目录一致)

# 1.信息定义阶段
### 软件名字,要与spec的文件名一致 
Name:           apache-zookeeper
### 软件主版本号
Version:        3.6.1
### 发行编号,每打包一次值递增,主版本号发布新版后需重置该值
Release:        1
### 一行简短的软件简介,结尾不要加标点
Summary:        Zookeeper is a highly reliable distributed coordination service
Group:          
### 软件许可
License:        Apache 2.0
### 软件项目主页
URL:           https://zookeeper.apache.org/
### 放置在SOUIRCES目录的软件源码包名,可以指定多个:source1、source2等
#Source0:        %{name}.%{version}.tar.gz  
### 在 install 阶段的测试安装目录,方便写files
#buildroot:      %_topdir/BUILDROOT
#BuildRequires:  go
### 安装软件包时所需的依赖包列表,可以指定版本如 bash >= 1.1.1
#Requires:       readline-devel,pcre-devel,openssl-devel
### 程序的详细多行描述,每行必须小于等于 80 个字符,空行表示开始新段
%description
Zookeeper 3.6.1

# 2.准备阶段
%prep
## 静默模式解压并进入解压后的目录,也常用:%autosetup -n %{name}
 
# 3. 编译阶段
%build

# 4.安装阶段
%install
### 删除之前的残留文件

## rpm安装前制行的脚本
%pre
### $1==1 代表的是第一次安装,2代表是升级,0代表是卸载
#if [ $1 == 1 ];then     
#     /usr/sbin/useradd -r %{nginx_user} 2> /dev/null 
#fi

## rpm安装后制行的脚本
%post

###卸载前执行的脚本
%preun
###卸载后执行的脚本
%postun
rm -rf opt/zookeeper

# 5.清理阶段
%clean
### 删除buildroot目录
rm -rf %{buildroot}

#  6.文件设置阶段
%files
### 设定默认权限,如果下面没有指定权限,则继承默认
%defattr (-,root,root)
###要打包的文件和目录,在执行完rpmbuild -bi后,参考%{rootbuild}下生成的文件和目录
/opt/zookeeper

编写完 SEPC 文件后,可以通过 rpmlint 检查是否有配置错误


rpmlint motan-go.spec

5.执行打 rpm 包命令

cd /root/rpmbuild/SPECS
rpmbuild -ba zookeeper.spec

6.安装测试RPM包

rpm -Uvh apache-zookeeper-3.6.1-1.x86_64.rpm

******特别备注下,如果需要编译的程序在编译前可以指定到同一目录打包然后整个目录打包

例:export DESTDIR=/opt/zookeeper
./make.sh
./make.sh install

无网络的情况下怎么办!! 只要加个参数下载到本地再去安装rpm包就可以啦,如

代码语言:javascript

sudo yum install -y --downloadonly --downloaddir=<目录>  gcc make rpm-build redhat-rpm-config vim lrzsz

rpm

附:Linux rpm 命令

​编辑 Linux 命令大全

Linux rpm 命令用于管理套件。

rpm(英文全拼:redhat package manager) 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项套件的程序,由于它遵循 GPL 规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM 套件管理方式的出现,让 Linux 易于安装,升级,间接提升了 Linux 的适用度。

语法

rpm [-acdhilqRsv][-b<完成阶段><套间档>+][-e<套件挡>][-f<文件>+][-i<套件档>][-p<套件档>+][-U<套件档>][-vv][--addsign<套件档>+][--allfiles][--allmatches][--badreloc][--buildroot<根目录>][--changelog][--checksig<套件档>+][--clean][--dbpath<数据库目录>][--dump][--excludedocs][--excludepath<排除目录>][--force][--ftpproxy<主机名称或IP地址>][--ftpport<通信端口>][--help][--httpproxy<主机名称或IP地址>][--httpport<通信端口>][--ignorearch][--ignoreos][--ignoresize][--includedocs][--initdb][justdb][--nobulid][--nodeps][--nofiles][--nogpg][--nomd5][--nopgp][--noorder][--noscripts][--notriggers][--oldpackage][--percent][--pipe<执行指令>][--prefix<目的目录>][--provides][--queryformat<档头格式>][--querytags][--rcfile<配置档>][--rebulid<套件档>][--rebuliddb][--recompile<套件档>][--relocate<原目录>=<新目录>][--replacefiles][--replacepkgs][--requires][--resign<套件档>+][--rmsource][--rmsource<文件>][--root<根目录>][--scripts][--setperms][--setugids][--short-circuit][--sign][--target=<安装平台>+][--test][--timecheck<检查秒数>][--triggeredby<套件档>][--triggers][--verify][--version][--whatprovides<功能特性>][--whatrequires<功能特性>]

参数说明

  • -a  查询所有套件。
  • -b<完成阶段><套件档>+或-t <完成阶段><套件档>+  设置包装套件的完成阶段,并指定套件档的文件名称。
  • -c  只列出组态配置文件,本参数需配合"-l"参数使用。
  • -d  只列出文本文件,本参数需配合"-l"参数使用。
  • -e<套件档>或--erase<套件档>  删除指定的套件。
  • -f<文件>+  查询拥有指定文件的套件。
  • -h或--hash  套件安装时列出标记。
  • -i  显示套件的相关信息。
  • -i<套件档>或--install<套件档>  安装指定的套件档。
  • -l  显示套件的文件列表。
  • -p<套件档>+  查询指定的RPM套件档。
  • -q  使用询问模式,当遇到任何问题时,rpm指令会先询问用户。
  • -R  显示套件的关联性信息。
  • -s  显示文件状态,本参数需配合"-l"参数使用。
  • -U<套件档>或--upgrade<套件档> 升级指定的套件档。
  • -v  显示指令执行过程。
  • -vv  详细显示指令执行过程,便于排错。
  • -addsign<套件档>+  在指定的套件里加上新的签名认证。
  • --allfiles  安装所有文件。
  • --allmatches  删除符合指定的套件所包含的文件。
  • --badreloc  发生错误时,重新配置文件。
  • --buildroot<根目录>  设置产生套件时,欲当作根目录的目录。
  • --changelog  显示套件的更改记录。
  • --checksig<套件档>+  检验该套件的签名认证。
  • --clean  完成套件的包装后,删除包装过程中所建立的目录。
  • --dbpath<数据库目录>  设置欲存放RPM数据库的目录。
  • --dump  显示每个文件的验证信息。本参数需配合"-l"参数使用。
  • --excludedocs  安装套件时,不要安装文件。
  • --excludepath<排除目录>  忽略在指定目录里的所有文件。
  • --force  强行置换套件或文件。
  • --ftpproxy<主机名称或IP地址>  指定FTP代理服务器。
  • --ftpport<通信端口>  设置FTP服务器或代理服务器使用的通信端口。
  • --help  在线帮助。
  • --httpproxy<主机名称或IP地址>  指定HTTP代理服务器。
  • --httpport<通信端口>  设置HTTP服务器或代理服务器使用的通信端口。
  • --ignorearch  不验证套件档的结构正确性。
  • --ignoreos  不验证套件档的结构正确性。
  • --ignoresize  安装前不检查磁盘空间是否足够。
  • --includedocs  安装套件时,一并安装文件。
  • --initdb  确认有正确的数据库可以使用。
  • --justdb  更新数据库,当不变动任何文件。
  • --nobulid  不执行任何完成阶段。
  • --nodeps  不验证套件档的相互关联性。
  • --nofiles  不验证文件的属性。
  • --nogpg  略过所有GPG的签名认证。
  • --nomd5  不使用MD5编码演算确认文件的大小与正确性。
  • --nopgp  略过所有PGP的签名认证。
  • --noorder  不重新编排套件的安装顺序,以便满足其彼此间的关联性。
  • --noscripts  不执行任何安装Script文件。
  • --notriggers  不执行该套件包装内的任何Script文件。
  • --oldpackage  升级成旧版本的套件。
  • --percent  安装套件时显示完成度百分比。
  • --pipe<执行指令>  建立管道,把输出结果转为该执行指令的输入数据。
  • --prefix<目的目录>  若重新配置文件,就把文件放到指定的目录下。
  • --provides  查询该套件所提供的兼容度。
  • --queryformat<档头格式>  设置档头的表示方式。
  • --querytags  列出可用于档头格式的标签。
  • --rcfile<配置文件>  使用指定的配置文件。
  • --rebulid<套件档>  安装原始代码套件,重新产生二进制文件的套件。
  • --rebuliddb  以现有的数据库为主,重建一份数据库。
  • --recompile<套件档>  此参数的效果和指定"--rebulid"参数类似,当不产生套件档。
  • --relocate<原目录>=<新目录>  把本来会放到原目录下的文件改放到新目录。
  • --replacefiles  强行置换文件。
  • --replacepkgs  强行置换套件。
  • --requires  查询该套件所需要的兼容度。
  • --resing<套件档>+  删除现有认证,重新产生签名认证。
  • --rmsource  完成套件的包装后,删除原始代码。
  • --rmsource<文件>  删除原始代码和指定的文件。
  • --root<根目录>  设置欲当作根目录的目录。
  • --scripts  列出安装套件的Script的变量。
  • --setperms  设置文件的权限。
  • --setugids  设置文件的拥有者和所属群组。
  • --short-circuit  直接略过指定完成阶段的步骤。
  • --sign  产生PGP或GPG的签名认证。
  • --target=<安装平台>+  设置产生的套件的安装平台。
  • --test  仅作测试,并不真的安装套件。
  • --timecheck<检查秒数>  设置检查时间的计时秒数。
  • --triggeredby<套件档>  查询该套件的包装者。
  • --triggers  展示套件档内的包装Script。
  • --verify  此参数的效果和指定"-q"参数相同。
  • --version  显示版本信息。
  • --whatprovides<功能特性>  查询该套件对指定的功能特性所提供的兼容度。
  • --whatrequires<功能特性>  查询该套件对指定的功能特性所需要的兼容度。

实例

安装软件

# rpm -hvi dejagnu-1.4.2-10.noarch.rpm 
警告:dejagnu-1.4.2-10.noarch.rpm: V3 DSA 签名:NOKEY, key ID db42a60e
准备...           
########################################### [100%]

显示软件安装信息

# rpm -qi dejagnu-1.4.2-10.noarch.rpm

 

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是木木啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值