weblog of key_amb

主にIT関連の技術メモ

ライブラリの ver. up 後、翌日3時にシンボルが見つからなくなる

CentOS 6.x でライブラリ rpm の ver-up をしたときの話。
依存プログラムをそのときに再起動したのだけど、翌日3時になるとなぜか共有ライブラリが見つからないのようなエラーが。

このとき、プロセスがどんなライブラリを開こうとして何が見つからなくなってるかは lsof -p $PID | grep DEL とかでわかります。
そのときは /lib64/ 以下の共有ライブラリが見つからなくなっているようでした。

しかも、そのライブラリのパスに #prelink# という怪しげな文字が。
イメージはこんな感じ:

% sudo lsof -p 1513 | head -1 && sudo lsof -p 1513 | grep DEL
COMMAND  PID USER   FD   TYPE    DEVICE SIZE/OFF      NODE NAME
:
httpd   1513 root  DEL    REG     252,1            3417639 /lib64/libdl-x.x.so
httpd   1513 root  DEL    REG     252,1            3417643 /lib64/libexpat.so.x.#prelink#.E4Timi
:

…と、ここまで書けばもうお察しの方もいるかもしれませんが、毎日3時に動いている /etc/cron.daily/prelink が悪さをしていました。
prelink が何か詳細は割愛します(というか、よくわかっていないところもある)が、プログラムが動くときに必要になる動的ライブラリのリンクを予め行って、起動を高速化してくれるようなもの、というような認識。

最初はよくわからなくて、とりあえず再起動したら直って、その後そのサーバでは起きなくなりました。
なぜかというと prelink は1回 prelink したバイナリを覚えてくれるようです。(/etc/prelink.cache とかある)
prelink -f /usr/sbin/httpd したら、またおかしくなってしまいました。

ので、そもそも prelink を無効化しておいた方がよいかも。
(勝手にバイナリ書き換えられるのとか怖い。。)

CentOS 7 からは無効化されているとか。*1