linux 通过RPM方式打包文件/RPM常用命令

已邀请:

1、查看rpm包概要信息

rpm -qi XX.rpm

/uploads/answer/20200903/9e73f9043c96a4c5d0d218a60a6bb5c9.png


2、安装RPM包

rpm -ivh XXX.rpm

准备一个RPM打包环境

yum install -y rpm-build*


将一组代码简单打包成RPM


1、准备.spec概要文件

在/root/rpmbuild/SPECS/下创建概要文件,这里创建nccloud.spec



Name: NCCloud
Version: 2021.05
Release: 1.0
Summary: 用友 NC Cloud 大型企业数字化平台。
Group: yonyou
License: 用友网络科技股份有限公司(C)2019
URL: https://www.yonyou.com/
Source: %{name}%{version}.zip
%define __os_install_post %{nil}
%define debug_package %{nil}
%description
NC Cloud是应用最新的物联网、大数据、人工智能等技术开发的新一代云 ERP 产品,为成长型集团企业和大型企业集团提供混合云解决方案,基于开放、互联、融合、智能的产品理念,服务大型企业数字化转型。开放互联,全面融合,云端智能服务,打造数字企业新平台,重塑企业新技术、新商业的核心竞争力。


%prep
%setup

%install
mkdir -p $RPM_BUILD_ROOT/opt/nccloud/
cp -R * $RPM_BUILD_ROOT/opt/nccloud/


%files
%defattr(-,root,root,0755)
/opt/nccloud/


%pre


%post
chmod +x /opt/nccloud/nccloud


%preun

%postun
rm -rf /opt/nccloud





%changelog
* Tue Aug 25 2020 Niuxiaozheng <niuxzhc@yonyou.com> - 1.0.1
- 首次创建包


其中大概字段通过上述文件内容即可理解。创建概要完成后准备软件包。


2、将文件保存至/root/rpmbuild/BUILDROOT/产品名称-版本-补丁版本.el7.x86_64目录下(如不确定,可以直接进行下一步编译,根据报错放置文件)


3、启动打包

cd /root/rpmbuild/SPECS/

rpmbuild -ba nccloud.spec

应该会在/root/rpmbuild/RPMS/x86_64/生成"产品名称-版本-补丁版本.el7.x86_64.rpm"包,即可用来安装

上步骤,拟用来执行的服务:ncserver内容如下


#!/bin/bash
#ncserver niuxzhc 2020.8.25

start_ncc=/opt/nccloud/startup.sh
sysconfig_ncc=/opt/nccloud/bin/sysConfig.sh
stop_ncc=/opt/nccloud/stop.sh

start_nmc=/opt/nccloud/nmc/server/startmonitor.sh
stop_nmc=/opt/nccloud/nmc/server/stopmonitor.sh
sysconfig_nmc==/opt/nccloud/nmc/server/configure.sh

start_intelliv=/opt/nccloud/intelliv/startup.sh
stop_intelliv=/opt/nccloud/intelliv/shutdown.sh

sysconfig_SearchServer=/opt/nccloud/microserver/SearchServer/bin/sysConfig.sh
start_SearchServer=/opt/nccloud/microserver/SearchServer/startup.sh
stop_SearchServer=/opt/nccloud/microserver/SearchServer/stop.sh

sysconfig_SessionServer=/opt/nccloud/microserver/SessionServer/bin/sysConfig.sh
start_SessionServer=/opt/nccloud/microserver/SessionServer/startup.sh
stop_SessionServer=/opt/nccloud/microserver/SessionServer/stop.sh

sysconfig_PKLockServer=/opt/nccloud/microserver/PKLockServer/bin/sysConfig.sh
start_PKLockServer=/opt/nccloud/microserver/PKLockServer/startup.sh
stop_PKLockServer=/opt/nccloud/microserver/PKLockServer/stop.sh

sysconfig_MessageServer=/opt/nccloud/microserver/MessageServer/bin/sysConfig.sh
start_MessageServer=/opt/nccloud/microserver/MessageServer/startup.sh
stop_MessageServer=/opt/nccloud/microserver/MessageServer/stop.sh


startncc() {
echo -n "Starting NC Cloud ..."
${start_ncc} 2>&1 >/dev/null
}

stopncc() {
echo -n "Stop NC Cloud ..."
${start_ncc} 2>&1 >/dev/null
}

case "$1" in
start_ncc)
${start_ncc}
;;
stop_ncc)
${stop_ncc}
;;
sysconfig_ncc)
${sysconfig_ncc}
;;

start_nmc)
${start_nmc}
;;
stop_nmc)
${stop_nmc}
;;
sysconfig_nmc)
${sysconfig_nmc}
;;

start_intelliv)
${start_intelliv}
;;
stop_intelliv)
${stop_intelliv}
;;

