Pivotal Knowledge Base

フォローする

"ERROR: could not load library "xxxx/pgcrypto.so": xxxx/lib/postgresql/pgcrypto.so: undefined symbol: FIPS_mode_set" というエラーで pg_crypto のインストールに失敗する

環境

製品 バージョン
Pivotal Greenplum 4.3.x、4.2.x
OS RHEL 6.x

事象

以下のエラーメッセージが出力され、pgcrypto のインストールに失敗する。 

エラーメッセージ:

[gpadmin@gpdbsne lib64]$ psql -d <database-name> -f $GPHOME/share/postgresql/contrib/pgcrypto.sql
SET
psql:/usr/local/greenplum-db/./share/postgresql/contrib/pgcrypto.sql:9: ERROR: could not load library "/usr/local/greenplum-db-4.3.5.3/lib/postgresql/pgcrypto.so": /usr/local/greenplum-db-4.3.5.3/lib/postgresql/pgcrypto.so: undefined symbol: FIPS_mode_set
[......]
[......]

原因 

この問題は、誤った crypto ライブラリーを参照している場合に発生する。

例えば、crypto ライブラリー "libcrypto.so.0.9.8" が、Greenplum データベースの当該ライブラリーを参照しているべきであるのに、"greenplum-perfmon-web-4.1.1.5-build-1" のインストールディレクトリーにある crypto ライブラリーを参照している場合等。

[gpadmin@gpdbsne lib64]$ ldd /usr/local/greenplum-db-4.3.5.3/lib/postgresql/pgcrypto.so
	linux-vdso.so.1 =>  (0x00007fffa01ff000)
	libcrypto.so.0.9.8 => /usr/local/greenplum-perfmon-web-4.1.1.5-build-1/lib/libcrypto.so.0.9.8 (0x00007f3a9cd21000)
	libz.so.1 => /usr/local/greenplum-cc-web/./lib/libz.so.1 (0x00007f3a9cb0a000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f3a9c75e000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f3a9c55a000)
	/lib64/ld-linux-x86-64.so.2 (0x0000003601e00000)

この参照ミスは、ユーザーが UNIX サーバーへ接続する際に環境変数の設定が行われることで発生する。例えば、上述の例の場合は、LD_LIBRARY_PATH 環境変数が以下のように設定されていると考えられる。

[gpadmin@gpdbsne lib64]$ env | grep LD
LD_LIBRARY_PATH=/usr/local/greenplum-perfmon-web-4.1.1.5-build-1/lib:/usr/local/greenplum-cc-web-1.3.0.3-build-18/lib:/usr/local/greenplum-db/./lib:/usr/local/greenplum-db/./ext/python/lib: 

上述の設定にあるように、まず始めに crypto ライブラリーを参照するディレクトリーとして "/usr/local/greenplum-perfmon-web-4.1.1.5-build-1/lib" と "/usr/local/greenplum-cc-web-1.3.0.3-build-18/lib" が使用されている。これは、(ユーザーが更新した).bashrc ファイルに当該環境パスが設定されていることで問題が発生している。

注意: 最終行で実行された source の内容が、常にライブラリーパス確認の際に適用される。

source /usr/local/greenplum-db/greenplum_path.sh
source /usr/local/greenplum-db/gpcc_path.sh
source /usr/local/greenplum-db/gpperfmon_path.sh

ここでの原因は、データベースの postmaster が異なる 2 つのインストール作業で導入された crypto ファイルが参照され、、Greenplum データベース由来でないものを参照していることにある。

[gpadmin@gpdbsne lib64]$ lsof -p 31949  | grep crypto
postgres 31949 gpadmin  mem    REG              253,1   309353 1191079 /usr/local/greenplum-cc-web-1.3.0.3-build-18/lib/libk5crypto.so.3.1
postgres 31949 gpadmin  mem    REG              253,1  1788415 1325183 /usr/local/greenplum-perfmon-web-4.1.1.5-build-1/lib/libcrypto.so.0.9.8
[gpadmin@gpdbsne lib64]$ 

解決策

この問題を解決するために、以下の手順に従うこと。

  1. .bashrc の最終行で以下の Greenplum 関連ライブラリーの設定が読み込まれるよう修正。
    source /usr/local/greenplum-db/gpcc_path.sh
    source /usr/local/greenplum-db/gpperfmon_path.sh
    source /usr/local/greenplum-db/greenplum_path.sh
  2. .bashrc の内容を再読み込みすると、以下のように正しい箇所を参照するようになる。
    [gpadmin@gpdbsne lib64]$ env | grep LD
    LD_LIBRARY_PATH=/usr/local/greenplum-db/./lib:/usr/local/greenplum-db/./ext/python/lib:/usr/local/greenplum-perfmon-web-4.1.1.5-build-1/lib:/usr/local/greenplum-cc-web-1.3.0.3-build-18/lib:
  3. データベースを再起動し、新しい postmaster プロセスが正しいライブラリーを参照していることを確認。
    [gpadmin@gpdbsne lib64]$ lsof -p 19896 | grep crypto
    postgres 19896 gpadmin  mem    REG              253,1   583652 1071088 /usr/local/greenplum-db-4.3.5.3/lib/libk5crypto.so.3.1
    postgres 19896 gpadmin  mem    REG              253,1  1855858 1071063 /usr/local/greenplum-db-4.3.5.3/lib/libcrypto.so.0.9.8
    [gpadmin@gpdbsne lib64]$ 
  4. 以下のコマンドを使用し、pgcrypto ファイルを再実行する。
    psql -d <database-name> -f $GPHOME/share/postgresql/contrib/pgcrypto.sql

メモ

本記事で議論された問題を引き起こし得る他の問題は以下である。

  • サーバー側で OpenSSL rpm が更新された場合。サーバーはパッケージを再読み込みするために、再起動が必要となる。
  • 対象データベースのバージョンにそぐわない間違った拡張パッケージ(gppkg)がダウンロードされた場合。

コメント

Powered by Zendesk