WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

dispatch-conf の履歴から過去のファイルを復元する

先日、dispatch-conf の使用方法をご紹介しましたが、そのときは dispatch-conf が生成する履歴情報の利用方法はまったくご紹介できませんでした。本日は履歴情報から過去の設定ファイルを復元する方法を中心にして、履歴情報の利用方法をご紹介しようと思います。

dispatch-conf が履歴を残す方法には RCS を利用する方法と通常ファイルとして残す方法の 2 種類があります。ここでは、RCS を利用する方法を前提にします。RCS に馴染みがない方は(大抵そうだと思いますが^^;)、あらかじめ RCS の使用方法に目を通していただけるとよいと思います。

なお、dispatch-conf に関してはまだ資料が乏しく、以下の内容も dispatch-conf の内部を独自に解析して得た知識をもとにしています。正式なやり方というわけではありませんので、将来の更新で問題が発生する可能性は否定できません。そのあたりは自己責任ということで、ご了承ください。m(_ _)m

dispatch-conf の処理内容

dispatch-conf が管理する設定ファイルのリポジトリを操作するには、dispatch-conf がリポジトリに対して行っている処理内容を知っておいたほうがよいでしょう。

RCS リポジトリの構成

まずは RCS リポジトリの構成をご紹介します。dispatch-conf は設定ファイル "/etc/dispatch-conf.conf" の archive-dir で指定されたディレクトリ以下に必要に応じて root ファイルシステムと同じディレクトリ階層を作り、RCS ファイルを保存します。例えば、archive-dir が "/etc/config-archive" だった場合、"/etc/fstab" に対応する RCS ファイルは "/etc/config-archive/etc/fstab,v" ということになります。

dispatch-conf は、それぞれの RCS ファイルにブランチをひとつ(1.1.1 に固定)作成して設定ファイルを保存します。トランクとの使い分けは以下のようになっています。

トランク
ローカルの設定ファイルの履歴が保存されています。dispatch-conf を実行して更新が検出されるたびに、ローカルにある現在使用中の設定ファイルがチェックインされます。ユーザーが施した変更を含むファイルはここで管理されます。
1.1.1
ebuild が生成したオリジナルの(ユーザーによる変更を含まない)ファイルの履歴が保存されています。

バージョン管理システムでサードパーティーソースとのマージを管理する場合の、一般的なやり方だと思います。

処理内容

dispatch-conf が設定ファイルの更新を検出すると、以下の手順で RCS リポジトリの操作を行います。

  1. current をトランクにチェックインする。
  2. トランクとブランチ 1.1.1 の差分を new に適用した結果を merged に保存する(new は変更しない)
  3. new をブランチ 1.1.1 にチェックインする。

なお、上記の current, new, merged は以下の意味で使っています。

表記意味
current更新前の、現在使用中の設定ファイル。
newemerge によって生成された新しい設定ファイル。
merged自動マージの結果を保存する一時ファイル。

これによると、ユーザーが設定ファイルを編集した内容は (1) のタイミングでリポジトリにチェックインされることになります。それ以降に施された変更は次回の設定ファイルの更新まで自動ではチェックインされません。ということで、設定ファイルをロールバックする前に明示的に現在の状態をチェックインしておくのは良い考えです。そうしないと、ロールバックのロールバック(?)ができなくなります。

過去の設定ファイルのロールバック

それでは、履歴に存在する過去の設定ファイルを復元する方法をご紹介します。いろいろなやり方がありますし、私も RCS の扱いにそれほど慣れていないので最適な方法ではないかもしれません。一例ということでご理解ください。

ここでは、例として "/etc/fstab" をリビジョン 1.1 に戻す手順をご紹介します。説明の都合上、以下を前提とします。

  • "/etc/dispatch-conf.conf" の archive-dir が "/etc/config-archive" に設定されている。
  • 対象の設定ファイルが dispatch-conf によって最低 1 回は更新されており、RCS ファイルが生成されている。

現在の状態をチェックインする

必須ではありませんが、念のため現在の状態をチェックインしておきましょう。こうしておけば、ロールバックした結果が芳しくなかった場合に、簡単に元に戻せます。

チェックインするには、以下のようにします。

cd /etc/config-archive/etc
cp -p /etc/fstab fstab
rcs -ko -M -l fstab
ci -m'Save the current file before rolling back' fstab

ファイルをコピーしてから ci コマンドを実行しているのは、ci コマンドが元ファイルを削除したりパーミッションを変更したりするのを避けるためです。実際、dispatch-conf もこのような方法をとっています。くれぐれも、ファイルをコピーするときに間違って RCS ファイルを上書きしないように注意してください。

過去のファイルを取り出す

任意のリビジョンを指定して co コマンドを以下のように実行すれば、そのリビジョン 1.1 の "/etc/fstab" を取り出すことができます。その後、そのファイルを正規の場所にコピーします。

co -r1.1 fstab
cp fstab /etc/fstab

