rpmで入れたバイナリのchecksumが一致しないと思ったらprelinkのせいだった
同じ rpm で複数のサーバに入れたあるバイナリをふとした経緯でサーバ間で一致してるか確認したくなって、md5sum
で確認してたら、どうも差分がある。しかし、rpm のバージョンを見ても一致してる。教えて Twitter!ってしたら@_hito_さんから。
@riywo 犯人はprelinkだったりしませんか。
— hito (@_hito_) August 10, 2012
以前 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 ありがとうございます