Skip to content

Greenplum制作RPM安装包

官方文档地址:http://www.postgres.cn/v2/news/viewone/1/612

此教程打包版本为:greenplum 6.9.1

Python版本用的系统自带的Python 2.7.5

其他版本可参考

准备工作

1、下载相关包

序号下载连接备注
1setuptools-33.1.1setuptools-33.1.1Python源码
2psutil-5.7.2psutil-5.7.2Python源码
3pbr-5.4.5pbr-5.4.5Python源码
4lockfile-0.12.2lockfile-0.12.2Python源码
5pycparser-2.20pycparser-2.20Python源码
6cffi-1.14.1cffi-1.14.1Python源码
7bcrypt-3.1.7bcrypt-3.1.7Python源码
8six-1.15.0six-1.15.0Python源码
9PyNaCl-1.4.0PyNaCl-1.4.0Python源码
10cryptography-3.0cryptography-3.0Python源码
11ipaddress-1.0.23ipaddress-1.0.23Python源码
12enum34-1.1.10enum34-1.1.10Python源码
13paramiko-2.7.1paramiko-2.7.1Python源码
14epydoc-3.0.1zip: epydoc-3.0.1tar.gz: epydoc-3.0.1Python源码
15cmake-3.9.2cmake-3.9.2Python源码
16zstd-1.4.5|zstd-dev-1.4.5https://github.com/facebook/zstd源码
17gp-xerces-3.1.2-p1https://github.com/greenplum-db/gp-xerces源码
18re2c-2.0https://github.com/skvadrik/re2c源码
19ninja-1.10.0https://github.com/ninja-build/ninja源码
20gporca-3.106.1https://github.com/greenplum-db/gporca/tree/v3.65.3源码
216.9.1-src-full.tar.gz6.9.1-src-full.tar.gz源码

下载对应版本包,高版本未测试

2、安装对应服务

安装setuptools

bash
cd setuptools-33.1.1
python bootstrap.py
python setup.py install

安装psutil

bash
tar -xvf psutil-5.7.2.tar.gz
cd psutil-5.7.2
python setup.py install

安装pbr

bash
tar -xvf pbr-5.4.5.tar.gz
cd pbr-5.4.5
python setup.py install

安装lockfile

bash
tar -xvf lockfile-0.12.2.tar.gz
cd lockfile-0.12.2
python setup.py install

安装pycparser

bash
tar -xvf pycparser-2.20.tar.gz
cd pycparser-2.20
python setup.py install

安装cffi

bash
tar -xvf cffi-1.14.1.tar.gz
cd cffi-1.14.1
python setup.py install

安装six

bash
tar -xvf six-1.15.0.tar.gz
cd six-1.15.0
python setup.py install

安装bcrypt

bash
tar -xvf bcrypt-3.1.7.tar.gz
cd bcrypt-3.1.7
python setup.py install

six需要在bcrypt前安装,bcrypt依赖six

安装PyNaCl

bash
tar -xvf PyNaCl-1.4.0.tar.gz
cd PyNaCl-1.4.0
python setup.py install

可能由于缺少wheel和pip安装不上

pip可尝试源码安装,whell有网络可以尝试pip安装,没有网可以尝试下对应的离线包安装或源码安装

安装ipaddress

bash
tar -xvf ipaddress-1.0.23.tar.gz
cd ipaddress-1.0.23
python setup.py install

安装enum34

bash
tar -xvf enum34-1.1.10.tar.gz
cd enum34-1.1.10
python setup.py install

安装cryptography

bash
tar -xvf pycparser-2.20.tar.gz
cd cryptography-3.0
python setup.py install

ipaddress、enum34需要在cryptography前安装,cryptography依赖ipaddress、enum34

安装paramiko

bash
tar -xvf paramiko-2.7.1.tar.gz
cd paramiko-2.7.1
python setup.py install

安装epydoc

bash
tar -xvf epydoc-3.0.1.tar.gz
cd epydoc-3.0.1
python setup.py install

安装cmake

bash
tar -xvf cmake-3.9.2.tar.gz
cd cmake-3.9.2
./bootstrap
make
make install
/usr/local/bin/cmake --version

安装zstd

bash
tar -xvf zstd-1.4.5.tar.gz
cd zstd-1.4.5
make
make install

安装gp-xerces

bash
tar -xvf gp-xerces-3.1.2-p1.tar.gz
cd gp-xerces-3.1.2-p1
./configure
make
make install

安装re2c

bash
tar -xvf re2c-2.0.tar.gz
cd re2c-2.0
./autogen.sh
./configure
make
make install

可能缺少autoconf、git安装不上

可能出现没有git的目录报错,执行git init

可能出现缺少libtool装不上

安装ninja

bash
tar -xvf ninja-1.10.0.tar.gz
cd ninja-1.10.0
./configure.py --bootstrap
cp ninja /usr/bin/

安装gporca

bash
tar -xvf gporca-3.106.1.tar.gz
cd gporca-3.106.1
cmake -GNinja -H. -Bbuild

# 第167行注释掉
vi libgpos/src/common/CStackDescriptor.cpp
bash
# 如下带//的
void
CStackDescriptor::BackTrace
        (
        ULONG
        )
{
//      GPOS_CPL_ASSERT(!"Backtrace is not supported for this platform");
}