指定するリビジョン番号を変えれば、任意の時点での設定ファイルやカスタマイズされていないオリジナルの設定ファイルを取り出すことができます。また、日付指定でファイルを取り出すこともできます。詳細は後述の「その他の操作」をご覧ください。

なお、ロールバックした結果が芳しくなかった場合は、以下のようにリビジョンの指定を省略して実行すれば、先ほどチェックインした(最新リビジョンの)状態に戻せます。

co fstab
cp fstab /etc/fstab

ロールバックの結果をチェックインする

ロールバックした結果がうまく動いたときは、それをチェックインしておきましょう。次に dispatch-conf がファイルを更新するときに自動で行う操作ではありますが、あらかじめ保存しておくにこしたことはありません。

やり方は最初と同じで、以下のように ci コマンドを実行します。

rcs -ko -M -l fstab
ci -m'Rolled back to revision 1.1' fstab

最後の ci コマンドでは -u オプションを指定していないので、最初にコピーした "/etc/config-archive/etc/fstab" が削除されます。

その他の操作

上記以外で、利用頻度が高い操作をご紹介します。

リビジョンのログを見る

RCS ファイルにどのようなリビジョンが存在するかを確認するには、rlog コマンドでログを表示させます。例えば、"/etc/fstab" のログを表示させるなら、以下のようにします。

rlog /etc/config-archive/etc/fstab,v

もっとも、dispatch-conf がつけるコメントは固定なので、あまり参考になりませんが・・・。

日付指定でファイルを取り出す

co コマンドでファイルを取り出す際、リビジョンの変わりに日付を指定することもできます。それには -r オプションの変わりに -d オプションを使います。-d オプションを指定すると、指定された時点での最新リビジョンを取得します。

日付指定のフォーマットはいろいろありますが、日本人としては "年/月/日 時:分:秒 LT" が馴染みがあるかと思います(最後の "LT" はローカルタイムの指定です)。

例えば、2006 年 1 月 1 日 0 時 0 分 0 秒での "/etc/fstab" の最新リビジョンを取り出すには、以下のようにします。

cd /etc/config-archive/etc
co -d'2006/01/01 00:00:00 LT' fstab

差分を表示する

"/etc/fstab" とリポジトリの最新リビジョンとの差分を表示するには、以下のようにします。

rcsdiff /etc/fstab /etc/config-archive/etc/fstab,v

また、-r オプションでリビジョンを指定すれば、任意のリビジョンと現在のファイルとの差分を表示できます。

カスタマイズされていない設定ファイルを取り出す

オリジナルの設定ファイルは 1.1.1 ブランチに保存されています。その最新リビジョンの内容を取り出すには、以下のようにします。

cd /etc/config-archive/etc
co -r 1.1.1 fstab

もし過去のファイルを取り出したければ、"-r 1.1.1.1" のように取り出したいリビジョンを指定すれば OK です。指定するリビジョンは前述の rlog コマンドで確認できます。

任意のリビジョンのファイルを確認する

co コマンドに -p オプションを指定すると、指定されたリビジョンを標準出力に書き出すことができます。less コマンドなどにリダイレクトして使用するとよいでしょう。

co -p1.1 /etc/config-archive/etc/fstab,v | less

ロールバックする前にその内容を確認したい場合などに便利です。

設定ファイルを変更した際にその状態の履歴を残す

自分で設定ファイルの内容を変更したときに、その状態を履歴として残したいと思うでしょう。その場合も、ロールバックのときと同様にチェックインすれば OK です。

cd /etc/config-archive/etc
cp /etc/fstab fstab
rcs -ko -M -l fstab
ci -m'Something was changed' fstab

コメントはなるべくわかりやすく書いておいたほうが、後で困らずにすみますよ (^^;

自分で作成した設定ファイルも RCS で管理したい

Apacheバーチャルホスト の設定ファイルや BIND の正/逆引きゾーンファイルなど、自分で作った設定ファイルもまとめて RCS で管理できると便利ですね。RCS はファイル単位で個別に履歴を管理しますので、単純に所定の場所に RCS ファイルをチェックインするだけで実現できます。

例えば "/etc/bind/pri/sourcewalker.com.zone" の RCS 管理を始めたい場合は、以下のようにします。

mkdir -p /etc/config-archive/etc/bind/pri
cd /etc/config-archive/etc/bind/pri
cp -p /etc/bind/pri/sourcewalker.com.zone sourcewalker.com.zone
ci -t-'Archived config file.' -m'Initial check in' sourcewalker.com.zone

当然ながら自分で作成したファイルに対しては dispatch-conf はなにも面倒を見てくれないので、ファイルを変更した際は手動でチェックインするなど、自分で管理する必要があります。

本日は、dispatch-conf が生成する履歴の利用方法をいくつかご紹介しました。これだけ知っていれば、dispatch-conf による設定ファイルの管理はかなり自由に行えるのではないでしょうか。設定ファイルの更新は GentooLinux の管理でも厄介な作業のひとつですが、だいぶ気が楽になります。dispatch-conf を極めて、安全・確実に設定ファイルを更新しましょう!(^^)

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles