いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.135 / 読者数:1323名

こんばんは、うすだです。

新年度に入ってから少し経ちましたが、みなさまのお仕事の状態などは、 いかがでしょうか。順調でしょうか。
早くも修羅場に…となっていないことを、祈っております。

わたくしの場合は、いろいろテンパっていたお仕事が、 なぜかほぼ終焉をむかえてくださり、 新しい仕事をいくつか始めることができております。

その中のうちのひとつは、コテコテの組込みな OS のポーティングです。
いままでの Linux 的なお仕事とは違うため、 新鮮な気持ちでとりかかることができています。

同じ仕事をずっと続けていますと、やりがいがあっても、 やはりどこかでマンネリを感じてくるように思います。
そんなときは、新しい言語の勉強をしてみたり、 新しいお仕事に率先して手を挙げてみるなど、ちょっとした変化を作り出してみると、 マンネリを打破できるかもしれませんよ。

…なんて、自分ではやってないことを、エラそうに書いてしまいました。
でも、書いたからには、わたしも変化をひねり出してみたいと思います。

またしても微妙な決意をしたところで、今回も、はりきってまいります。

今回のお題 - Mercurial で設定ファイルを管理する

昔々その昔、設定ファイルの履歴を RCS や CVS で管理する、 というネタをご紹介したことがあります。

Vol.061 - 設定ファイルをリビジョン管理する
http://www.usupi.org/sysad/061.html
Vol.062 - 設定ファイルをもっとリビジョン管理する
http://www.usupi.org/sysad/062.html
Vol.063 - 設定ファイルをまとめてリビジョン管理する
http://www.usupi.org/sysad/063.html

もともとは、ソースコードの履歴の管理や、 大勢でよってかかって開発を行う際などに使うものですが、 これを設定ファイルの管理にも用いると、変更履歴が残りますし、 設定を戻すこともできて便利ですよ、というお話でした。

ただ、個人的には、別の場所にリポジトリを作成して、 出し入れして使うというやりかたにあまり馴染めず、積極的に使っていませんでした。

もう少しすっきりしたバージョン管理ツールはないものか、 などと常日頃思っていたのですが、最近、 Mercurial という分散バージョン管理ツールが、ちまたで話題になっていましたので、 早速使ってみました。

試してみたところ、たしかに、ウワサ通り、シンプルで使いやすいです。
いままで、ツールの導入にやや躊躇していたわたしも、重い腰を上げて、 各所で Mercurial を使うようになりました。

というわけで前置きが長くなりましたが、今回は、Mercurial を使って、 なにかの設定ファイルを管理してみたいと思います。


まずは、なにはともあれ、Mercurial の入手から始めましょう。
以下の、Mercurial のサイトから、各種が入手できます。

Mercurial
http://www.selenic.com/mercurial

ソースコードはもちろん、 主要なディストリビューションのパッケージが各種取り揃えてあります。
また、Fedora や Ubuntu などでは、上記サイトを探索せずとも、 yum や apt でもれなく入手できます。

もしパッケージがなくても、ソースコードに SPEC ファイルが含まれますので、 RPM 系のかたなら、自力でパッケージを作ることができます。
(もちろん、ソースコードをコンパイルして使うことも可能です。)

そんなこんなで、Mercurial を入手してみてください。
そして、石橋を叩いて渡る貴兄は、今回使用する hg コマンドの存在を、 which などで確認しておくとよろしいかと思います。

  % rpm -qf `which hg`

ところで、試す管理対象ですが、 今回は /etc/httpd 以下の設定ファイルにしたいと思います。基本的には、 他の設定ファイルなどでも、やりかたは同じです。お好きなところ、 お好きなものでお試しくださいませ。


さて、まずは、最初の設定を行ってみましょう。

管理対象のトップ・ディレクトリに移動して、以下のように、 hg init と実行してください。

  % cd /etc/httpd
  % hg init

すると、直下に、.hg というディレクトリが作成されます。

  % ls .hg/
  00changelog.i  requires  store/