#endif
bash
ninja install -C build
echo /usr/local/lib >/etc/ld.so.conf
ldconfig

3、安装相关依赖

bash
yum install -y gcc python-devel gcc-c++ curl-devel bzip2-devel openssl-devel readline-devel perl-ExtUtils-Embed libxml2-devel openldap-devel pam pam-devel perl-devel apr-devel libevent-devel libyaml libyaml-devel libedit-devel libffi-devel git libtool bison flex postgresql-devel

检查是否安装上,如果有遗漏的记得补充完整,如果没有,考虑源码安装

4、安装rpm-build

bash
yum install rpm-build

如果没有,考虑源码安装

5、编译greenplum6.9.1

bash
tar -xvf 6.9.1-src-full.tar.gz
cd gpdb_src
./configure --with-perl --with-python --with-libxml --prefix=/usr/local/gpdb
make

可能由于缺少bison、flex导致失败

制作Greenplum的RPM安装包

创建rpmbuild目录

bash
# 这里以在当前用户(root)根目录为例
mkdir -p ~/rpmbuild/{BUILD,RPMS,BUILDROOT,SRPMS,SOURCES,SPECS}

编辑greenplum6.9.1.spec

bash
vi ~/rpmbuild/SPECS/greenplum6.9.1.spec
bash
%define version 6.9.1
%define directory /usr/local
%define __os_install_post %{nil}
%define debug_package %{nil}
%define __jar_repack 0

Name: greenplum
Version: %{version}
Release: 1%{?dist}
License: Apache License Version 2.0
Summary: Greenplum Database (GPDB) is an advanced, fully featured, open source data warehouse, based on PostgreSQL.
# Url
# Group:
Source: %{name}-%{version}.tar.gz
# Patch:
# BuildRequires:
Requires: apr apr-util bash bzip2 curl krb5-devel libcurl libevent libxml2 libyaml zlib openldap openssh openssl perl
Requires: readline rsync sed tar zip net-tools less openssh-clients which iproute openssh-server openssl-libs
# PreReq:
# Provides:
BuildRoot: %{_tmppath}/%{name}-%{version}-build

%description
%prep
%setup -q
%build
./configure --with-perl --with-python --with-libxml --prefix=%{directory}/%{name}-%{version}
make %{?_smp_mflags}

%install
make install DESTDIR=${buildroot} %{?_smp_mflags}
mkdir -p %{buildroot}%{directory}/%{name}-%{version}
cp -r %{_builddir}/%{name}-%{version} %{buildroot}%{directory}/%{name}-%{version}
%pre
%preun
%post
%postun
%clean
rm -rf %{buildroot}
%files
%defattr(-,root,root)
%{directory}/%{name}-%{version}
%changelog

修改greenplum源代码目录名为greenplum-6.16.3并压缩

bash
mv gpdb greenplum-6.16.3
tar czvf greenplum-6.16.3.tar.gz greenplum-6.16.3

复制源码包到rpmbuild内的源代码目录

bash
# 回到6.9.1-src-full.tar.gz或gpdb_src所在的目录,修改源码包的名字,再打成tar.gz包
cd ..
mv gpdb_src greenplum-6.9.1
tar czvf greenplum-6.9.1.tar.gz greenplum-6.9.1
cp greenplum-6.9.1.tar.gz ~/rpmbuild/SOURCES/

制作rpm安装包:

bash
rpmbuild -ba ~/rpmbuild/SPECS/greenplum6.9.1.spec

查看制作好的rpm安装包:

bash
ll ~/rpmbuild/RPMS/x86_64	# x86
ll ~/rpmbuild/RPMS/aarch64	# arm
# 大致如下
-rw-r--r--. 1 root root 82025928 1月  20 20:31 greenplum-6.9.1-1.el7.x86_64.rpm

其他问题

pip安装

前提:已安装setuptools,否则直接安装pip会提示没有setuptools

bash
tar -xvf pip-20.3.1.tar.gz
cd pip-20.3.1
python setup.py build
python setup.py install

编译找不到依赖文件

编译过程中找不到:postgres.h、pg_config_ext.h、pg_config.h等时,配置环境变量C_INCLUDE_PATH指向源码src目录下的include目录,更新环境变量即可

bash
# profile、profile.d等地方配置均可,配置完source /etc/profile即可
export C_INCLUDE_PATH=....../greenplum-6.9.1/src/include:$C_INCLUDE_PATH

spec文件不写依赖的情况依然存在依赖库

rpm -qlp *.rpm查看rpm包中携带的文件

ldd file检测编译文件夹下的bin文件是否是bin文件带来的依赖

vi /usr/lib/rpm/micro编辑rpm的编译宏

找到455,456行,注释掉

bash
455 #%__find_provides       %{_rpmconfigdir}/find-provides
456 #%__find_requires       %{_rpmconfigdir}/find-requires

重新编译,使用rpm -qpR *.rpm检测新生成的rpm是否带有依赖

如果问题未被解决,则在spec文件Requires下面加入一行AutoReqprv: no来规避掉二进制文件带来的依赖

AUTOREQ=0 (注意使用AutoReqprv:no 之后需要手工写spc 该rpm包的provider

实际上,测试在Requires前写后面还可以写要检查的依赖