rpmで入れたバイナリのchecksumが一致しないと思ったらprelinkのせいだった

同じrpmで複数のサーバに入れたあるバイナリをふとした経緯でサーバ間で一致してるか確認したくなって、md5sumで確認してたら、どうも差分がある。しかし、rpmのバージョンを見ても一致してる。教えてTwitter!ってしたら@_hito_さんから。

以前rubyがぶっこわれる問題で調べてたので言われた瞬間にハッとしました。

prelinkはRHEL系だと大体入ってて、cron.dailyに仕掛けられていて/etc/prelink.confとかを読んで実行されてます。

何をしてるかというと、(100%理解してるわけじゃないですが)バイナリ実行時に行われる動的リンク処理のいくつかを事前に行って、バイナリファイル自体に書きこんでしまうことによって起動速度を上げるというものだと理解してます。事前にやる必要があるので上記cronで毎日朝4:00に実行されてるわけです。

なので、ファイルのチェックサムが一致しないのも納得ですね。実際、prelink --undoで解除したらチェックサムは無事一致しました。

ちなみに、rpm -V(改竄チェック)で引っかからなかったのは以下のような理由の様です。

色々ググってもらえば分かると思いますが、prelinkは百害あって一利なし的なものになりつつありますね。実際rubyみたいにいくつかのバイナリはぶっこわれるし、なにより知らぬうちにバイナリが書き換わってるとか怖い。

サーバマシンだと特に、基本的には起動しっぱなしのプロセスが多いわけで、prelinkの恩恵はあんまりないですし、検証してパフォーマンス的な問題がなければアンインストールしちゃいたいですね。なお、cronの実行を一部ファイルだけ防ぎたいとかなら設定ファイルに書けば大丈夫です(cf. td-agent)。

バイナリファイルのサーバ間差分とか見るときには、prelinkも考慮した上でチェックしないと思わぬところでハマるよ、というわけでメモ。

hito 12-08-12 (日) 16:35

アンンストールせず、/etc/sysconfig/prelinkでPRELINKING=noしてprelink -auで元に戻しておくのがいいです。

でないと、dependencyでprelinkがまた入ったりしたときに超カオス。

riywo 12-08-19 (日) 23:31

>でないと、dependencyでprelinkがまた入ったりしたときに超カオス。
たしかにw ありがとうございます