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 件のコメント:
コメントを投稿