前言: 在将Ambari移植到国产化平台中时,一方面需要将Ambari本身进行编译移植;另一方面,需要将Ambari 管理的大数据组件进行移植。
对于Ambari 管理的大数据组件一般而言是可移植的,对于不可移植的组件需要进行重新编译,然后将编译后的安装包进行重新打包,让Ambari可以通过yum的方式进行安装部署。
另外,当需要对RPM进行二次处理的时候,需要对原始RPM包进行拆包+重新打包。
RPM 解压
将rpm包解压,获取原始的rpm包中的资源
解压命令:
rpm2cpio XX.rpm | cpio -div
JAR 处理
JAR包解压: jar xvf XX.jar
制作Jar包: jar cvfM XX.jar YY.class ….
其中M参数是为了不在jar中中生成meta目录。当需要将大量的class等文件达成jar包时,可进入目录,使用“.” 表示将当前目录下的所有资源打到jar包中。
初始化打包环境
1.安装工具:
yum install rpmbuild rpmdevtools
2.初始化工作空间
rpmdev-setuptree
SPEC文件编写
几个小知识点
1.指定打包之前不要对目标文件做strip(如打包脚本时没必要strip),不对文件进行编译
%define __os_install_post %{nil}
2.打包时,不重新打包jar
%define __jar_repack 0
3.防止打包成noarch时,打包抛出异常并终止
%define _binaries_in_noarch_packages_terminate_build 0
4.禁止自动搜索依赖关系
Autoprov: no
Autoreq: no
打包举例
对Ambari Agent 进行重新打包,其SPEC文件说明。
%define __os_install_post %{nil}
%define _binaries_in_noarch_packages_terminate_build 0
%global agent_conf_dir /etc/ambari-agent
%global agent_init_file /etc/init/ambari-agent.conf
%global agent_initd_file /etc/init.d/ambari-agent
%global agent_lib /usr/lib/ambari-agent/
%global python_lib /usr/lib/python2.6/site-packages/ambari_agent
%global sbin_file /usr/sbin/ambari-agent
%global var_lib /var/lib/ambari-agent
%global var_log /var/log/ambari-agent
%global var_run /var/run/ambari-agent
%define __jar_repack 0
#命令规则:name+version+release号要等于source的文件名
Name: ambari-agent
Version: 2.5.1.0
Release: 159
Summary: Ambari Agent aarch64
License: Apache License 2.0
URL: https://www.hikdata.com/
Source0: ambari-agent-2.5.1.0-159.tar.gz
BuildArch: noarch
Requires: java
Autoprov: no
Autoreq: no
%description
Ambari Agent for noarach
%prep
STACKS_FOLDER="/var/lib/ambari-agent/cache/stacks"
STACKS_FOLDER_OLD=/var/lib/ambari-agent/cache/stacks_$(date '+%d_%m_%y_%H_%M').old
COMMON_SERVICES_FOLDER="/var/lib/ambari-agent/cache/common-services"
COMMON_SERVICES_FOLDER_OLD=/var/lib/ambari-agent/cache/common-services_$(date '+%d_%m_%y_%H_%M').old
if [ -d "/etc/ambari-agent/conf.save" ]
then
mv /etc/ambari-agent/conf.save /etc/ambari-agent/conf_$(date '+%d_%m_%y_%H_%M').save
fi
BAK=/etc/ambari-agent/conf/ambari-agent.ini.old
ORIG=/etc/ambari-agent/conf/ambari-agent.ini
BAK_SUDOERS=/etc/sudoers.d/ambari-agent.bak
ORIG_SUDOERS=/etc/sudoers.d/ambari-agent
[ -f $ORIG ] && mv -f $ORIG $BAK
[ -f $ORIG_SUDOERS ] && echo "Moving $ORIG_SUDOERS to $BAK_SUDOERS. Please restore the file if you were using it for ambari-agent non-root functionality" && mv -f $ORIG_SUDOERS $BAK_SUDOERS
if [ -d "$STACKS_FOLDER" ]
then
mv -f "$STACKS_FOLDER" "$STACKS_FOLDER_OLD"
fi
if [ -d "$COMMON_SERVICES_FOLDER" ]
then
mv -f "$COMMON_SERVICES_FOLDER" "$COMMON_SERVICES_FOLDER_OLD"
fi
%setup -qn ambari-agent-2.5.1.0-159
%build
%install
mkdir -p %{buildroot}%{agent_conf_dir}
mkdir -p %{buildroot}/etc/init
mkdir -p %{buildroot}/etc/init.d
%{__cp} -r -a etc/ambari-agent/* %{buildroot}%{agent_conf_dir}
%{__cp} -f etc/init/ambari-agent.conf %{buildroot}/etc/init/
%{__cp} -f etc/init.d/ambari-agent %{buildroot}/etc/init.d/
mkdir -p %{buildroot}%{agent_lib}
mkdir -p %{buildroot}%{python_lib}
mkdir -p %{buildroot}/usr/sbin
%{__cp} -r -a usr/lib/ambari-agent/* %{buildroot}%{agent_lib}
%{__cp} -r -a usr/lib/python2.6/site-packages/ambari_agent/* %{buildroot}%{python_lib}
%{__cp} -r -a usr/sbin/ambari-agent %{buildroot}/usr/sbin/
mkdir -p %{buildroot}%{var_lib}
mkdir -p %{buildroot}%{var_log}
mkdir -p %{buildroot}%{var_run}
%{__cp} -r -a var/lib/ambari-agent/* %{buildroot}%{var_lib}
%preun
if [ "$1" -eq 0 ]; then # Action is uninstall
if [ -f "/var/lib/ambari-agent/install-helper.sh" ]; then
/var/lib/ambari-agent/install-helper.sh remove
fi
fi
exit 0
%post
case "$1" in
1) # Action install
if [ -f "/var/lib/ambari-agent/install-helper.sh" ]; then
/var/lib/ambari-agent/install-helper.sh install
fi
;;
2) # Action upgrade
if [ -f "/var/lib/ambari-agent/install-helper.sh" ]; then
/var/lib/ambari-agent/install-helper.sh upgrade
fi
;;
esac
mkdir /var/lib/ambari-agent/data
%posttrans
RESOURCE_MANAGEMENT_DIR="/usr/lib/python2.6/site-packages/resource_management"
RESOURCE_MANAGEMENT_DIR_AGENT="/usr/lib/ambari-agent/lib/resource_management"
JINJA_DIR="/usr/lib/python2.6/site-packages/ambari_jinja2"
JINJA_AGENT_DIR="/usr/lib/ambari-agent/lib/ambari_jinja2"
# remove RESOURCE_MANAGEMENT_DIR if it's a directory
if [ -d "$RESOURCE_MANAGEMENT_DIR" ]; then # resource_management dir exists
if [ ! -L "$RESOURCE_MANAGEMENT_DIR" ]; then # resource_management dir is not link
rm -rf "$RESOURCE_MANAGEMENT_DIR"
fi
fi
# setting resource_management shared resource
if [ ! -d "$RESOURCE_MANAGEMENT_DIR" ]; then
ln -s "$RESOURCE_MANAGEMENT_DIR_AGENT" "$RESOURCE_MANAGEMENT_DIR"
fi
# setting jinja2 shared resource
if [ ! -d "$JINJA_DIR" ]; then
ln -s "$JINJA_AGENT_DIR" "$JINJA_DIR"
fi
%files #声明文件,声明了的文件或目录,在进行rpm -e卸载时会自动删除。
%doc
%{agent_conf_dir}
%{agent_init_file}
%{agent_initd_file}
%{agent_lib}
%{python_lib}
%{sbin_file}
%{var_lib}
%{var_log}
%{var_run}
%changelog
打包说明
在进行重新打包时,需要准备的资源包括: rpm资源、spec文件。
rpm资源可通过:rpm2cpio XX.rpm | cpio -div进行收集
SPEC文件的编写:
- 首先获取原先的rpm包安装时进行操作
- 根据需求,加上新的动作
获取原先的rpm安装时进行的操作
(1)rpm -ivvh XX.rpm >> output.txt
将rpm包时进行的所有操作输出来
(2) 在安装完后,通过如下命令查看rpm中带有的script操作
rpm -qa –script XXX
打包编译
通过命令完成打包
rpmbuild -ba xx.spec