起こったこと What happened
Cent OS6 にyumでNode.js をインストールしようとしたら、
依存関係エラーが出て、入らなかったので、
試行錯誤したら、危うく全データを失うところだった。
なんとか幸運にも回避できたので、メモ。
GLIBC の依存関係
$ yum install nodejs
--> Finished Dependency Resolution
Error: Package: 2:nodejs-12.2.0-1nodesource.x86_64 (nodesource)
Requires: libc.so.6(GLIBC_2.17)(64bit)
libc.so.6 のバーションが違うらしい。
試行錯誤していたら、
以下ln コマンドの後、以降(ほぼ全ての)コマンド操作ができなくなってしまった。
$ ln -sf /lib64/libc-2.17.so /lib64/libc.so.6
$ ls
ls: relocation error: /lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference
ほぼ全てのコマンド
で。
(この状態で、ログアウトしアクセスを失うと、もはやOS再インストールしかないよう。)
$ curl
Segmentation fault (core dumped)
(core dumped) 詰んだ?
どうやら、ほとんどのコマンドが /lib64/libc.so.6 に依存しているようであり、
マシン環境に合わないものにSymbolic link がすり替わってしまったため。
/lib64/libc-2.17.so
に対応する GIBC_2.17 がない
コンパイルして入れればよさそうだ
$ strings /lib64/libc.so.6 | grep GLIBC
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_PRIVATE
解決法 Solution
とりあえず、緊急なので
もし元のファイル(ここでは/lib64/libc-2.12.so
) があるなら
以下のようにして戻せる。
(LD_PRELOAD="/lib64/libc-2.12.so"
指定の後にコマンド実行)
LD_PRELOAD="/lib64/libc-2.12.so" ln -sf /lib64/libc-2.12.so /lib64/libc.so.6 #-f で上書きforce
例えば (ログインセッション中でなら)
$ export LD_PRELOAD="/lib64/libc-2.12.so"
$ ls
hoge boo bar ..
たまたま、(幸運にも)解決方法を見つけたからよいけど、
もし見つけられなかったら、全データを消すことになっていた。
同じような誰かに役立てば幸いだ。
Note: Never logout/restart kernel!
It will not launch again then.
It seems Symlink of GlibC is wrong.
I hope this will help :)
GLIBC_2.17 をCentOS6 にコンパイルする
方法があったので
やってみる
$ wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm
$ wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm
$ wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm
$ wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm
$ sudo rpm -Uvh glibc-2.17-55.el6.x86_64.rpm \
glibc-common-2.17-55.el6.x86_64.rpm \
glibc-devel-2.17-55.el6.x86_64.rpm \
glibc-headers-2.17-55.el6.x86_64.rpm --force --nodeps # force する
$ strings /lib64/libc.so.6 | grep GLIBC
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_PRIVATE
# GLIBC_2.13 以降増えた
$ LD_PRELOAD="/lib64/libc-2.17.so" ls # 問題なく動くよう
hoge
$ ln -sf /lib64/libc-2.17.so /lib64/libc.so.6 # 新しく入れたのにsymlink貼り替え
# 念の為、いくつかterminal でログインしてsession確保した状態で
動いた
結局
node.js については、
ソースコードからcompileすれば、使えた。 node.jsは、NVM 経由でインストールが手軽。
NVM install
https://tecadmin.net/install-nodejs-with-nvm/
$ rm -f /etc/yum.repos.d/nodesource-el* # 最新のrpmが入っている場合、消す。
$ curl -sL https://rpm.nodesource.com/setup_7.x | bash -
$ yum install nodejs
$ node --version
v10.15.3
追記
CentOS6 とか古いOS だとyum update
で勝手に /lib64/libc.so.6
更新されて
この現象が起きるもよう
注意。
参考