こんにちは、七宮さん (@shichinomiya_s) です。
GLIBC_2.28 not found
」に遭遇しました。エラー発生の背景
Ubuntu 16.04 LTS (x86_64) に Node.js 20.9.0 をインストールしたところ、以下のエラーが発生しました:
root@server:/# node -v
node: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.27' not found (required by node)
node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by node)
node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by node)
Node.js のバイナリが要求する GLIBC のバージョンが不足しているため、単に「node -v
」すら実行できない状態になりました。
GLIBCって何ぞや?
GLIBC(GNU C Library)は、Linux をはじめとする多くの OS 上で、メモリ管理、ファイル操作、ネットワーク通信、プロセス管理、数学演算などの基本機能を担う、まさにソフトウェアの土台とも言えるライブラリです。
プログラムが正しく動作するための基盤となるため、バージョンの不整合が発生すると、厄介なことになります。
解消までの道すじ
GLIBC 2.28 をインストールすることで、下位互換性を利用して GLIBC_2.25
や GLIBC_2.27
のエラーも同時に解決できます。
【手順1】 おまじない&ビルド必須パッケージのインストール
apt-get update
apt-get install -y wget perl gcc make
apt-get install -y gawk bison
【手順2】 GLIBC 2.28 のダウンロード&展開
cd /tmp
wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz
tar -xf glibc-2.28.tar.gz
【手順3】 ビルド用ディレクトリの作成
mkdir -p ./glibc-build && cd ./glibc-build
【手順4】 GLIBC のビルドとインストール
../glibc-2.28/configure --prefix=/opt/glibc-2.28
make && make install
【手順5】 インストール確認
ls -la /opt/glibc-2.28
# 以下は実行例
total 40
drwxr-xr-x 10 root root 4096 Nov 6 13:15 .
drwxr-xr-x 1 root root 4096 Nov 6 13:15 ..
drwxr-xr-x 2 root root 4096 Nov 6 13:15 bin
drwxr-xr-x 2 root root 4096 Nov 6 13:15 etc
drwxr-xr-x 21 root root 4096 Nov 6 13:15 include
drwxr-xr-x 4 root root 4096 Nov 6 13:15 lib
drwxr-xr-x 3 root root 4096 Nov 6 13:15 libexec
drwxr-xr-x 2 root root 4096 Nov 6 13:15 sbin
drwxr-xr-x 4 root root 4096 Nov 6 13:15 share
drwxr-xr-x 3 root root 4096 Nov 6 13:15 var
【手順6】 patchelf の導入& Node バイナリの位置確認
apt install -y patchelf
command -v node
# 実行例:
# /root/.nvm/versions/node/v20.9.0/bin/node
【手順7】 Node バイナリが ELF 形式か確認
file {上記で確認した Node バイナリのパス}
# 実行例:
# /root/.nvm/versions/node/v20.9.0/bin/node: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=..., for GNU/Linux 3.2.0, not stripped, too many notes (256)
【手順8】 patchelf で Node バイナリを再リンク
patchelf --set-interpreter /opt/glibc-2.28/lib/ld-linux-x86-64.so.2 --set-rpath /opt/glibc-2.28/lib/:/lib/x86_64-linux-gnu/:/usr/lib/x86_64-linux-gnu/ {上記で確認した Node バイナリのパス}
# 実行例:
# patchelf --set-interpreter /opt/glibc-2.28/lib/ld-linux-x86-64.so.2 --set-rpath /opt/glibc-2.28/lib/:/lib/x86_64-linux-gnu/:/usr/lib/x86_64-linux-gnu/ /root/.nvm/versions/node/v20.9.0/bin/node
# ※ AArch64 の場合は、以下のようにパスが変わります:
# patchelf --set-interpreter /opt/glibc-2.28/lib/ld-linux-aarch64.so.1 --set-rpath /opt/glibc-2.28/lib/:/lib/aarch64-linux-gnu/:/usr/lib/aarch64-linux-gnu/ {Node バイナリのパス}
【手順9】 Node.js 動作確認
node -v
# 実行例:
# v20.9.0
さいごに
無事に最新の Node.js 20.9.0 が動作するようになりました!
GLIBC のライブラリバージョン不足によるエラーは、基本的にはこの手順で解決可能です。
もちろん、OS のアップグレードが一番推奨されますが、旧バージョンの OS を使わないといけない場合などでは、このように非対応でも入れるしかありません。