sysconfig_SearchServer)
${sysconfig_SearchServer}
;;
start_SearchServer)
${start_SearchServer}
;;
stop_SearchServer)
${stop_SearchServer}
;;

sysconfig_SessionServer)
${sysconfig_SessionServer}
;;
start_SessionServer)
${start_SessionServer}
;;
stop_SessionServer)
${stop_SessionServer}
;;


sysconfig_PKLockServer)
${sysconfig_PKLockServer}
;;
start_PKLockServer)
${start_PKLockServer}
;;
stop_PKLockServer)
${stop_PKLockServer}
;;

sysconfig_MessageServer)
${sysconfig_MessageServer}
;;
start_MessageServer)
${start_MessageServer}
;;
stop_MessageServer)
${stop_MessageServer}
;;


*)
echo "Usage: $0{start_ncc|stop_ncc|sysconfig_ncc|start_nmc|stop_nmc|sysconfig_nmc|start_intelliv|stop_intelliv|sysconfig_SearchServer|start_SearchServer|stop_SearchServer|sysconfig_SessionServer|start_SessionServer|stop_SessionServer|sysconfig_PKLockServer|start_PKLockServer|stop_PKLockServer|sysconfig_MessageServer|start_MessageServer|stop_MessageServer}"
esac
exit 0



SPEC文件简介


Name: 软件名称
Version: 软件版本
Release: 发布次数 如: 1%{?dist}
Summary: 软件说明
Group: 软件分组
License: 授权模式,例如 GPL,即自由软件
URL: 源码包的URL地址,可随意填写
Source0: 源码包,可指定多个,下面可用%{SOURCE0}变量引用
BuildRoot: 编译过程中的中间存档目录,考虑到多用户的环境,一般定义为:
%{_tmppath}/%{name}-%{version}-%{release}-root ,
后面可使用$RPM_BUILD_ROOT 方式引用
BuildArch: 平台 %{_arch}
BuildRequires: 编译过程依赖的工具
Requires: 打包生成的rpm包安装时所依赖的软件包
%description 说明文档
%prep 准备部分,比如创建目录,解压源码包等,可使用%setup内部函数
%build 在BUILD目录编译,可使用%configure内部函数,或者其他编译工具,如cmake, perl等
%install 安装到BUILDROOT虚拟目录
%clean 清理文件
%files 将指定的文件添加到rpm包中,文档类型可用%doc,配置文件可 用%config
%changelog 更新记录.格式: 第一行 "* 日期 作者 " 第二行 "- 更新内容"
最终的生成的rpm名称: {Name}-{Version}-{Relesae}-{BuildArch}.rpm

Name:nginx #软件包名称,后面可使用%{name}引用

Version:1.10.3 #软件的版本号,与源码包一致

Release:1 #发布序列号

Summary:for centos6.5x86_64 #软件包的内容概要

Group:Development/Tools #软件分组

License:GPL #软件授权方式

URL:http://www.baidu.com #软件的主页

Source0:%{name}-%{version}.tar.gz #源代码包

BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-BuildRoot #这个安装或编译时使用的“虚拟目录”

Prefix: %{_prefix} #为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录。必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm包安装时重新指定位置的功能。

Prefix: %{_sysconfdir} #%{_prefix}指/usr,而对其他的文件,例如/etc下的配置文件,则需要用%{sysconfdir}标识。

%define wwwpath /data/htdocs/www #后面在使用这个地址时就可以直接引用%{wwwpath}

%define logspath /data/logs #后面在使用这个地址时就可以直接引用%{logspath}

%description #软件包详述 doc

nginx [engine x] is a HTTP and reverse proxy server, as well as a mail proxy server

%prep #软件编译之前的处理,如解压。

%setup -q #打开软件包,加选项对软件包进行解压处理 去我们的SOURCE目录去找到源码包并解压

%install 安装软件执行语句

[ "RPM_BUILD_ROOT" != "/" ] && rm -rf "RPM_BUILD_ROOT" ##查看BUILDROOT目录是否为空,不为空时删除里面的内容

mkdir -p $RPM_BUILD_ROOT/%{_prefix} #在BUILDROOT目录中创建/usr目录

