Ikeda->Weblog();

Ikedaの徒然雑記。

[TIPS] CentOS 6.2 64bitにcheckinstallをインストールする

| 0件のコメント

[TIPS] 6.2 64bitにcheckinstallをインストールするさー、また3ヶ月が経過してましたね。。いかんなぁ(-ω-;;)

ということで久々のエントリは「」ネタです。

今回、サーバ6台を同時にセットアップしなければならなくなり「checkinstall」というツールを試してみたんですが、残念ながらそのままでは上手く動いてくれませんでした。その対応をメモ的にご紹介しますね。

checkinstallとは

RHELやFedora、CentOS等でソフトウェアをインストールする時に重宝するのがRPMと呼ばれる「パッケージ」です。それぞれのOSや環境に合わせてソフトウェアのコンフィギュレーションやパッチ当てが行われており、かつソフトウェア同士の依存関係も管理されているためコマンド(ほぼ)一発で欲しいソフトウェアをセットアップすることができます。

RPMパッケージはメンテナと呼ばれる作者が適宜アップデートを行なっており、インストール済みソフトウェアのアップデートもコマンド一発。楽ちんです^^

ただ、「俺はこういうconfigureオプションでインストールしたいんだ!」「最新版のRPMがまだ出てなーいっ!」という場合には「tarball」と呼ばれるアーカイブから手動でコンパイル・インストールすることが多々あります。確かに最新版を追えますし細かい設定も思いのままなんですが、こうなるとバージョン管理が面倒です。それに、複数のサーバに同じ設定でセットアップしたい、なんて時でも基本的に全てのサーバで同じ作業を行う必要があります。

この「tarball」からRPMを作る方法ももちろんあるんですが、SPECファイルというものを書かなければいけなかったり、なかなか面倒。

そんな時に活躍するのがこの「checkinstall」コマンドです。そう、tarballからRPMパッケージをほぼ勝手に作ってくれる優れ物です!


だが、動かぬ!

作成したパッケージをrpm -iでインストールした後に -ql しても

 /usr
/usr/doc
/usr/doc/checkinstall
/usr/doc/checkinstall/BUGS
/usr/doc/checkinstall/COPYING
/usr/doc/checkinstall/CREDITS
/usr/doc/checkinstall/Changelog
/usr/doc/checkinstall/FAQ
/usr/doc/checkinstall/INSTALL
/usr/doc/checkinstall/README
/usr/doc/checkinstall/RELNOTES
/usr/doc/checkinstall/TODO

 

いやそれドキュメントだけじゃん・・・・orz
これじゃRPMパッケージ化しても意味がありません。

ということで、僕が行った手順をざっくりご紹介。

まずはそのまま

checkinstallのインストールについてはあちこちに素晴らしいエントリがたくさんありますのでざっくり割愛しますが、「オフィシャルサイトからtarballを落としてきて」→「展開して」→「make ; make install」ですね。

が。。。。コンパイルできません。
こちらを参考にさせて頂き、本家のgitリポジトリから最新版をcloneしてきました。

で、だいたい次に「インストールしたcheckinstallでcheckinstallそのもののRPMパッケージを作成」するんですが、ここでなぜか上手く行かないんです。
正確には、RPMパッケージは生成されるんですが、その中身にドキュメント類しか無いんです。最初はそういうものかと思いましたが(笑)
また、生成中に「”installwatch.so”がロードできねぇYO!」(意訳)というエラーメッセージがモリモリ出ています。

よーく見てみよう

通常 checkinstall コマンドは /usr/local/sbin/ にインストールされますが、make install した際のログを見ると”checkinstallrc” なるファイルを /usr/local/lib/checkinstall ディレクトリにインストールしています。実はこれがcheckinstallコマンドの設定ファイルだったりします。

早速これを見てみると、

21
22 # Location of the makepkg program. "makepak" is the default, and is
23 # included with checkinstall. If you want to use Slackware's native "makepkg"
24 # then set this to "makepkg"
25
26 MAKEPKG=/sbin/makepkg
27

 

てな部分がありました。

難しいことはよくわかりませんが、makepkg なるコマンドが /sbin にある、という設定ですね。しかしながら、CentOSにはそんなコマンドは存在していません。コメントを見ると「Slackwareのmakepkgを使いたい場合はこれをセットしろ」ってあります。いやこれCentOSだし。

ってことで、

25
26 MAKEPKG=
27



 

消しちゃいました。テヘペロ

続いてinstallwatch.soの問題。checkinstallをインストールすると、/usr/local/bin に installwatch コマンド、/usr/local/lib に installwatch.so ライブラリがインストールされます。同名のコマンドが一番怪しい、、ということで中を覗いてみると(言い忘れましたがcheckinstallもinstallwatchコマンドもシェルスクリプトだったりします)

323 if [ "$LD_PRELOAD" ]; then
324     LD_PRELOAD="$LIBDIR/installwatch.so:$LD_PRELOAD"
325 else
326     LD_PRELOAD="$LIBDIR/installwatch.so"
327 fi
328 export LD_PRELOAD

 

ありました。

リンカに先読みしておくべきライブラリを指示する環境変数LD_PRELOADに、$LIBDIR/installwatch.so が指定されています。ということは、このLIBDIR変数が間違っているんじゃないかと当たりをつけてみます。そーするとファイルの先頭付近に

