# RPM打包参考文档

本文以AAS产品打包为例

# 1、认识rpm和dpkg

目前在Linux 界软体安装方式最常见的有两种,分别是:

**dpkg **:

这个机制最早是由Debian Linux 社群所开发出来的,透过dpkg的机制,

Debian提供的软体就能够简单的安装起来,同时还能提供安装后的软体资讯,实在非常不错。 只要是衍生于Debian的其他Linux distributions 大多使用dpkg 这个机制来管理软体的, 包括B2D,Ubuntu 等等。

RPM :

这个机制最早是由Red Hat这家公司开发出来的,后来实在很好用,因此很多distributions就使用这个机制来作为软体安装的管理方式。 包括Fedora, CentOS, SuSE等等知名的开发商都是用它。

# 2.准备

1)一个Linux环境,比如CentOS

2)RPM打包使用的是rpmbuild命令,这个命令来自rpm-build包,这个是必装的。使用 yum install rpm-build 命令来安装rpm-build。

3)AAS产品压缩包,比如AAS-V9.0.tar.gz

# 3、查看linux系统架构类型

(本步是为了后面打包做准备)

执行命令:arch 查看架构信息

# 4、创建"工作空间"

执行命令:mkdir -p \~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

在主目录(root)下生成一个名为rpmbuild的文件夹,里面内容如下:

rpmbuild
├── BUILD //源码包被解压至此,并在该目录的子目录完成编译
├── RPMS //生成/保存二进制 RPM 包
├── SOURCES //保存源码包(如 .tar 包)和所有 patch 补丁
├── SPECS //保存 RPM 包配置(.spec)文件
└── SRPMS //生成/保存源码 RPM 包(SRPM)

# 5、放置产品包

将AAS-9.0SP5.tar.gz产品包(注意解压出来的产品名称需为AAS-9.0SP5,即名称要对应)

放置在SOURCES目录下面

# 6、编辑spec文件

在SPECS目录下,创建AAS.spec名称的文件,内容如下(这里截取了一部分)显示:

具体看附件(双击可下载):

注意:该文件中Source标签的构成为: %(name)-%(version).tar.gz,所以要注意若Name和Version标签的值改变,相应的压缩包的名称也要修改(这里可以先解压原来的压缩包,修改了名称后再打包,这里和第4步的提示是对应的)

完整目录结构如下所示:

root
├── rpmbuild
│ ├── BUILD
│ ├── RPMS
│ ├── SOURCES
│ ├──AAS-9.0SP5.tar.gz
│ ├── SPECS
├──AAS.spec
│ ├── SRPMS

# 7、打包

进入/root/SPECS目录下,执行命令:

rpmbuild -bb --target=X86_64 AAS.spec

(bb前面是一根横杠,target前面是两根,tartget这个参数是用来指定系统架构的,这个值根据查询到的设定,和第3步对应。如果机器本身架构就是x86_64,target参数也可以不加,打包的时候自动会有x86_64的标识)

如下为执行打包命令和打包完成状态(信息较多,截取部分信息,打包后的rpm包在/root/RPMS目录下,其中AAS-9.0SP5-20190113.x86_64.rpm是我们需要的包,另外一个不用管):

提示:BUILDROOT目录是打包过程中生成的,保存 %install 阶段安装的文件。

# 8、安装软件包

执行命令:rpm --ivh AAS-9.0SP5-20190113.x86_64.rpm,安装产品包,安装位置在/opt目录下,名称是AAS。(安装的位置和AAS.sepc文件里BuildRoot标签设置相对应)

# 9、使用build_rpm_pkg.sh脚本封装rpm

# 9.1 背景:

涉密机环境无法直接运行脚本或可执行文件,需通过管理工具以rpm包形式安装到服务器上才能运行 不同涉密机需要打包的环境不同,建议在相同硬件及系统的测试环境或开发版镜像进行打包操作,详情请咨询对应系统厂商

# 9.2 使用方法:

# 9.2.1 复制build_rpm_pkg.sh到打包服务器的/root目录

例如: 海光-中科方德:可以在x86服务器上安装中科方德开发版镜像或者海光-中科方德测试机直接打包 飞腾-银河麒麟:飞腾-银河麒麟测试机,其他arm架构服务器

# 9.2.2 授权并运行,创建打包目录

cd /root chmod +x build_rpm_pkg.sh ./build_rpm_pkg.sh

1728872205730.png

# 9.2.3 根据提示,检查环境

(centos下安装rpm-build: yum install rpm-build) 清空~/rpmbuild/myscripts/下文件后,将微服务拷贝至~/rpmbuild/myscripts/下 重新运行脚本

# 9.2.4 根据脚本提示输入相关信息

(安装路径指的是使用rpm包安装在服务器上后服务的安装路径)

1728872244980.png

# 9.2.5 打包完成,根据提示找到生成的rpm包

1728872265774.png

