2018年5月24日木曜日

glibcのインストールをしくじったがどうにか復旧した話

問題

CentOS 6.7にPyTorchをインストールしてインポートしようとしたところ,glibc 2.14以上が必要だと怒られた。そこでUnitasBrooks氏の助言に従ってglibcをアップグレードしたつもりが、
export LD_LIBRARY_PATH=/opt/glibc-2.14/lib
を見逃していたため、またPyTorchに怒られてしまった。
私は/opt/glibc-2.14/lib/libc.so.6を直接/lib64にコピーしたのだが、このlibc.so.6というのはシンボリックリンクであって、このような直接的なコピーはシステムを破綻させるものだった。
sudoやlsのような基本的なコマンドを呼ぼうとしてもerror while loading shared libraries: /lib64/libc.so.6: file too short というエラーが出て、ほとんど手も足も出ない状態になった。

解決

Linuxやってみる!, (6) ldconfigでライブラリパスを更新によると、linuxは
(1) 環境変数で指定されたパス
(2) /etc/ld.so.conf に記述されたパス
(3) 通常ライブラリが置かれるパス
の優先順位でライブラリを読み込んでいく。今回は(3)を壊してしまったので、(1)か(2)でうまく正しいglibcライブラリを読み込むようにさせる。それに使えるコマンドにexport (環境変数にパスを追加する) とldconfig (共有ライブラリの依存関係を更新する=(1)~(3)の順でライブラリを読み込み直す?) があり、

$export LD_LIBRARY_PATH=/opt/glibc-2.14/lib
$ldconfig

を実行することでとりあえず復旧できた。
上の操作をする前にはsucpを実行しようとすると

su: error while loading shared libraries: /lib64/libc.so.6: file too short
cp: error while loading shared libraries: /lib64/libc.so.6: file too short

と同じエラーを返していたが、上の操作の後、lscpは動くようになったが、susudoは同じエラーを返してくる。これらはスーパーユーザー権限を得るコマンドなので、ldconfigという、通常のユーザーが実行できるコマンドで何か悪さができないよう、何か特別な仕組みがあるというのは想像できることだが、sudoできないと困る。

Eliah Kagan氏のコメントが力になる気がする・・・