6 PREFIX=${PREFIX:-/usr/local}
7
~~~略~~~
16
17 LIBDIR=$DESTDIR$PREFIX/lib
18 LIB64_PLATFORM=false
19 case `uname -m` in
20     x86_64|ppc64|s390x)
21         LIB64_PLATFORM=true
22         ;;
23 esac
24 if test -d $PREFIX/lib64 && test "$LIB64_PLATFORM" = "true" ; then
25         LIBDIR=$PREFIX/lib64
26 else
27         LIBDIR=$PREFIX/lib
28 fi


あ。


このサーバ、CentOS6.2 64bit でした。

ということは、19・20行目のcaseにヒットして、LIB64_PLATFORMと判定されますね。その後、LIB64_PLATFORMであればLIBDIRは”$PREFIX/lib64″、つまり「/usr/local/lib64」と設定されます。んで、先程のLD_PRELOAD・・・・そんなとこにはライブラリ無いってば。

ここを書き換えてもいいんですが、インストールするたびに書き換えるのも面倒ですしミスの元です。

ということで、そもそものインストール先を変えてしまいましょう。

git clone したソースファイル群の中に、installwatch ディレクトリがあります。ここが先程のinstallwatch/installwatch.soを生成するディレクトリですね。この中のMakefileの中、14行目が修正ポイントです。

12
13 BINDIR=$(PREFIX)/bin
14 LIBDIR=$(PREFIX)/lib
15

 

これを

12
13 BINDIR=$(PREFIX)/bin
14 LIBDIR=$(PREFIX)/lib64
15

 

こうしてやります。でもって、おもむろに make install。今度はきちんと/usr/local/lib64/installwatch.soが出来上がりました。誤った場所(/usr/local/lib)にあるinstallwatch.soは削除しちゃいましょう^^)b

これできちんと checkinstall-x.x.x-1.el6.x86_64.rpm が出来上がりました。一度 rpm -e checkinstall してから、改めて rpm -ivh checkinstall-x.x.x-1.el6.x86_64.rpm でインストール、rpm -ql checkinstallすると。。。

 /usr
/usr/doc
/usr/doc/checkinstall
/usr/doc/checkinstall/BUGS
/usr/doc/checkinstall/COPYING
/usr/doc/checkinstall/CREDITS
/usr/doc/checkinstall/Changelog
/usr/doc/checkinstall/FAQ
/usr/doc/checkinstall/INSTALL
/usr/doc/checkinstall/README
/usr/doc/checkinstall/RELNOTES
/usr/doc/checkinstall/TODO
/usr/local
/usr/local/bin
/usr/local/bin/installwatch
/usr/local/lib
/usr/local/lib/checkinstall
/usr/local/lib/checkinstall/checkinstallrc-dist
/usr/local/lib/checkinstall/locale
/usr/local/lib/checkinstall/locale/de
/usr/local/lib/checkinstall/locale/de/LC_MESSAGES
/usr/local/lib/checkinstall/locale/de/LC_MESSAGES/checkinstall.mo
/usr/local/lib/checkinstall/locale/es
/usr/local/lib/checkinstall/locale/es/LC_MESSAGES
/usr/local/lib/checkinstall/locale/es/LC_MESSAGES/checkinstall.mo
/usr/local/lib/checkinstall/locale/id
/usr/local/lib/checkinstall/locale/id/LC_MESSAGES
/usr/local/lib/checkinstall/locale/id/LC_MESSAGES/checkinstall.mo
/usr/local/lib/checkinstall/locale/it
/usr/local/lib/checkinstall/locale/it/LC_MESSAGES
/usr/local/lib/checkinstall/locale/it/LC_MESSAGES/checkinstall.mo
/usr/local/lib/checkinstall/locale/ja
/usr/local/lib/checkinstall/locale/ja/LC_MESSAGES
/usr/local/lib/checkinstall/locale/ja/LC_MESSAGES/checkinstall.mo
/usr/local/lib/checkinstall/locale/no
/usr/local/lib/checkinstall/locale/no/LC_MESSAGES
/usr/local/lib/checkinstall/locale/no/LC_MESSAGES/checkinstall.mo
/usr/local/lib/checkinstall/locale/pt_BR
/usr/local/lib/checkinstall/locale/pt_BR/LC_MESSAGES
/usr/local/lib/checkinstall/locale/pt_BR/LC_MESSAGES/checkinstall.mo
/usr/local/lib/checkinstall/locale/ru
/usr/local/lib/checkinstall/locale/ru/LC_MESSAGES
/usr/local/lib/checkinstall/locale/ru/LC_MESSAGES/checkinstall.mo
/usr/local/lib/checkinstall/locale/zh_CN
/usr/local/lib/checkinstall/locale/zh_CN/LC_MESSAGES
/usr/local/lib/checkinstall/locale/zh_CN/LC_MESSAGES/checkinstall.mo
/usr/local/lib64
/usr/local/lib64/installwatch.so
/usr/local/sbin
/usr/local/sbin/checkinstall
/usr/local/sbin/makepak

 
 
きた━━━━(゚∀゚)━━━━!!

ということで、CentOSに限らず64bitマシンにcheckinstallコマンドをインストールする際はお気をつけあれ。

コメントを残す