cp -ar ./* $RPM_BUILD_ROOT%{_prefix} #将当前目录中的所有文件及属性全部复制到这个目录下

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

mkdir -p %{wwwpath} #创建/data/htdocs/www目录

mkdir -p %{logspath} #创建/data/logs目录

groupadd www #创建新的用户组

useradd -g www www -s /dev/null #创建新用户到指定的用户组及用户目录

mkdir %{_prefix}/etc/local/services

mv %{_prefix}/nginx %{_prefix}/local/services/ #将nginx文件移动到/usr/local/services/目录下

mv %{_prefix}/index.html %{wwwpath} #将index.html文件移动到/data/htdocs/www目录下

mv %{_prefix}/check.php %{wwwpath} #将check.php文件移动到/data/htdocs/www目录下

mv %{_prefix}/infor.php %{wwwpath} #将infor.php文件移动到/data/htdocs/www目录下

mv %{_prefix}/init/nginx %{_sysconfdir}/init.d/ #将/usr/init/nginx移动到/etc/init.d/目录下

ln -s %{_prefix}/local/services/nginx/sbin/* %{_prefix}/local/sbin/ #创建软链接

chmod +w %{wwwpath} #给/data/htdocs/www目录赋予写权限

chown -R www:www %{wwwpath} #修改/data/htdocs/www的所有者和所属组的

chmod +w %{logspath} #给/data/logs目录赋予写权限

chmod +x %{_sysconfdir}/init.d/nginx #给/etc/init.d/nginx文件赋予执行权限 4 r 2 w 1 x

chown -R www:www %{logspath} #修改/data/logs的所有者和所属组的

chkconfig nginx on #设置开机启动

sed -i "s/ytios_admin/hostname/g" /usr/local/services/nginx/conf/nginx.conf #将这个文件中的ytios_admin替换为hostname

%postun #卸载后执行的操作

%{_sysconfdir}/init.d/nginx stop #让服务暂停

sleep 2 #休眠2秒

rm -f %{_prefix}/local/sbin/nginx #删除/usr/local/sbin/nginx文件

%{_rm} -rf %{_prefix}/local/services/nginx #删除/usr/local/services/nginx文件

%{_rm} -rf %{_sysconfdir}/init.d/nginx #删除/etc/init.d/nginx文件

userdel www -r >/dev/null 2>&1 #删除www这个用户

%files #定义那些文件或目录会放入rpm中 这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对目录

%defattr(-,root,root) #指定包装文件的属性 分别是(mode,owner,group) -表示默认值,对文本文件是0644 可执行文件为0755

%{_prefix}/nginx

%{_prefix}/index.html

%{_prefix}/check.php

%{_prefix}/infor.php

%{_prefix}/init

%clean #删除临时目录

[ "RPM_BUILD_ROOT" != "/" ] && rm -rf "RPM_BUILD_ROOT"

rm -rf $RPM_BUILD_DIR/%{name}-%{version}

%changelog #变更日志  

SPEC 文件详解


%define summary your package description #软件包的内容概要
%define name YourPackageName #定义rpm包的包名
%define version 8.0 #定义rpm包的版本号,软件的实际版本号
%define release 170505 #定义rpm包的版本号(svn提交的版本号)
%define arch noarch # 指编译的目标处理器架构
%define group SFY
Summary: %{summary} #引用上面的定义,下同
Name: %{name}
Version: %{version}
Release: %{release} # 发布序列号
License: Commercial #软件授权方式,通常就是GPL
Group: %{group}
BuildRoot: %{_builddir}
BuildArchitectures: %{arch}
AutoReqProv: no
Vendor: SFY AG
Requires: unzip #需要依赖的rpm包,安装此rpm包需要依赖unzip的rpm包
Prefix: /opt #这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
Prefix: /var/opt
#下面为主体
%prep #预处理脚本

%build #开始构建包

%install #开始把软件安装到虚拟的根目录中

# 下面的 $RPM_BUILD_ROOT 参数为必传参数,不然创建会失败
install -m 0755 -D /root/rpmbuild/SOURCES/ant_build/dom4j-1.6.1.jar $RPM_BUILD_ROOT/opt/sfy/jar/dom4j-1.6.1.jar #需要打进rpm包的jar包
install -m 0640 -D /root/rpmbuild/SOURCES/config/yourconfig.properties $RPM_BUILD_ROOT/var/sfy/config/yourconfig.properties #需要打进rpm包的配置文件



%clean #清理临时文件

%files #定义哪些文件或目录会放入rpm中
%defattr (-,root,root,-)# 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755,这里不能遗漏(指上面%install中所涉及的文件路径)
/opt/sfy/config/jar

%defattr (-,sfy-adm,sfy,-)#csi-adm, csi 为自定义的用户与用户组,及上面的
/var/sfy/config



%description #描述
SFY TAS Connector package

%pre #安装此rpm包前需要检验环境
if [[ ! -f ${RPM_INSTALL_PREFIX}/sfy/install.info ]]
then
echo "Could not find ${RPM_INSTALL_PREFIX}/sfy/install.info !"
echo "Base packages has been installed somewhere else or the file has been removed!"
exit 255
fi

%post
# Read installation info variables
eval `grep -v \* /var/sfy/install.info`

%preun

%postun

要回复问题请先登录注册