Linuxを利用しているなら、かならず触るであろう「/etc」フォルダ配下の設定ファイル。うっかりバックアップファイルを取り忘れて、元の状態に戻せない時も多々あるだろう。 自動的にバージョン管理することができれば…そんな願いを叶えてくれるのが、この『etckeeper』だ。

etckeeperは、指定されたディレクトリ(デフォルトでは「/etc」フォルダ配下)をバージョン管理システム(gitとか、buzzarとか)を用いてバージョニングするプログラム。そのため、利用するにはバージョン管理システムの導入が前提となっている。

今回は、CentOS 7とgitでこの『etckeeper』を導入し、/etcフォルダ配下のバージョン管理を行う。

1.インストール

まずは、前提となるバージョン管理システムとして、gitのインストールを行う。

yum install git

gitのインストール完了後、『etckeeper』のインストールを行う。

yumでインストールする

yumでインストールする場合は、epelリポジトリからインストールを行う必要がある。 事前にepelリポジトリを有効にし、以下のコマンドでインストールを行う。

yum install etckeeper --enablerepo=epel

ソースからコンパイルする

インターネットに接続出来ない環境の場合、ソースからコンパイルしてインストールする。 まずは以下のコマンドで、ソースコードをダウンロードする。

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

次に、コンパイル前に設定ファイルを編集し、CentOSで利用できるようにしてインストールをする。

cd etckeeper
sed -i -e '/^HIGHLEVEL_PACKAGE_MANAGER/c/HIGHLEVEL_PACKAGE_MANAGER=yum' -e '/^LOWLEVEL_PACKAGE_MANAGER/c/LOWLEVEL_PACKAGE_MANAGER=rpm' etckeeper.conf
make install
[root@test-centos7 etckeeper]# make install
sed -i~ "s/Version:.*/Version: $(perl -e '$_=<>;print m/\((.*?)\)/'<debian/changelog)\"/" etckeeper
rm -f etckeeper~
mkdir -p /etc/etckeeper/ /var/cache/etckeeper/
cp -R *.d /etc/etckeeper/
install  -m 0644 etckeeper.conf /etc/etckeeper/etckeeper.conf
mkdir -p /usr/bin
install  etckeeper /usr/bin/etckeeper
mkdir -p /usr/share/man/man8
install  -m 0644 etckeeper.8 /usr/share/man/man8/etckeeper.8
mkdir -p /etc/bash_completion.d
install  -m 0644 bash_completion /etc/bash_completion.d/etckeeper
mkdir -p /etc/apt/apt.conf.d
install  -m 0644 apt.conf /etc/apt/apt.conf.d/05etckeeper
mkdir -p /etc/cruft/filters-unex
install  -m 0644 cruft_filter /etc/cruft/filters-unex/etckeeper
python ./etckeeper-bzr/__init__.py install --root=  || echo "** bzr support not installed"
Traceback (most recent call last):
  File "./etckeeper-bzr/__init__.py", line 6, in
    from bzrlib.errors import BzrError
ImportError: No module named bzrlib.errors
** bzr support not installed
echo "** installation successful"
** installation successful

なんかエラー出てるけど、インストールはちゃんと出来ているので気にしない。

2.バックアップ開始

まずは、以下のコマンドを実行してgitリポジトリを作成、etckeeperによる監視を開始する。

etckeeper init
[root@test-centos7 /]# etckeeper init
Initialized empty Git repository in /etc/.git/

次に、手動で最初のコミットをしておく。 「"(ダブルクォーテーション)」で囲まれるトコは任意のコメントを入力する。

etckeeper commit "1st commit"

これで、現在の設定ファイルがコミットされた。 以後は、yumコマンドの実行前後とcron.dailyが実行されるタイミングに自動的にコミットされるようになる。

ファイルの書き換えと同時にcommitさせる場合は、inonitywaitコマンドでスクリプトを作成したり、Watcherコマンドを利用するといいだろう(いちいちcommitされるからあまりおすすめしないけど)。

3.ログの確認

バージョニングのコミットログを確認する場合はetckeeper単独でのコマンドが無いため、vcs(この場合はgit)のコマンドを利用する。 以下のように、「etckeeper vcs gitのコマンド」と実行することで、ログの確認が出来る。

etckeeper vcs log

もしくは、普通にgitコマンドで確認しても良い。

git --git-dir=/etc/.git log

簡易的なログを参照するのであれば、以下のようにコマンドを実行する。 ただコミット名を見たいときなどは、こちらの方が楽かも知れない。

etckeeper vcs reflog
[root@test-centos7 bin]# etckeeper vcs reflog
51c4144 HEAD@{0}: reset: moving to HEAD@{1}
284ae3c HEAD@{1}: reset: moving to HEAD~
51c4144 HEAD@{2}: commit: test /etc/bashrc
284ae3c HEAD@{3}: commit: saving uncommitted changes in /etc prior to yum run
b6f910f HEAD@{4}: commit: saving uncommitted changes in /etc prior to yum run
44d13d5 HEAD@{5}: commit: 2nd commit
ae8c7b2 HEAD@{6}: commit (initial): First commit

1列名がコミット名、2列目がヘッダ位置となっている。

4.差分の確認

差分確認についても、etckeeper独自のコマンドは無いので、gitのコマンドを利用する。 最新のコミットと現在の設定の差分を確認する場合は、vcsオプションを用いて以下のようにコマンドを実行する。

etckeeper vcs diff HEAD

特定のコミット同士の差分を確認する場合は、以下のようにコマンドを実行する。 なお、コミット名はログの「commit」の箇所に記述されているものが該当する。

etckeeper vcs diff コミット名1 コミット名2

5.ファイルの変更を元に戻す

ファイルの変更を戻すのもetckeeper独自の仕組みはない(またかよ)ので、vcsでgitのコマンドを呼び出す。 以下のようにコマンドを実行する。

etckeeper vcs checkout コミット名 切り戻しするファイル

これで設定ファイルの変更を戻す事が可能だ。

うーん…正直、これだったら最初からgit使った方が早いような気も…cronのとことかスクリプト組んで置いときゃいいだけだし… まぁ、いちいち「--git-dir」でディレクトリ指定しなくてもいいのはありがたいと思うんだけど…