Nodeをダウングレードせずに「`GLIBC_2.28′ not found」を解決したお話

こんにちは、七宮さん (@shichinomiya_s) です。

今回は、Linux 環境で Node.js 20.9.0 (LTS) を使おうとしたところ、「GLIBC_2.28 not found」に遭遇しました。
今回の記事はその解消プロセスを備忘録としてまとめました。
一般的には Node.js のダウングレードが推奨されますが、事情により最新版を使わざるを得ない場合があると思います。今回はそういうパターン用のです。

エラー発生の背景

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.25GLIBC_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 を使わないといけない場合などでは、このように非対応でも入れるしかありません。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です