ここに、対象となるファイルの履歴や、さまざまな情報が記録されます。
ですので、別の場所にリポジトリを作成したり、環境変数などを設定する必要は、 これっぽっちもありません。

また、使用するコマンドも、基本的には hg コマンドだけです。
hg コマンドの引数に、行いたい操作を指定します。

 

次に、管理の対象にするファイルを登録します。

hg add のあとに、管理対象となるファイルを指定します。
以下では、/etc/httpd/conf/httpd.conf と、 /etc/httpd/conf.d/*.conf を指定しています。

  % hg add conf/httpd.conf conf.d/*.conf

ディレクトリを指定した場合は、そのディレクトリ以下のファイルすべてが、 根こそぎ登録されます。
ですので、もし、/etc/httpd 以下のファイルすべてを対象にしたい場合は、 * を指定すればよいです。

  % hg add *

 

そして、初期の状態をコミットして、残しておきましょう。
コミットしますと、今の状態が .hg 以下に保存されますので、 ファイルを変更したり、うっかり消してしまっても、 コミットした状態に戻すことができます。

  % hg commit -m "initial version"

-m オプションで、メッセージを指定します。
とりあえず最初の状態ということで、initial version と指定していますが、 もっと気の利いた、素敵な言葉を指定していただいて構いません。


最初の設定が終わりましたので、ここからは、 じゃんじゃんと使い込んでみたいと思います。

まずは、なにも気にせずに、設定ファイルを編集してください。

そして、いろいろと変更して、その状態をとっておきたくなったら、 再度コミットを行います。方法は前述の通りです。

  % hg commit -m "change log format"

もし、複数のファイルを変更していて、そのうちいくつかだけをコミットしたい場合は、 コミットしたいファイルを指定します。
たとえば、conf/httpd.conf だけコミットしたければ、以下のように実行します。 ("add foo.jp" の部分は、お好きな文言に変更してください。)

  % hg commit -m "add foo.jp" conf/httpd.conf

 

いろいろこねくり回していて、どのファイルを変更したのか、 わからなくなったときには、hg diff と実行してください。 一番最近にコミットした状態と、いまの状態との差分を、 diff の形式で出力してくれます。

  % hg diff

たくさん出力されてさらに困った場合は、hg diff の後にファイルを指定しますと、 指定したファイルの差分だけを出力してくれます。

  % hg diff conf/httpd.conf

 

新たにファイルを対象としたいときは、hg add で行えます。 hg add の後にそのファイルを指定してください。
たとえば、/etc/httpd/conf.d/foo.jp.conf を追加したいときは、 以下のように実行します。

  % hg add conf.d/foo.jp.conf

ただし、これだけでは、ファイルの内容が .hg 以下に記録されません。
次にコミットしたときに、はじめて記録されます。ご注意ください。

逆に、対象から外したいときは、hg remove で行えます。
ただし、そのファイルも消えてしまいます。これまたご注意ください。

  % ls conf.d/test.conf
  conf.d/test.conf
  % hg remove conf.d/test.conf
  % ls conf.d/test.conf
  /bin/ls: conf.d/test.conf: No such file or directory

 

それから、ファイルを編集中に、コミットした状態に戻したくなったら、 hg revert で戻すことができます。

  % ls -l conf/httpd.conf
  -rw-r--r-- 1 root root 40735 Apr 12 20:54 conf/httpd.conf
  % hg revert conf/httpd.conf
  % ls -l conf/httpd.conf
  -rw-r--r-- 1 root root 42641 Mar 25 23:28 conf/httpd.conf

 

ちなみに、hg log と実行しますと、履歴の一覧が出力されます。

  % hg log

さて、これまでご紹介したコマンドは、 最新の状態との比較などを行っていたと思います。
もし、最新ではなく、過去のリビジョンとの比較などを行いたい場合は、 -r オプションを使用します。
たとえば、リビジョン 2 の log を出力するには、以下のように実行してください。

  % hg log -r 2

また、リビジョン 1 と 2 の差分を出力するには、以下のように実行してください。

  % hg diff -r 1:2

 

それから、コミットしますと、リビジョン番号が一意に決まると思いますが、 番号という無機質な数値ではなく、名前で参照できるように、 タグというものをつけることができます。
タグをつけるには、hg tag を、タグ名を指定して実行します。
たとえば、最近コミットした状態に bar という名前をつけたい場合は、 以下のように実行します。

  % hg tag bar

もちろん、過去のリビジョンにタグをつけることもできます。
たとえば、リビジョン 3 に third というタグをつけたい場合は、 以下のように実行します。

  % hg tag -r 3 third

 

ちなみに、もし操作がわからなくなったときは、hg help と実行してみてください。 コマンド一覧が出力されます。

  % hg help

また、hg help の後にコマンドを指定すると、そのコマンドの使いかたが出力されます。

  % hg help commit

もちろん、オンラインマニュアル(man hg)にも、詳細な説明が記載されています。 hg help だけで解決できないときなどに、活用してみましょう。


以上、Mercurial の使いかたを、駆け足で簡単にご紹介しました。

いきなり本番で使うのは、勇気が百倍ほど必要かと思いますので、 まずは設定ファイルをごっそりコピーして、試してみてください。

冒頭で、新しいことをやってみましょう的なことを書きましたけれども、 Mercurial を導入して活用するなんて、まさにうってつけですね。(強引)
ですので、読むだけでなく、ぜひ、トライしてみてください!

宿題の答え

前回の宿題は、

  GnuPG を使って、ログを暗号化し、メールで送信してみましょう。

でした。

まず、gpg --gen-key を実行して、鍵を作成しましょう。
手順は以下にばっちり載っていますが、 パスフレーズには何も入力しないようにして…も入力しても構いません。 (あいまいですみません。)

Vol.087 - ファイルを暗号化する
http://www.usupi.org/sysad/087.html

わたしは、以下のように、logwatcher という適当な名前を用いて、作成しました。

  % gpg --list-keys
  /root/.gnupg/pubring.gpg
  ------------------------
  pub   1024D/01234567 2008-04-10
  uid                  logwatcher (for test) <uso@uso.usupi.org>
  sub   2048g/DEADBEEF 2008-04-10

そして、公開鍵を logwatcher.pub というファイルに書き出して、 これをサーバのログが読めるひと(root)に渡します。

  % gpg -o logwatcher.pub --export logwatcher

ログの読めるひと(root)に、公開鍵を登録してもらい、 さらに鍵署名なるものをしてもらいます。
あ、その前に、ログの読めるひと(root)に鍵がなければ、作っておく必要があります。 鍵がない場合は、以下を行う前に、gpg --gen-key で作っておいてください。

  # gpg --import logwatcher.pub
  # gpg --lsign-key logwatcher

では、試しに、適当なファイル(/root/.bashrc)を暗号化してみます。

  # gpg -q -r logwatcher -o /tmp/bashrc_root -e /root/.bashrc

暗号化したファイル /tmp/bashrc_root を手元に持ってきて、 復号化できるかどうか試します。
もしサーバ上にいるなら、以下のように、直接復号化できます。
特に問題がなければ、中身がどばっと出力されるはずです。

  % gpg -d /tmp/bashrc_root
  ...(/root/.bashrc の内容)...

それでは、いつものスクリプトを、以下に差し替えてみましょう。

  #!/bin/bash
  WORKPATH=/tmp/sysad_134
  cd $WORKPATH
  while [ 1 ]; do
      allmessages=""
      while read -t 60 message; do
          allmessages="${allmessages}${message}@RET@"
      done < /var/log/authpriv
      if [ "z`echo $allmessages | grep -i fail`" != z ]; then
          TXTFILE=`mktemp syslog_auth_messages-XXXXX`
          echo $allmessages | sed 's/@RET@/\n/g' >> $TXTFILE
          gpg -q -r logwatcher -o - -ea $TXTFILE |
              /usr/bin/Mail -s 'syslog authpriv' root
          rm -f $TXTFILE
      fi
  done

前回のスクリプトと、基本的には変わりません。
ログの内容 $allmessages を $TXTFILE に出力したあと、gpg コマンドで暗号化を行い、 パイプに渡して Mail コマンドで root 宛にメールを送信しております。

だれかがログインに失敗などすると、うまくいけば、root 宛に、 以下のようなメールが届きます。

  From: root@hoge.usupi.org
  To: root@hoge.usupi.org
  Subject: syslog authpriv

  -----BEGIN PGP MESSAGE-----
  Version: GnuPG v1.4.6 (GNU/Linux)

  hQIOA0kqpmTi/jFyEAf/QSJ/boigkPasY7zfMz0ZzYYhSbYWw6BPtpH9+RlHPrkT
  8pDTgkxn5zYaXBkYc2TGYGriNqxvWu63WsOP0kXk0IdlHPXn9HKXtoQH27qSqDVT
  ...中略...
  -----END PGP MESSAGE-----

このメールをファイルに出力すれば、gpg コマンドで復号化できます。

  % gpg -d mail.txt
  ...ログの内容...

…長々と申し訳ありません。

ちなみに、わたくし、勘違いをしておりまして、暗号化を行う側は、 公開鍵を使って暗号化を行うため、 パスフレーズを入力する必要はありませんでした。
ただ、パスフレーズなしにしておくと、復号化が自動で行えます。
スクリプトなどに直接処理させる際には、便利ではないかと思います。
(もちろん、推奨されるべき行為ではありませんが…。)

今回の宿題

今回の宿題は、

  Mercurial によるバージョン管理を、最初からあらためて始めたいとき
  には、どうすればよいでしょうか?

です。

いままでの履歴を全部捨て、今の状態を起点として、最初から管理を行いたい場合、 どうすればよいでしょうか? …という意味です。

使いはじめのうちは、手順を間違えて、 最初からやり直したくなることがあるのではないかと思います。

どこの場所で管理しているのかがわかっていれば、あとはもうご想像通りです。 お試しディレクトリなどで、試してみてください。

あとがき

ここだけの話ですが、最近、めきめきと痩せることができました。

というのも、以前ご紹介した、「夢をかなえるゾウ」に書かれていた、

  食事を腹八分におさえる

を忘れないで実践しているから、ではないかと思っています。

人間、努力すればそれなりの成果をあげることができると思います。
しかし、そうそう四六時中努力しつづけられるものではないですよね。
そこでわたしは、同じく「夢をかなえるゾウ」に書かれていた、

  食べすぎると体に悪いし、眠くなるし、集中力も下がる

という理由にいたく納得して、自分の中でパラダイムシフトを起こすことで、 努力することなく、守りつづけられるようにしました。
(パラダイムシフト、はおおげさですね…すみません。)

そんなことでできるんかいな、という気もしますが、人間、 納得のできる理由があると、意外に守れてしまうようです。

また、それだけではなく、ちょっとした時間のあるときに、 腕たてふせや腹筋をしています。やせてきたな、がんばってやっているな、 という実感があると、これまた意外に楽しく行えます。
これも、実は、「その日頑張れた自分をホメる」という課題を、 無意識に行っていたようです。(最近気がつきましたので…)

…ええっと、さすがに、みなさんも是非お試しください、 と言えるような内容ではないと思います。世の中にはこんな変なひともいるんだなあ、 とでも思ってくださいまし。

 

さて、次回は、2週間後が黄金週間まっただ中になりますので、日曜日ではなく、 5月6日(火) に発行したいと思っております。
黄金週間が終わって、エンジンのかからないときにでも、読んでいただけますと、 幸いです。

 

今回も、ここまで読んでいただき、ありがとうございました。
それでは、次回は 5月6日 頃に、お会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」− 好調の波がやってきたかも…毎日栗の絵描いてます!
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本