2009年10月23日金曜日

(FreeBSD) bacula-server-3.0.2 bacula-client-3.0.2 nagios-check_bacula-3.0.0_1 ・・・ 共有ライブラリがconflictして同時に使えない

baculaは、多数のコンピューターのファイルのバックアップ作業を効率的に行える、とても優れたソフトです。



そのbaculaを、version 2系から3系へアップデートしてみました。



なぜか、bacula-dirとかbacula-fdといったデーモンが知らないうちに終了していることがあって、おかしいなぁ、と思いつつ、portupgrade -f bacula-*すると直るので、まあいいかなと、だましだまし使ってました。



すると今度は、サーバー監視ツールであるnagiosから、baculaのデーモンの動作チェックができない、という通知が来て、何だと思えば、/usr/local/libexec/nagios/check_bacula が実行できなくなってました。



というわけで、portupgrade -f nagios-check_bacula-*すると、nagiosから直ったよ通知が来る。



ところが、しばらくたつと、また、baculaのデーモンが知らないうちに終了している。



・・・と、こんなことの繰り返し。



なんだこれは!?と調べてみると、まず、驚くことに、



# pkg_which /usr/local/lib/libbac.so.1
bacula-server-3.0.2 nagios-check_bacula-3.0.0_1 bacula-client-3.0.2



という感じで、同じ共有ライブラリを、3つのportsが上書きインストールしあってます。



bacula-server-*とbacula-client-*は、同じバージョンのbacula-3.0.2から作られているので、まあ同じlibbac.so.1が作られているんだろうと信じることにします。configureのオプションが異なるので、違うlibbac.so.1ができる可能性もないわけではないですが。



問題は、nagios-check_bacula-3.0.0_1でした。これ、bacula-3.0.0からビルドされたものだったんですね。



bacula-3.0.2のlibbac.so.1と、bacula-3.0.0のlibbac.so.1は、どうやら互換性がないようで、それで先のような問題を起こしているのでした。



互換性のないライブラリを、同じ名前でインストールして欲しくないなぁ・・・と思います。





解決方法としては、portsの、net-mgmt/nagios-check_bacula をさっさと更新して、sysutils/bacula-serverおよびsysutils/bacula-clientと同じ、バージョン3.0.2にすべきでしょうね。



もしできればラッキーくらいの気持ちで、nagios-check_bacula/Makefile の中の3.0.0を3.0.2にしたら、patchがあたらなくて失敗。



仕方ないので(できるだけ手抜きしたかったので[E:happy01])、別案として、共有ライブラリをやめて、スタティックリンクにしちゃえばいいんじゃない? と思いました。



configureを使っているので、nagios-check_bacula/Makefile の中で、



CONFIGURE_ARGS= --enable-client-only \
                --disable-build-dird \
                --disable-build-stored \
                --disable-nls \
                --disable-shared --enable-static



というようにして、「--disable-shared --enable-static」を追加してみました。



makeすると、ところどころエラーがでてましたが、libbacをスタティックリンクしたcheck_baculaができてました。。



cp ....../work/bacula-3.0.0/src/check_bacula/check_bacula /usr/local/libexec/nagios/check_bacula



という感じでコピーし、とりあえずOKな感じです。



# ldd /usr/local/libexec/nagios/check_bacula
/usr/local/libexec/nagios/check_bacula:
        libthr.so.3 => /lib/libthr.so.3 (0x480a8000)
        libssl.so.5 => /usr/lib/libssl.so.5 (0x480be000)
        libcrypto.so.5 => /lib/libcrypto.so.5 (0x48100000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x4825c000)
        libm.so.5 => /lib/libm.so.5 (0x48351000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x48367000)
        libc.so.7 => /lib/libc.so.7 (0x48372000)





もうちょっとMakefileを直すと、こんな感じ。



--- Makefile.org    2009-08-22 20:38:00.000000000 +0900
+++ Makefile    2009-10-22 08:51:19.000000000 +0900
@@ -20,7 +20,9 @@
CONFIGURE_ARGS=    --enable-client-only \
         --disable-build-dird \
         --disable-build-stored \
-        --disable-nls
+        --disable-nls \
+        --disable-shared \
+        --enable-static
GNU_CONFIGURE=    yes
USE_LDCONFIG=    yes



@@ -34,9 +36,7 @@



do-install:
     @${MKDIR} ${PREFIX}/libexec/nagios
-    ${INSTALL_PROGRAM} ${WRKSRC}/src/check_bacula/.libs/check_bacula \
+    ${INSTALL_PROGRAM} ${WRKSRC}/src/check_bacula/check_bacula \
         ${PREFIX}/libexec/nagios/
-    ${INSTALL_PROGRAM} ${WRKSRC}/src/lib/.libs/libbac.so.1 \
-        ${PREFIX}/lib



.include <bsd.port.post.mk>



あと、pkg-plistも書き換えて、lib/libbac.so.1を削除しておきます。



ここまでやれば、make packageもできます。



以上の変更をする前にインストールしたnagios-check_baculaをpkg_deleteすると、/usr/local/lib/libbac.so.1も削除されてしまい、今度はbaculaのコマンドが動かなくなります。その場合は、bacula-server、bacula-clientの再インストールが必要になります。



・・・なんていうことに、やってしまってから気がつきました。




なんとなくの思いつきですが、こうするといいんじゃないでしょうかね?



  • bacula-libというportsを作って、ここでlibbac.so.1をインストール


  • bacula-severt、bacula-client、nagios-check_baculaは、bacula-libへdependさせる


または、いっそのこと、portsを1つにまとめてしまうとか。



0 件のコメント:

コメントを投稿