rpm打包的流程包括以下哪些_RPM打包用户指南

本文详细介绍了在CentOS 7环境下,如何进行RPM资源包的打包过程。首先,确保安装了`rpm-build`工具,接着配置打包的顶层目录`rpmbuild`。然后,通过创建指定目录结构,开发System V初始化脚本和SPEC打包规则文件,最终使用`rpmbuild`命令生成RPM包。文章以一个简单的shell脚本为例,详细解释了每个步骤及其涉及的关键配置和脚本内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于CentOS 7系列的软件工程在开发完成之后,总有一个如何发布的问题,通常的选择是以RPM资源包的形式发布,这需要开发者额外开发rpm打包脚本(project.spec),但在实际开发过程中几乎每次新工程代码发布流程总是遇到各种坑,诸多不顺。下面以一个简单脚本的打包流程为例梳理整个打包流程。

1. 安装工具

[elvis@localhost ~]$ which rpmbuild

/usr/bin/rpmbuild

[elvis@localhost ~]$ rpm -q -f /usr/bin/rpmbuild

rpm-build-4.11.3-17.el7.x86_64

打包需要事先在CentOS中安装相应的rpm-build包。

2. 环境配置

首先,检查topdir顶层目录配置。其中RPM相关的配置项在/usr/lib/rpm目录下:

[elvis@localhost ~]$ grep -rn _topdir /usr/lib/rpm/*

/usr/lib/rpm/macros:159:%_builddir %{_topdir}/BUILD

/usr/lib/rpm/macros:214:%_rpmdir %{_topdir}/RPMS

/usr/lib/rpm/macros:222:%_sourcedir %{_topdir}/SOURCES

/usr/lib/rpm/macros:226:%_specdir %{_topdir}/SPECS

/usr/lib/rpm/macros:229:%_srcrpmdir %{_topdir}/SRPMS

/usr/lib/rpm/macros:232:%_buildrootdir %{_topdir}/BUILDROOT

/usr/lib/rpm/macros:241:%_topdir %{getenv:HOME}/rpmbuild

其实topdir可以指定到任意目录,这个顶层目录作为之后打包发布的顶层目录,可配置为:

echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros

然后,创建打包目录,采纳默认的顶层目录为/home_dir/rpmbuild,在该顶层目录下面创建如下目录结构:

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

到此,打包环境准备完成,之后便是经常出错的打包脚本开发阶段。

3. 一个简单shell脚本打包成RPM包

首先,整个目录结构组织形式如下:

[elvis@localhost rpmbuild]$ tree

.

├── BUILD

│ ├── bridge-daemon.init

│ └── bridge-daemon.spec

├── BUILDROOT

├── RPMS

│ └── x86_64

│ └── bridge-daemon-0.0.1-el7.x86_64.rpm

├── SOURCES

├── SPECS

└── SRPMS

7 directories, 3 files

其中System V初始化脚本如下所示,同时满足:将bridge-daemon设置成开机自启服务

通过System V管理bridge-daemon的整个生命周期

[elvis@localhost BUILD]$ cat bridge-daemon.init

#!/bin/bash

export LANG=C

. /etc/init.d/functions

umask 133

start() {

action "Prepare bridge-daemon: "

BR=bridge-daemon

if [ -d /sys/class/net/$BR/bridge/. ]; then

ifconfig $BR down

brctl delbr $BR

else

brctl addbr $BR

ifconfig $BR 192.16.0.1/20 up

fi

if [ $? != 0 ] ; then

exit 1

fi

}

stop() {

action "Stop bridge-daemon bridge!"

BR=bridge-daemon

if [ -d /sys/class/net/$BR/bridge/. ]; then

ifconfig $BR down

brctl delbr $BR

fi

}

restart() {

stop

start

}

status() {

action "Checking bridge-daemon status: "

ifconfig | grep bridge-daemon

}

case "$1" in

start)

start

;;

stop)

stop

;;

restart)

restart

;;

status)

status

;;

*)

echo $"Usage: bridge-daemon {start|stop|restart|status}"

exit 1

esac

exit $?

4. SPEC打包规则文件

RPM打包最重要的开发工作便是负责RPM执行动作的SPEC脚本的开发,其有一套自定义的语法规则,特别是一些全局变量的定义,相关配置项在/usr/lib/rpm目录下。SPEC开发过程中遇到非常多的全局%variable定义,正是这些变量导致了几乎每次新发布总会踩到一些坑,并且有些变量在各Linux平台下不通用,各有各的定义。其中常用变量定义如下:

[elvis@localhost BUILD]$ cat bridge-daemon.spec

Summary: Prepare net environment #介绍域,包名、版本等信息

Name: bridge-daemon

Version: 0.0.1

Release: el7

License: GPL

Group: System Environment/Base

ExclusiveArch: x86_64

%description

bridge-daemon prepare net bridge environment

%define __spec_install_pre /bin/true #为了保留BUILDROOT目录下的中间产物

%prep #准备阶段,主要是为后续执行的准备工作

mkdir -p %{buildroot}%{_sysconfdir}/rc.d/init.d

install -c -m 755 $OLDPWD/bridge-daemon.init %{buildroot}%{_sysconfdir}/rc.d/init.d/bridge-daemon

exit 0

%build #编译阶段,比如编译C工程的configure,make等操作

%install #安装阶段

%clean #一个良好的习惯就是清理临时安装目录

rm -rf %{buildroot}

%files #待安装文件列表

%{_sysconfdir}

%post #安装后执行的脚本域

/sbin/chkconfig --add bridge-daemon

/sbin/chkconfig bridge-daemon on

echo "running post scriplet"

/sbin/service bridge-daemon start

%pre #安装前执行的脚本域

if [ $1 -eq 2 ]; then

/sbin/service bridge-daemon stop >/dev/null 2>&1

fi

%preun #卸载前(pre-uninstall)执行的脚本域

if [ $1 -eq 0 ]; then

/sbin/service bridge-daemon stop

fi

%changelog

* Tue Jun 27 2017 Elvis Huang

- Initial rpm packaging for bridge-daemon

最后执行动作生成RPM资源包:

[elvis@localhost BUILD]$ rpmbuild -bb bridge-daemon.spec

检查资源包内容:

[elvis@localhost x86_64]$ rpm -qpl bridge-daemon-0.0.1-el7.x86_64.rpm

/etc

/etc/rc.d

/etc/rc.d/init.d

/etc/rc.d/init.d/bridge-daemon

至此,RPM打包流程介绍完毕。之后便是熟悉的通过RPM发布的资源安装管理

[elvis@localhost x86_64]$ sudo rpm -ivh bridge-daemon-0.0.1-el7.x86_64.rpm

Preparing... ################################# [100%]

Updating /installing... 1:bridge-daemon-0.0.1-el7 #############[100%]

running post scriplet

Starting bridge-daemon (via systemctl): [ OK ]

[elvis@localhost x86_64]$ ifconfig

bridge-daemon: flags=4163 mtu 1500

inet 192.16.0.1 netmask 255.255.240.0 broadcast 192.16.15.255

inet6 fe80::54e1:bcff:fecf:c701 prefixlen 64 scopeid 0x20

ether 56:e1:bc:cf:c7:01 txqueuelen 0 (Ethernet)

RX packets 0 bytes 0 (0.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 27 bytes 3924 (3.8 KiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536

inet 127.0.0.1 netmask 255.0.0.0

inet6 ::1 prefixlen 128 scopeid 0x10

loop txqueuelen 0 (Local Loopback)

RX packets 0 bytes 0 (0.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 0 bytes 0 (0.0 B)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值