提示: 针对脚本中没有的硬件平台类型或芯片架构,可以手动添加修改脚本手动添加一行 或者直接在该类服务器测试环境下打包时去掉脚本中--target=$platform参数

1728872282426.png

1728872291637.png

# 9.3 特别提醒:

全文检索服务打rpm包之后,因es服务启动需要普通用户运行,因此无法直接通过最外层脚本启动(涉密机环境不允许直接通过su切换账号,且新建普通用户需要找管理员授权)

全文检索分为elasticsearch和searchservice两个服务,如图

1728872321909.png

启动方法:

  1. 联系客户系统管理员创建普通用户es_search,并授权设置密码
  2. 注销root账号,登录es_search用户
  3. 进入全文检索目录下ES/es-bin,运行startup.sh,启动elasticsearch
  4. 注销es_search用户,登录root用户
  5. 进入全文检索目录下search/searchservice,运行startup.sh,启动searchservice

1728872348597.png

1728872353340.png

# 9.4 build_rpm_pkg.sh

#!/bin/bash


function echo_color_green (){
  echo -e "\033[1;32m$1\033[0m"
}

function echo_color_red (){
  echo -e "\033[1;31m$1\033[0m"
}

function echo_color_yellow (){
  echo -e "\033[1;33m$1\033[0m"
}

function echo_color_blue (){
  echo -e "\033[1;34m$1\033[0m"
}

function init_environment {
[ -d ~/rpmbuild/myscripts ] || mkdir -p ~/rpmbuild/myscripts
[ -d ~/rpmbuild/SOURCES ] || mkdir -p ~/rpmbuild/SOURCES
[ -d ~/rpmbuild/SPECS ] || mkdir -p ~/rpmbuild/SPECS
}

function check_ready {
echo_color_yellow "注意:1.运行该脚本前请确认已安装rpm-build工具!!!"
echo_color_yellow "      2.请先清空~/rpmbuild/myscripts/下文件,并将所需要打包的文件或目录拷贝至~/rpmbuild/myscripts/下!!!"
echo_color_yellow "      3.如已经操作过,回复Y继续,没有回复N,并退出脚本后重新运行即可!!!"

read -p "请选择(Y/N):" choice
case $choice in
  y|Y)
  echo_color_blue "\n----ready build---\n";;
  n|N)
  echo_color_blue "请手动拷贝所需脚本到~/rpmbuild/myscripts/下,重新运行脚本!!"
  exit;;
  *)
  echo_color_red "输入有误,退出脚本!!"
  exit;;
esac
}

function main {
read -p "请输入安装包名:" softname
read -p "请输入安装包版本(如1.0.0):" version
read -p "请输入安装路径:" softpath
cat <<EOF
******************************************************
	(1)龙芯-mips64el
	(2)兆芯-x86_64
	(3)飞腾-aarch64
	(4)不分架构-noarch
******************************************************
EOF
read -p "请输入平台类型:" platform
case $platform in 
1)
platform=mips64el;;
2)
platform=x86_64;;
3)
platform=aarch64;;
4)
platform=noarch;;
*)
echo_color_red "输入有误,退出脚本!!"
exit;;
esac

echo_color_green "\n------准备打包------\n"

cd ~/rpmbuild/
chmod -R +x myscripts/*
f_num=`ls myscripts |wc -l`
if [ $f_num -eq 1 ];then
  f_name=`ls myscripts`
  mv myscripts/$f_name/* myscripts/ && rm -rf myscripts/$f_name
fi
mkdir $softname
mv myscripts/* $softname/
mv $softname myscripts/
cd ~/rpmbuild/myscripts
tar -cvzf $softname.tar.gz $softname && mv $softname.tar.gz ~/rpmbuild/SOURCES/

echo_color_green "\n------开始打包------\n"


#编写spec文件
cat > ~/rpmbuild/SPECS/$softname.spec << EOF
Name: $softname
Version: $version
Summary: $softname for secret machine
Release: 1
Source0: $softname.tar.gz
License: GPL
URL: http://seeyon.com

%description
$softname for secret machine

%install
mkdir -p %{buildroot}$softpath
tar -zvxf %{SOURCE0}
mv $softname %{buildroot}/$softpath/

%clean
rm -rf %{buildroot}/$softpath

%files
$softpath

EOF

cd ~/rpmbuild
rpmbuild -ba --target=$platform SPECS/$softname.spec

if [ $? -eq 0 ];then
echo_color_green "\n------打包成功------\n"
echo_color_green "~/rpmbuild/RPMS/$platform/$softname-$version-1.$platform.rpm"
fi
}

init_environment
check_ready
main

# 10、常见问题

常见问题一:打包卡在+ /usr/lib/rpm/redhat/brp-java-repack-jars

解决方法:在. Spec文件末尾增加:%define __jar_repack 0

创建人:zhangshuang
修改人:wangyxyf、het