node.jsをコマンドラインで実行した際に、次のような version `GLIBC_2.27' not found というエラーが発生することがあります。この記事では、その原因と解決手順を整理して解説します。
$ nodebrew use v20.2.0
use v20.2.0
$ node -v
node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)
node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by node)
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by node)
バージョンの確認すら実行できない状態です。
エラーの原因: GLIBC_2.27 not found とは
GLIBC_2.27 not found と言われているのは、node本体が必要とするGLIBC(GNU C Library)のバージョンが、実行環境にインストールされていないことが原因です。GLIBCとは「GNU C Library」のことで、新しいバージョンのnodeほど新しいGLIBCを要求します。古いLinux環境(CentOS 7など)で最新のnodeを動かそうとすると、このエラーに遭遇しやすくなります。
原因を確認する: stringsコマンドでGLIBCのバージョンを調べる
まず、現状のライブラリにどのGLIBCバージョンが含まれているかを、バイナリ内の記述を stringsコマンド で確認します。
$ strings /lib64/libm.so.6 | grep GLIBC_2
GLIBC_2.2.5
GLIBC_2.4
GLIBC_2.15
GLIBC_2.15
__errno_location@@GLIBC_2.2.5
qsort@@GLIBC_2.2.5
fputs@@GLIBC_2.2.5
memset@@GLIBC_2.2.5
feupdateenv@@GLIBC_2.2.5
GLIBC_2.4
memmove@@GLIBC_2.2.5
fwrite@@GLIBC_2.2.5
__cxa_finalize@@GLIBC_2.2.5
stderr@@GLIBC_2.2.5
$ strings /lib64/libm.so.6 | grep GLIBC_2.27
$GLIBC自体は入っていますが、含まれている最新は GLIBC_2.15 までで、nodeが要求する GLIBC_2.27 は入っていないことが確認できます。ほかの GLIBCXX や CXXABI のエラーも、同じくバージョン不足が原因です。
解決方法1: nodeのバージョンを下げる(推奨・最小手間)
最も手軽で確実なのは、実行環境のGLIBCで動作するnodeのバージョンまで下げる方法です。システム環境に手を加える必要がないため、共用サーバーや自分の担当外の環境でも安全に対応できます。
手順は次のとおりです。
nodebrew ls-remoteでインストール可能なバージョンを確認する- 古めの安定版(今回はv16系)をインストールする
nodebrew useで切り替え、node -vでエラーが出ないことを確認する
$ nodebrew ls-remote
~~~
v16.0.0 v16.1.0 v16.2.0 v16.3.0 v16.4.0 v16.4.1 v16.4.2 v16.5.0
v16.6.0 v16.6.1 v16.6.2 v16.7.0 v16.8.0 v16.9.0 v16.9.1 v16.10.0
v16.11.0 v16.11.1 v16.12.0 v16.13.0 v16.13.1 v16.13.2 v16.14.0 v16.14.1
v16.14.2 v16.15.0 v16.15.1 v16.16.0 v16.17.0 v16.17.1 v16.18.0 v16.18.1
v16.19.0 v16.19.1 v16.20.0
~~~
$ nodebrew install v16.20.0
Fetching: https://nodejs.org/dist/v16.20.0/node-v16.20.0-linux-x64.tar.gz
################################################################################################################################################# 100.0%
Installed successfully
$ nodebrew use v16.20.0
use v16.20.0
$ node -v
v16.20.0今回の環境では v16まで下げればエラーは出なくなりました。どこまで下げれば動くかは環境のGLIBCバージョン次第なので、エラーが消えるまで段階的に下げて試すのが確実です。
nodebrewの導入方法についてはこちらで解説しています。
解決方法2: GLIBCを更新する(最新nodeが必要な場合)
どうしても最新のnodeを使いたい場合は、GLIBC自体を更新する方法があります。ソースインストールで更新する手順が参考になります。
ただし、GLIBCの更新はシステム全体に影響する変更で、root権限が必要なうえ、他ライブラリの動作確認やメンテナンスコストも増えます。共用環境や本番サーバーでは慎重に判断し、可能であれば 解決方法1(nodeのバージョンを下げる)で最小限に対応するのがおすすめです。
まとめ
version `GLIBC_2.27' not foundは、nodeが要求するGLIBCが環境に入っていないことが原因strings /lib64/libm.so.6 | grep GLIBC_2で現在のGLIBCバージョンを確認できる- 手軽なのは
nodebrewでnodeのバージョンを下げる方法(今回はv16で解消) - 最新nodeが必須ならGLIBC自体の更新が必要だが、影響範囲が大きいため慎重に

コメントを残す