信创云平台离线编译安装PostgreSQL 14、PostGIS
0. 背景说明
0.1 信创云环境
ARM CPU、AArch64架构、麒麟操作系统
[root@localhost:~]$ nkvers
############## Kylin Linux Version #################
Release:
Kylin Linux Advanced Server release V10 (Sword)
Kernel:
4.19.90-24.4.v2101.ky10.aarch64
Build:
Kylin Linux Advanced Server
release V10 (SP2) /(Sword)-aarch64-Build09/20210524
#################################################
0.2 目标软件及相关依赖源码
序号 | 目标软件源码 | 版本 | 下载链接 |
---|---|---|---|
01 | PostgreSQL | 14.5 | postgresql-14.5.tar.gz |
02 | PostGIS | 3.3.2 | postgis-3.3.2.tar.gz |
序号 | 第三方依赖源码 | 版本 | 是否可选 | 下载链接 |
---|---|---|---|---|
01 | GEOS | 3.11.2 | geos-3.11.2.tar.bz2 | |
02 | sqlite | 3.42.0 | sqlite-autoconf-3420000.tar.gz | |
03 | proj | 6.3.2 | proj-6.3.2.tar.gz | |
04 | json-c | 0.13.1 | json-c-0.13.1.tar.gz | |
05 | libxml2 | 2.9.12 | libxml2-2.9.12.tar.gz | |
06 | protobuf | 3.15.8 | protobuf-all-3.15.8.tar.gz | |
07 | protobuf-c | 1.4.1 | protobuf-c-1.4.1.tar.gz | |
08 | GDAL | 3.5.2 | gdal-3.5.2.tar.gz | |
09 | CGAL | 4.13 | 是 | CGAL-4.13.tar.gz |
10 | SFCGAL | 1.3.8 | 是 | SFCGAL-1.3.8.tar.gz |
11 | PgRouting | 3.4.2 | 是 | pgrouting-3.4.2.tar.gz |
2. 编译前准备
2.1 安装第三方依赖包
2.1.1 方式一:在线安装
yum install -y openssl openssl-devel pam pam-devel libxml2 libxml2-devel libxslt libxslt-devel perl perl-devel python-devel readline readline-devel zlib zlib-devel gettext gettext-devel bison flex gcc gcc-c++ gmp gmp-c++ gmp-devel mpfr mpfr-devel
2.1.2 方式二:离线安装
软件包查找教程:https://www.cnblogs.com/hellxz/p/17634810.html
通过该教程可知,本机软件包在线源如下:
【base】https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/base/aarch64/Packages/
【updates】https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/updates/aarch64/Packages/
# 安装示例
rpm -ivh libstdc++-devel-7.3.0-20190804.35.p02.ky10.aarch64.rpm
依赖关系如下:
├── 01-gcc-c++
│ ├── gcc-c++-7.3.0-20190804.35.p02.ky10.aarch64.rpm
│ └── libstdc++
│ └── libstdc++-devel-7.3.0-20190804.35.p02.ky10.aarch64.rpm
├── 02-openssl
│ ├── openssl-1.1.1f-4.p01.ky10.aarch64.rpm
│ ├── openssl-devel
│ │ ├── krb5-devel
│ │ │ ├── e2fsprogs-devel-1.45.6-1.ky10.aarch64.rpm
│ │ │ ├── keyutils-libs-devel-1.6.3-1.ky10.aarch64.rpm
│ │ │ └── libverto-devel-0.3.1-2.ky10.aarch64.rpm
│ │ └── krb5-devel-1.18.2-1.ky10.aarch64.rpm
│ └── openssl-devel-1.1.1f-4.p01.ky10.aarch64.rpm
├── 03-pam
│ ├── pam-1.4.0-3.p04.ky10.aarch64.rpm
│ └── pam-devel-1.4.0-3.p04.ky10.aarch64.rpm
├── 04-libxml2
│ ├── libxml2-2.9.10-11.ky10.aarch64.rpm
│ └── libxml2-devel-2.9.10-11.ky10.aarch64.rpm
├── 05-libxslt
│ ├── libxslt-1.1.34-3.ky10.aarch64.rpm
│ ├── libxslt-devel
│ │ ├── libgcrpt-devel
│ │ │ └── libgpg-error-devel-1.38-1.ky10.aarch64.rpm
│ │ └── libgcrypt-devel-1.8.6-2.ky10.aarch64.rpm
│ └── libxslt-devel-1.1.34-3.ky10.aarch64.rpm
├── 06-perl
│ └── perl-devel-5.28.3-3.p01.ky10.aarch64.rpm
├── 07-python
│ ├── python2-devel-2.7.18-1.se.01.ky10.aarch64.rpm
│ └── python3-devel-3.7.9-6.ky10.aarch64.rpm
├── 08-readline
│ ├── readline-8.0-3.ky10.aarch64.rpm
│ ├── readline-devel
│ │ └── ncurses-devel-6.2-1.ky10.aarch64.rpm
│ └── readline-devel-8.0-3.ky10.aarch64.rpm
├── 09-zlib
│ ├── zlib-1.2.11-17.1.ky10.aarch64.rpm
│ └── zlib-devel-1.2.11-17.1.ky10.aarch64.rpm
├── 10-gettext
│ ├── gettext-0.21-2.ky10.aarch64.rpm
│ └── gettext-devel-0.21-2.ky10.aarch64.rpm
├── 11-bison
│ └── bison-3.6.4-1.ky10.aarch64.rpm
├── 12-flex
│ └── flex-2.6.4-2.ky10.aarch64.rpm
├── 13-boost
│ ├── boost
│ │ ├── boost-atomic-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-chrono-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-container-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-context-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-contract-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-coroutine-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-date-time-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-fiber-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-filesystem-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-graph-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-locale-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-log-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-math-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-nowide-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-numpy3
│ │ │ ├── numpy3
│ │ │ │ ├── openblas
│ │ │ │ │ └── libgfortran-7.3.0-20190804.35.p02.ky10.aarch64.rpm
│ │ │ │ ├── openblas-0.3.10-1.ky10.aarch64.rpm
│ │ │ │ └── openblas-devel-0.3.10-1.ky10.aarch64.rpm
│ │ │ └── python3-numpy-1.16.5-3.ky10.aarch64.rpm
│ │ ├── boost-numpy3-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-program-options-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-python3-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-random-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-serialization-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-stacktrace-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-system-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-test-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-thread-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-timer-1.73.0-3.p01.ky10.aarch64.rpm
│ │ ├── boost-type_erasure-1.73.0-3.p01.ky10.aarch64.rpm
│ │ └── boost-wave-1.73.0-3.p01.ky10.aarch64.rpm
│ ├── boost-1.73.0-3.p01.ky10.aarch64.rpm
│ └── boost-devel-1.73.0-3.p01.ky10.aarch64.rpm
├── 14-gmp
│ ├── gmp-6.2.0-1.ky10.aarch64.rpm
│ ├── gmp-c++-6.2.0-1.ky10.aarch64.rpm
│ └── gmp-devel-6.2.0-1.ky10.aarch64.rpm
└── 15-mpfr
├── mpfr-4.1.0-1.ky10.aarch64.rpm
└── mpfr-devel-4.1.0-1.ky10.aarch64.rpm
2.2 创建用户
# 创建用户组
groupadd postgres
# 创建用户
useradd -g postgres postgres
2.3 创建目录
# 编译时的临时目录
mkdir -p /data/pg_compile
# postgres软件安装目录
mkdir -p /data/pgsql/pg14
# postgis扩展目录
mkdir -p /data/pgsql/postgis
将所有源码放到/data/pg_compile
目录,并修改目录所有者。
# 修改目录所有者为 postgres 用户
chown -R postgres:postgres /data/pg_compile
chown -R postgres:postgres /data/pgsql
如下图所示:
3. 编译安装PostgreSQL 14
3.1 编译安装
切换到postgres
用户,进入/data/pg_compile
目录
su postgres
cd /data/pg_compile
# 用户: postgres
# 目录: /data/pg_compile
tar -xzf postgresql-14.5.tar.gz
cd postgresql-14.5
./configure --prefix=/data/pgsql/pg14 --with-pgport=5432 --with-openssl --with-perl --with-blocksize=16
make -j6
make install
3.2 修改用户shell配置
安装完成后,修改当前用户(postgres
)的shell(bash
)配置文件。
vim /home/postgres/.bashrc
追加如下内容:
export PGHOME=/data/pgsql/pg14
export PGDATA=/data/pgsql/pg14/data
export LD_LIBRARY_PATH=$PGHOME/lib:lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export DATE='date +"%Y%m%d%H%M"'
export PATH=$PGHOME/bin:$PATH:.
export MANPATH=$PGHOME/share/man:$MANPATH
:wq
保存并关闭文件。
# 用户: postgres
# 重新加载配置文件
souce /home/postgres/.bashrc
# 查看PostgreSQL版本
psql --version
# 输出 psql (PostgreSQL) 14.5 说明安装成功
3.3 初始化pg数据库
# 用户: postgres
initdb -D /data/pgsql/pg14/data -E UTF8 --locale=zh_CN.utf8
3.4 配置远程访问(通过密码)
# 用户: postgres
vim /data/pgsql/pg14/data/pg_hba.conf
追加一行
host all all 0.0.0.0/0 md5
3.5 配置监听地址和端口
# 用户: postgres
vim /data/pgsql/pg14/data/postgresql.conf
找到 listen_addresses
配置项,去掉一些注释符号,并作如下修改:
listen_addresses = '*'
port = 5432
max_connections = 500
#superuser_reserved_connections = 3
unix_socket_directories = '/tmp'
unix_socket_group = ''
unix_socket_permissions = 0777
如下图所示:
3.6 启动PostgreSQL
# 用户: postgres
cd /data/pgsql/pg14
mkdir logs
/data/pgsql/pg14/bin/pg_ctl -D /data/pgsql/pg14/data -l /data/pgsql/pg14/logs/pgsql.log start
如下图所示,说明PostgreSQL正常启动。
3.7 通过shell连接数据库
方式一:通过unix domain socket
连接:
# 用户: postgres
psql -p 5432 -U postgres
方式二:通过TCP/IP
连接:
# 用户: postgres
psql -h localhost -p 5432 -U postgres
使用\password
命令,修改postgres
用户密码:
postgres=# \password
按键Ctrl-D
退出PostgreSQL交互式shell。
3.7 停止PostgreSQL
/data/pgsql/pg14/bin/pg_ctl stop
可以定义命令别名。修改/home/postgres/.bashrc
文件,追加如下内容:
# vim /home/postgres/.bashrc
# 追加如下内容
alias pghome='cd /data/pgsql/pg14'
alias pgstart='/data/pgsql/pg14/bin/pg_ctl -D /data/pgsql/pg14/data -l /data/pgsql/pg14/logs/pgsql.log start'
alias pgstop='/data/pgsql/pg14/bin/pg_ctl stop'
alias pgconn='psql -h localhost -p 5432 -U postgres'
# 用户: postgres
# 重新加载shell配置
source /home/postgres/.bashrc
然后就可以通过 pgstart
启动PG数据库,pgstop
停止数据库,pgconn
连接数据库。
分割线: 下面开始编译安装PostGIS-3.3.2
编译postgis
必须要事先编译的几个包:
- geos
- sqlite
- proj
- libxml2
- protobuf
- protobuf-c
可选编译的几个包:
- 栅格分析:GDAL (推荐安装)
- 3D空间操作: SFCGAL
- 网络分析: PgRouting
4. 编译安装GEOS
# 用户: postgres
# 目录: /data/pg_compile
tar -xjf geos-3.11.2.tar.bz2
cd geos-3.11.2
./configure --prefix=/data/pgsql/postgis/geos
make -j6
make install
添加GEOS
到环境变量,编辑 /home/postgres/.bashrc
文件,追加如下内容:
export GEOS_HOME=/data/pgsql/postgis/geos
export PATH=$GEOS_HOME/bin:$PATH
# 用户: postgres
# 检查GEOS版本
geos-config --version
5. 编译安装sqlite
# 用户: postgres
# 目录: /data/pg_compile
tar -xzf sqlite-autoconf-3420000.tar.gz
cd sqlite-autoconf-3420000
需要修改源码 sqlite3.c
,新增如下一行宏定义:
#define SQLITE_ENABLE_COLUMN_METADATA 1
然后进行编译。
# 用户: postgres
# 目录: /data/pg_compile/sqlite-autoconf-3420000
./configure --prefix=/data/pgsql/postgis/sqlite
make -j6
make install
在 /data/postgres/.bashrc
中配置环境变量,追加如下内容
export PKG_CONFIG_PATH=/data/pgsql/postgis/sqlite/lib/pkgconfig:$PKG_CONFIG_PATH
# 重载配置
source ~/.bashrc
6. 编译安装proj
# 用户: postgres
# 目录: /data/pg_compile
tar -xzf proj-6.3.2.tar.gz
cd proj-6.3.2
./configure --prefix=/data/pgsql/postgis/proj6
make -j6
make install
7. 编译安装json-c
# 用户: postgres
# 目录: /data/pg_compile
tar -xzf json-c-0.13.1.tar.gz
cd json-c-0.13.1
./configure --prefix=/data/pgsql/postgis/jsonc
make -j6
make install
8. 编译安装libxml2
# 用户: postgres
# 目录: /data/pg_compile
tar -xzf libxml2-2.9.12.tar.gz
cd libxml2-2.9.12
./configure --prefix=/data/pgsql/postgis/libxml2
make -j6
make install
如果 make install
报错,权限不足。可以切换到root
用户再次 make install
,然后修改目标路径的所属用户。
# 用户: root
# 目录: /data/pg_compile/libxml2-2.9.12
make install
chown -R postgres:postgres /data/pgsql/postgis/libxml2
# 记得切换回postgres用户
su postgres
9. 编译安装protobuf
# 用户: postgres
# 目录: /data/pg_compile
tar -xzf protobuf-all-3.15.8.tar.gz
cd protobuf-3.15.8
./configure --prefix=/data/pgsql/postgis/protobuf
make -j6
make install
配置环境变量,修改 /home/postgres/.bashrc
文件,追加如下内容:
export PROTOBUF_HOME=/data/pgsql/postgis/protobuf
export PATH=$GCC_HOME/bin:$PROTOBUF_HOME/bin:$PATH
export PKG_CONFIG_PATH=/data/pgsql/postgis/protobuf/lib/pkgconfig:$PKG_CONFIG_PATH
# 用户: postgres
# 重载配置
source ~/.bashrc
# 查看protobuf版本
protoc --version
# 输出 libprotoc 3.15.8
10. 编译安装protobuf-c
# 用户: postgres
# 目录: /data/pg_compile
tar -xzf protobuf-c-1.4.1.tar.gz
cd protobuf-c-1.4.1
./configure --prefix=/data/pgsql/postgis/protobufc
make -j6
make install
配置环境变量,修改 /home/postgres/.bashrc
文件,追加如下内容:
export PROTOBUFC_HOME=/data/pgsql/postgis/protobufc
export PATH=$GCC_HOME/bin:$PROTOBUF_HOME/bin:$PROTOBUFC_HOME/bin:$PATH
export PKG_CONFIG_PATH=/data/pgsql/postgis/protobufc/lib/pkgconfig:$PKG_CONFIG_PATH
# 用户: postgres
# 重载配置
source ~/.bashrc
11. 编译安装GDAL (推荐安装)
# 用户: postgres
# 目录: /data/pg_compile
tar -xzf gdal-3.5.2.tar.gz
cd gdal-3.5.2
./configure --prefix=/data/pgsql/postgis/gdal --with-proj=/data/pgsql/postgis/proj6
make -j6
make install
分割线: 下面的[12]、[13]节,可选安装。
- 3D空间操作: SFCGAL (依赖CGAL)
- 网络分析: PgRouting
如果没有这方面的需求,可以不用安装。
如果安装了这两个包,则目标软件 (PostgreSQL和PostGIS) 移植到其他同类型机器上会比较麻烦(需要安装boost开发包、编译安装CGAL这两个步骤)
如果不安装,则可以直接将下面3个文件或目录拷贝到其他同类型机器(CPU架构、操作系统相同)上直接使用。
- /data/pgsql
- /home/postgres/.bashrc (用户shell配置)
- /etc/ld.so.conf.d/postgis-aarch64.conf (动态库配置)
12. 编译安装SFCGAL (可选)
12.1 编译安装CGAL
使用root用户编译安装到默认目录。
# 用户: root (!!!)
# 目录: /data/pg_compile
tar -xzf cgal-releases-CGAL-4.13.tar.gz
cd cgal-releases-CGAL-4.13
mkdir build
cd build
# 使用默认目录,否则会有很多问题!!!
cmake ..
make -j6
make install
12.2 编译安装SFCGAL
切换到postgres用户。
# 用户: postgres
# 目录: /data/pg_compile
tar -xzf SFCGAL-1.3.8.tar.gz
cd SFCGAL-1.3.8
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/data/pgsql/postgis/sfcgal ..
make -j6
make install
13. 编译安装PgRouting
# 用户: postgres
# 目录: /data/pg_compile
tar -xzf pgrouting-3.4.2.tar.gz
cd pgrouting-3.4.2
mkdir build
cd build
# 不指定安装路径,此处读取环境变量pg的路径/data/pgsql/pg14/share/extension/
cmake ..
make -j6
make install
分割线: 至此,PostGIS依赖的第三方库都已安装完成,开始编译安装PostGIS本体。
14. 编译安装PostGIS
14.1 配置动态链接库
首先,配置上面安装的各个第三方库的动态链接库路径。
# 用户: root
# 编辑配置文件
vim /etc/ld.so.conf.d/postgis-aarch64.conf
# 添加如下内容
/data/pgsql/pg14/lib
/data/pgsql/postgis/proj6/lib
/data/pgsql/postgis/gdal/lib
/data/pgsql/postgis/geos/lib64
/data/pgsql/postgis/jsonc/lib
/data/pgsql/postgis/libxml2/lib
/data/pgsql/postgis/protobuf/lib
/data/pgsql/postgis/protobufc/lib
/data/pgsql/postgis/sfcgal/lib64
如果没有安装SFCGAL
,最后一行可以不用添加。
# 用户: root
# 重载配置
ldconfig -v
14.2 编译安装PostGIS
切换到postgres用户。
# 用户: postgres
# 目录: /data/pg_compile
tar -xzf postgis-3.3.2.tar.gz
cd postgis-3.3.2
# [1] 如果安装了 SFCGAL 执行这条语句
./configure --prefix=/data/pgsql/postgis/postgis --with-gdalconfig=/data/pgsql/postgis/gdal/bin/gdal-config --with-geosconfig=/data/pgsql/postgis/geos/bin/geos-config --with-pgconfig=/data/pgsql/pg14/bin/pg_config --with-projdir=/data/pgsql/postgis/proj6 --with-xml2config=/data/pgsql/postgis/libxml2/bin/xml2-config --with-jsondir=/data/pgsql/postgis/jsonc --with-protobufdir=/data/pgsql/postgis/protobufc --with-sfcgal=/data/pgsql/postgis/sfcgal/bin/sfcgal-config
# [2] 如果没有安装 SFCGAL 执行这条语句
./configure --prefix=/data/pgsql/postgis/postgis --with-gdalconfig=/data/pgsql/postgis/gdal/bin/gdal-config --with-geosconfig=/data/pgsql/postgis/geos/bin/geos-config --with-pgconfig=/data/pgsql/pg14/bin/pg_config --with-projdir=/data/pgsql/postgis/proj6 --with-xml2config=/data/pgsql/postgis/libxml2/bin/xml2-config --with-jsondir=/data/pgsql/postgis/jsonc --with-protobufdir=/data/pgsql/postgis/protobufc
make -j6
make install
查看是否安装成功:
# 用户: postgres
# 启动PostgreSQL数据库
/data/pgsql/pg14/bin/pg_ctl -D /data/pgsql/pg14/data -l /data/pgsql/pg14/logs/pgsql.log start
# 登录数据库
psql -h localhost -p 5432 -U postgres
-- 执行sql语句
select name from pg_available_extensions;
如果看到postgis
等扩展的名称,说明安装成功。如下图所示。
15、测试PostGIS功能
- 创建数据库
test_spatial
- 连接到数据库
test_spatial
- 启用
POSTGIS
扩展。 - 创建
Polygon
(SRID:4326) 图层。 - 插入测试数据。
- 计算多边形面积。(先投影到平面坐标系SRID:4526,再计算面积)
postgres=# create database test_spatial owner postgres;
postgres=# \l
postgres=# \c test_spatial
postgres=# create extension postgis;
test_spatial=# create table t_build_polygon(id int primary key, name varchar(50), geom geometry(polygon, 4326));
test_spatial=# CREATE INDEX gix_build_polygon ON t_build_polygon USING GIST (geom);
test_spatial=# insert into t_build_polygon(id, name, geom) values(1, '幸福家园A栋', ST_GeomFromText('Polygon ((114.41328788 30.56880575, 114.41328294 30.56868717, 114.41357281 30.56868058, 114.41357446 30.56880246, 114.41328788 30.56880575))', 4326));
test_spatial=# insert into t_build_polygon(id, name, geom) values(2, '幸福家园C栋', ST_GeomFromText('Polygon ((114.41327965 30.56857847, 114.41327635 30.56844176, 114.41356293 30.56843847, 114.41356787 30.56857682, 114.41327965 30.56857847))', 4326));
test_spatial=# select id, name, ROUND(ST_Area(ST_Transform(geom, 4526))::numeric, 2) as area from t_build_polygon;
安装完成。
END
Thanks for Reading!
作者:iCrystal
邮箱:leopard.c@outlook.com
博客:https://blog.icrystal.top
GitHub: https://github.com/Leopard-C