# 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
# 9.2.3 根据提示,检查环境
(centos下安装rpm-build: yum install rpm-build) 清空~/rpmbuild/myscripts/下文件后,将微服务拷贝至~/rpmbuild/myscripts/下 重新运行脚本
# 9.2.4 根据脚本提示输入相关信息
(安装路径指的是使用rpm包安装在服务器上后服务的安装路径)
# 9.2.5 打包完成,根据提示找到生成的rpm包
提示: 针对脚本中没有的硬件平台类型或芯片架构,可以手动添加修改脚本手动添加一行 或者直接在该类服务器测试环境下打包时去掉脚本中--target=$platform参数
# 9.3 特别提醒:
全文检索服务打rpm包之后,因es服务启动需要普通用户运行,因此无法直接通过最外层脚本启动(涉密机环境不允许直接通过su切换账号,且新建普通用户需要找管理员授权)
全文检索分为elasticsearch和searchservice两个服务,如图
启动方法:
- 联系客户系统管理员创建普通用户es_search,并授权设置密码
- 注销root账号,登录es_search用户
- 进入全文检索目录下ES/es-bin,运行startup.sh,启动elasticsearch
- 注销es_search用户,登录root用户
- 进入全文检索目录下search/searchservice,运行startup.sh,启动searchservice
# 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