アカベコマイリ

HEAR NOTHING SEE NOTHING SAY NOTHING

さくらのVPS を改めて使いはじめる 8 - checkinstall

さくらのVPS(v3) 2GB プランへの環境構築メモ 8。今回は checkinstall について書く。

checkinstall とは?

CheckInstall はソフトウェアのソースから RPM パッケージなどを生成できる非常に便利なツール。

RPM パッケージはプログラムの配布形式でソフトウェア本体や構成情報、セットアップ用スクリプトなどが格納されている。いわばインストーラのようなものである。

よく Linux 関連のソフトウェアでソースから makemake install するものがあるけれど、この方法でインストールした場合は管理が非常に面倒である。例えば Makefile に uninstall が定義されていないときれいに削除するのが難しい。また新バージョンを make install で上書きしたら旧バージョンの余計なファイルが残っていて不具合が...ということもある。

RPM ならこのようなメンテナンス上の問題は起きにくい。これまでのシリーズで利用してきた yum も管理対象は RPM である。今後このシリーズでソースからインストールするタイプのソフトウェアが必要になったら checkinstall で RPM 化して管理する予定。

というわけで今回は chekcinstall を利用するための方法について書く。

インストール

checkinstall 公式サイトから入手した最新ソースをコンパイルするとエラーになる。原因を調べていたら以下の記事を見つけた。

git リポジトリ上の最新ソースなら問題は修正されているそうなのでそちらから取得する。場所はユーザー HOME 直下としておく。

$ cd
$ git clone http://checkinstall.izto.org/checkinstall.git
Initialized empty Git repository in /home/XXXX/checkinstall/.git/

前述のサイトを参考にファイルを修正する。checkinstall のディレクトリ内に移動して Makefile を vi で開く。

$ cd checkinstall
$ vi Makefile

パスを以下のように修正して保存。

# $Id: Makefile,v 1.6.2.1 2008/11/09 07:48:18 izto Exp $

# Where to install.
PREFIX=/usr/local
BINDIR=$(PREFIX)/sbin
LCDIR=$(PREFIX)/lib/checkinstall/locale
CONFDIR=$(PREFIX)

次は checkinstallrc-distvi で開く。

$ vi checkinstallrc-dist

EXCLUDE/selinux を指定して保存。

# Comma delimited list of files/directories to be ignored
EXCLUDE="/selinux"

最後の修正。installwatch ディレクトリの Makefile を vi で開く。

$ cd installwatch
$ vi Makefile

LIBDIR に指定されたパスの liblib64 に変更して保存。

# End of configurable part

VERSION=0.7.0beta7

BINDIR=$(PREFIX)/bin
LIBDIR=$(PREFIX)/lib64

すべての変更が完了したら checkinstall ディレクトリに戻り git diff でリポジトリとの差分を確認する。

$ cd ..
$ git diff

おそらく以下のように出力されるはず。

diff --git a/Makefile b/Makefile
index 2e28adc..b6d217c 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
PREFIX=/usr/local
BINDIR=$(PREFIX)/sbin
LCDIR=$(PREFIX)/lib/checkinstall/locale
-CONFDIR=$(PREFIX)/lib/checkinstall
+CONFDIR=$(PREFIX)

all:
        for file in locale/checkinstall-*.po ; do \
diff --git a/checkinstallrc-dist b/checkinstallrc-dist
index d4feb4e..fe5f56e 100644
--- a/checkinstallrc-dist
+++ b/checkinstallrc-dist
@@ -117,7 +117,7 @@ RESET_UIDS=0
NEW_SLACK=1

# Comma delimited list of files/directories to be ignored
-EXCLUDE=""
+EXCLUDE="/selinux"

# Accept default values for all questions?
ACCEPT_DEFAULT=0
diff --git a/installwatch/Makefile b/installwatch/Makefile
index ae34fc1..fb41eb3 100644
--- a/installwatch/Makefile
+++ b/installwatch/Makefile
@@ -11,7 +11,7 @@ PREFIX=/usr/local
VERSION=0.7.0beta7

BINDIR=$(PREFIX)/bin
-LIBDIR=$(PREFIX)/lib
+LIBDIR=$(PREFIX)/lib64

コンパイルとインストールの準備が整ったのでさっそく実行。

$ make
$ sudo make install

これでインストール完了。試しにバージョンを表示してみる。

$ checkinstall -v

checkinstall 1.6.3, Copyright 2010 Felipe Eduardo Sanchez Diaz Duran
           このソフトウェアはGNU GPLの下でリリースしています。

Copyright (c) 2010 Felipe Eduardo Sanchez Diaz Duran <izto@asic-linux.com.mx>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the version 2 of the GNU General Public License
    as published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

ばっちり。

checkinstall のパスについて

checkinstall/usr/local/sbin にインストールされている。しかし CentOS 6.2 上でコマンドを sudo 経由で実行すると環境変数 PATH を引き継がないため command not found になってしまう。

