LoginSignup
3
3

More than 5 years have passed since last update.

[Ansible] CentOS 6.4 x86_64用のcheckinstallのrpmを作成するplaybook

Posted at

playbookはこちらです。checkinstallというroleになっています。
https://github.com/hnakamur/ansible-playbooks/tree/master/roles/checkinstall

64bit 版 CentOS での CheckInstall 導入方法 - akishin999の日記を参考にさせて頂きました。ありがとうございます。

akisin999さんの記事を参考にしつつ、さらに変更しています。

  • インストール先プレフィクスは/usr/localではなく/usrとしています。
  • 設定ファイルcheckinstallrcの場所は/usr/local/libではなく/etcとしています。

使用しているcheckinstallのソースはgitレポジトリの
http://checkinstall.izto.org/checkinstall.git
の最新版です。http://asic-linux.com.mx/~izto/checkinstall/download.php にある1.6.2の後にいくつか修正が入っています。

以下はplaybookを作るときに試行錯誤した対応のメモです。

lib64問題の対応について

x86_64環境でもMakefileのLIBDIRが/usr/local/lib/になってしまうため、installwatch.soが/usr/local/lib64/ではなく/usr/local/lib/に入ってしまうという問題がありました。インストール後シンボリックリンクで凌ぐという手もあるのですが、これだとcheckinstallのrpmアンインストール時に残ってしまうのが残念です。

checkinstallのオプション引数の後にはインストールコマンドを指定できる

checkinstallのbashスクリプトを読んでみると、オプション引数の後にインストールコマンドを指定できることがわかりました。何も指定しないとmake installになります。

checkinstall
INSTALLCMD=("$@")
[ -z "${INSTALLCMD[*]}" ] && INSTALLCMD=(make install)

そこで、make install時とcheckinstallの実行時にLIBDIR=/usr/lib64と指定するとinstallwatch.soのインストール先が/usr/lib64になりました。実際には以下のようにPREFIXとCONFDIRも指定しています。

$ sudo make install PREFIX=/usr LIBDIR=/usr/lib64 CONFDIR=/etc
$ sudo /usr/sbin/checkinstall -R --nodoc --pkgversion=1.6.2.20110309 -y \
    make install PREFIX=/usr LIBDIR=/usr/lib64 CONFDIR=/etc

パスがあっているのにLD_PRELOADでエラーになる問題

上の対応で解決かと思いきや、checkinstall時に以下のエラーが出て生成されたrpmに /usr/local/lib64/installwatch.so が含まれないという問題が置きました。

ERROR: ld.so: object '/usr/local/lib64/installwatch.so' from LD_PRELOAD cannot be preloaded: ignored.

installwatch/Makefileを見てみると、既にファイルがある場合は一旦消してからinstallコマンドを実行しています。おそらくこのためにinstall実行時に/usr/local/lib64/installwatch.soが読み込めないのでエラーになっているようです。

        if [ -r $(LIBDIR)/installwatch.so ]; then \
                rm -f  $(LIBDIR)/installwatch.so; \
        fi
        install installwatch.so $(LIBDIR)

そこでLD_PRELOADでソースディレクトリのinstallwatch.soを指定してcheckinstallを実行するようにしたところ、問題は解決しました。

$ env LD_PRELOAD=/usr/local/src/checkinstall/installwatch/installwatch.so \
   sudo /usr/sbin/checkinstall -R --nodoc --pkgversion=1.6.2.20110309 -y \
    make install PREFIX=/usr LIBDIR=/usr/lib64 CONFDIR=/etc

checkinstallrcがファイルリストに含まれない問題

作成されたrpmをrpm -ql /root/rpmbuild/x86_64/RPMS/checkinstall-1.6.2.20110309-1.x86_64.rpmで調べると、checkinstallrcが含まれていませんでした。

checkinstallのソースのトップディレクトリのMakefileを見ると、checkinstallrcはソースディレクトリからinstallコマンドでインストールするのではなく、インストール後のcheckinstallrc-distをコピーして作っていました。詳しく調査はしていないですが、こういう場合はcheckinstallのウォッチ対象にならないようです。

デフォルトの設定を変更したいということもあるので、checkinstallrc-distを編集したcheckinstallrcを作ってそちらをインストールするようにしました。

checkinstallrc.filename.patch
--- checkinstall/Makefile.orig  2013-09-07 02:25:03.299661612 +0900
+++ checkinstall/Makefile 2013-09-07 02:25:22.018245380 +0900
@@ -36,23 +36,7 @@
  done

  mkdir -p $(CONFDIR)
- install -m644  checkinstallrc-dist $(CONFDIR)
- if ! [ -f $(CONFDIR)/checkinstallrc ]; then \
-   cp $(CONFDIR)/checkinstallrc-dist $(CONFDIR)/checkinstallrc; \
- else \
-   echo; \
-   echo; \
-   echo ======================================================== ;\
-   echo; \
-   echo An existing checkinstallrc file has been found. ;\
-   echo The one from this distribution can be found at: ; \
-   echo; \
-   echo -e \\t$(CONFDIR)/checkinstallrc-dist ; \
-   echo; \
-   echo; \
-   echo ======================================================== ;\
-   echo; \
- fi
+ install -m644  checkinstallrc $(CONFDIR)/checkinstallrc

 clean:
  for file in locale/checkinstall-*.mo ; do \

一旦rpmにしてしまえば、インストール時に設定ファイルがある場合は.rpmsaveの拡張子付きで保存されるはずなので、問題無いと思います。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3