miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

CentOS に etckeeper をインストール

etckeeper は /etc 配下のファイルを VCS で自動管理するためのプログラムで、Ubuntu なんかでは sudo apt-get install etckeeper とやるだけでインストールできるわけですが。(概要は Ubuntu Weekly Recipe:第58回 ファイルのバージョンを管理する|gihyo.jp … 技術評論社 あたりをご覧ください。)

CentOS では少し手順が必要だったのでメモです。ちなみにバージョンは CentOS 5.3。

git のインストール

etckeeper の利用には hg/git/bzr/darcs のような DVCS が必要になるわけですが、etckeeper 自体が Git で管理されているので、今回は git を入れることにします。後述しますが、git 1.5.4 以降をいれておいたほうが無難です。

CentOS/Gitのインストール - Yoshimopedia を参考に・・・まず、/etc/yum.repos.d/git.repo を作成し、(※以降すべて root で操作しています)

[git]
name=Base git repository
baseurl=http://www.kernel.org/pub/software/scm/git/RPMS/$basearch
enabled=1
gpgcheck=0

のように編集。

次に、/etc/yum.repos.d/rpmforge.repo を作成し、

[rpmforge]
name = Red Hat Enterprise $releasever - RPMforge.net - dag
mirrorlist = http://apt.sw.be/redhat/el5/en/mirrors-rpmforge
enabled = 0
gpgcheck = 0

のように編集。(※enabled = 0 にしているので yum 実行時に --enablerepo=rpmforge を付けないと有効になりません。本番環境の RHEL 上では rpmforge を勝手に使われるのを防ぐためこのような指定にしてますが、通常利用だと enabled = 1 のほうが便利だと思います。)

yum install git-1.5.6.1-1 --enablerepo=rpmforge

でインストールが完了と。

(2010-04-04 追記)

ここで「Error performing checksum」エラーになる場合は、

wget http://skvidal.fedorapeople.org/hashlib/python-hashlib-20081119-2.i386.rpm
rpm -ivh python-hashlib-20081119-2.i386.rpm

を実行してください。詳細は

に書きました。

(2010-11-10 追記)

Webtatic.com のほうが Git のバージョンも新しいし、インストールも楽そうです。

(追記ここまで)

etckeeper のソースを取得

cd /usr/local/src
git clone git://git.kitenet.net/etckeeper

こんな感じで。

etckeeper.conf の編集

cd etckeeper
vi etckeeper.conf

とやって、ファイル末尾の箇所を

# The high-level package manager that's being used.
# (apt, pacman-g2, yum etc)
HIGHLEVEL_PACKAGE_MANAGER=yum

# The low-level package manager that's being used.
# (dpkg, rpm, pacman-g2, etc)
LOWLEVEL_PACKAGE_MANAGER=rpm

このように編集します。(rpm の指定をしていますが、私は試していないのでうまくいくかわかりません。)

また、念のためファイルの先頭が

# The VCS to use.
# VCS="hg"
VCS="git"
# VCS="bzr"
# VCS="darcs"

になっていることも確認しておきます。

unclean.d/50test の編集(※git 1.5.4 未満の場合)

当初は CentOS 5.1にGitをパッケージで入れる - ひげろぐ を参考に Dag(外部リポジトリ)を使って git を入れていたんですが、この方法でインストールできるバージョンは git 1.5.2.1 と少し古くて。

この状態でも etckeeper のインストールはうまくいくんですが、yum を実行したタイミングで

etckeeper: pre transaction commit
usage: git-ls-files [-z] [-t] [-v] (--[cached|deleted|others|stage|unmerged|killed|modified])* [ --ignored ] [--exclude=<pattern>] [--exclude-from=<file>] [ --exclude-per-directory=<filename> ] [--full-name] [--abbrev] [--] [<file>]*
  Installing     : postgresql-server                                 [1/1]
etckeeper: post transaction commit
usage: git-ls-files [-z] [-t] [-v] (--[cached|deleted|others|stage|unmerged|killed|modified])* [ --ignored ] [--exclude=<pattern>] [--exclude-from=<file>] [ --exclude-per-directory=<filename> ] [--full-name] [--abbrev] [--] [<file>]*

のようなエラーになってしまいます。