これは一般ユーザーに依存するものを安易に管理者権限で実行させないためのセキュリティを考慮した措置。これに従うならばコマンドは/usr/local/sbin/checkinstall のようにフルパス指定で実行する。

リスクを承知したうえでパス入力を省きたいなら .bash_profile に設定を追加してパスを通す。

$ cd
$ vi .bash_profile

sudo に対して環境変数 PATH を継承させる設定は、以下のようになる。

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin
PATH=$PATH:/sbin
PATH=$PATH:/usr/sbin
PATH=$PATH:/usr/local/sbin

export PATH
alias sudo='sudo env PATH=$PATH'

最終行が sudo の設定。.user_profile の変更を反映させる場合は再ログインするか以下のコマンドを実行する。

$ source ~/.bash_profile

パスを通すことの是非について。sudo の実行ユーザーを限定しているのと sudo コマンドを経由している時点でリスクの高い処理をしていることを強く意識させる効果があるから個人的にはありだと考えている。

以降の説明は /usr/local/bin にパスが通っているものとして書く。パスを通していないなら sudo checkinstall を実行している箇所は sudo /usr/local/sbin/checkinstall に置き換えること。

RPM 化

管理を楽にするため checkinstall 自身を RPM 化しておく。これは checkinstall の動作テストも兼ねている。まずは RPM 化するためのビルドを実行するディレクトリを作成。これを用意しておかないと RPM 化に失敗する。

$ sudo mkdir -p /root/rpmbuild/SOURCES

checkinstall をコンパイルしたディレクトリに移動して checkinstall コマンドを実行する。パッケージ方式をきかれたら R を入力して Enter キーを押す。

$ cd
$ cd checkinstall
$ sudo checkinstall

checkinstall 1.6.3, Copyright 2010 Felipe Eduardo Sanchez Diaz Duran
           このソフトウェアはGNU GPLの下でリリースしています。

使用するパッケージ方式を選んでください。
Slackwareなら[S], RPMなら[R], Debianなら[D]を入力R

少し待つ RPM パッケージの構成確認となる。特に変更する必要もないので Enter キーを押して続行。

**************************************
**** RPM package creation selected ***
**************************************

このパッケージは以下の内容で構成されます:

1 -  Summary: [ CheckInstall installations tracker, version 1.6.2 ]
2 -  Name:    [ checkinstall ]
3 -  Version: [ 20120430 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ Applications/System ]
7 -  Architecture: [ x86_64 ]
8 -  Source location: [ checkinstall ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ checkinstall ]

変更するものの番号を入力してください。Enterで続行します:

しばらく待つと RPM 化される。

Installing with make install...

... 中略

**********************************************************************

Done. The new package has been saved to

/root/rpmbuild/RPMS/x86_64/checkinstall-20120430-1.x86_64.rpm
You can install it in your system anytime using:

      rpm -i checkinstall-20120430-1.x86_64.rpm

**********************************************************************

作成された RPM のパスは /root/rpmbuild/RPMS/x86_64/checkinstall-20120430-1.x86_64.rpm となった。Version を変更しなかった場合は作成日時がファイル名にバージョンとして入るようだ。RPM 化された checkinstall をインストールする。

$ sudo rpm -ivh /root/rpmbuild/RPMS/x86_64/checkinstall-20120430-1.x86_64.rpm
準備中...                ########################################### [100%]
   1:checkinstall           ########################################### [100%]

インストール情報を確認。

$ sudo rpm -qi checkinstall
Name        : checkinstall                 Relocations: (not relocatable)
Version     : 20120430                          Vendor: (none)
Release     : 1                             Build Date: 2012年04月30日 01時10分54秒
Install Date: 2012年04月30日 01時24分01秒      Build Host: akabeko.me
Group       : Applications/System           Source RPM: checkinstall-20120430-1.src.rpm
Size        : 453050                           License: GPL
Signature   : (none)
Packager    : checkinstall-1.6.3
Summary     : CheckInstall installations tracker, version 1.6.2
Description :
CheckInstall installations tracker, version 1.6.2

CheckInstall  keeps  track of all the files created  or
modified  by your installation  script  ("make install"
"make install_modules",  "setup",   etc),   builds    a
standard   binary   package and  installs  it  in  your
system giving you the ability to uninstall it with your
distribution's  standard package management  utilities.

ばっちり。

...今回はここまで。次回は Ruby と Redmine 関連のセットアップについて書く。

Comments from WordPress

  • m.i m.i 2012-07-15T06:18:22Z

    いつもこちら参考にさせて頂いております。

    ちょっと気になったので書いておきます。

    checkinstall のパスについて

    の説明内容にて

    .user_profile

    とありますが、こちらは

    .bash_profile

    の誤りかと思いました。

  • akabeko akabeko 2012-07-16T06:25:10Z

    m.i さん、ありがとうございます。ご指摘のとおり .userprofile は誤りなので、.bashprofile に修正しておきました。