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 ありがとうございます


Ryosuke Iwanaga

Software engineer / Anime / NFL / Father. Posts are my own, not endorsed by any org.