原因は unclean.d/50test にある

    [ -d .git ] && [ -n "`git ls-files --modified --deleted --others --exclude-standard`" ]

この処理で。git-ls-files で 1.5.4 からのオプションである --exclude-standard を使っているのが問題のようです。

GitTips - GitWiki

note : --exclude-standard is not yet in a released version of git as of november 2007, you'll have to use --exclude-from=.gitignore --exclude-from=.git/info/exclude ... if you don't have it

とあるように、unclean.d/50test の該当行を

    [ -d .git ] && [ -n "`git ls-files --modified --deleted --others --exclude-from=.gitignore --exclude-from=.git/info/exclude`" ]

に書き換えておけば使えるはずです。

Dag から落とせる git は、gitを本家のリポジトリからCentOS5.2にインストール - 橋本幸樹の無愛想な日記 にあるように、manpage が入らなかったり不便があるようなので、kernel.org から落としたほうがいいみたいですね。

etckeeper のインストール

make install

とするだけです。ログを見ると、

[root@localhost etckeeper]# make install
mkdir -p /etc/etckeeper/ /var/cache/etckeeper/
cp -a *.d /etc/etckeeper/
install  -m 0644 -D etckeeper.conf /etc/etckeeper/etckeeper.conf
install  -D etckeeper /usr/sbin/etckeeper
install  -m 0644 -D etckeeper.8 /usr/share/man/man8/etckeeper.8
install  -m 0644 -D bash_completion /etc/bash_completion.d/etckeeper
install  -m 0644 -D yum-etckeeper.py /usr/lib/yum-plugins/etckeeper.py
install  -m 0644 -D yum-etckeeper.conf /etc/yum/pluginconf.d/etckeeper.conf
./etckeeper-bzr/__init__.py install --root= || echo "** bzr support not installed"
Traceback (most recent call last):
  File "./etckeeper-bzr/__init__.py", line 6, in ?
    import bzrlib
ImportError: No module named bzrlib
** bzr support not installed
echo "** installation successful"
** installation successful

のように妙なエラーが出ていますが、特に問題なくインストールはできているので気にしないようにしましょう。

あと、make && make install としてしまった場合も上記のエラーが出てしばらく悩んでしまいましたが、make install だけ実行する形でいいようです。

使い方

etckeeper init
etckeeper commit 'First import'

というようにリポジトリを初期化しておけば、あとは yum 実行のタイミングで勝手に etckeeper commit が呼び出されます。

自分で /etc を編集したような場合は etckeeper commit でコミットすることもできます。svn や git に慣れていると、つい -m オプションをつけてしまいそうになりますが、要らないので気をつけましょう。さもなくば、

[root@localhost etc]# git log
commit 23ae9cc8604a5fa8c76498574dd700ca54e77e94
Author: root <root@localhost.localdomain>
Date:   Tue Oct 13 00:27:47 2009 +0900

    -m

commit 35803ec9a69becdb789ac43fdab3d084f7aaf8e3
Author: root <root@localhost.localdomain>
Date:   Sun Oct 11 02:40:50 2009 +0900

    -m

commit d1e37c638cff0ff727c7789ba06f56a3427e9613
Author: root <root@localhost.localdomain>
Date:   Sat Oct 10 04:26:42 2009 +0900

    -m

こんな悲しいログが残ってしまいます。

rpm のほうは今回入れる機会がなかったので試していませんが、最悪 yum コマンドで rpm を入れる方法でなんとかなるみたいです。(参考: hook into rpm install/update/deletion of any package (for etckeeper) - Linux Archive

(2010-11-14 追記)

etckeeper の rpm 対応は今のところ list-installed と update-ignore のサブコマンドだけのようです。RPM インストール前後に自動で履歴を残したければ、上記 URL のように yum コマンドで

yum --nogpgcheck install /path/to/some/file.rpm

とすればよいです。

その他のソリューション(ついで)

上記のリンクに載ってましたが、Cft というのを使っても設定ファイルを管理できるみたいですね。

別のソリューションとして SVV というのものもあります。一般ユーザで /etc 配下の必要なファイルだけ管理したい、という向きのようです。

/etc/*などのファイルをバージョン管理するためのソフトウェアです。
/etc/*などのファイルを、root権限なしに管理できます。
ファイルのパーミッションなどの情報も保存されます。