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

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

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

ももももも申し訳ございません。
1週間の猶予があったはずなのに、また遅れてしまいました。

ちなみに、書き始めたのが、本来の発行日である12月16日の23時でした。
その時点で、ネタすらはっきりしていませんでした。
それでも、朝までに発行するつもりで試行錯誤していたのですが、結局、 時間切れとなって、発行を断念してしまいました。

前職で、きちんと計画を立てて実行することの大切さを、ねっちりと教えられましたが、 理解することと実行できることの間には、大きな溝があるんじゃないかという疑念を、 あらためて強く感じました。

今年最後の発行がこのていたらくとは、非常にわたしらしいと思いつつ、 なんとか、はりきってまいりますよー。

今回のお題 - MRTG でネットワークを監視する

前回…といってももう1ヶ月ほど前になりますが…は、 SNMP で様々な情報を取得する方法を、ご紹介しました。

Vol.232 - SNMP を動かしたり使ってみたりする
http://www.usupi.org/sysad/232.html

情報を提供する側では snmpd というSNMPエージェントを動かしておき、 取得する側では snmpget コマンドで問い合わせる、 という超単純な構成で使う手順などを、さらりと説明しました。

ただ、それだけだと、あまり使い勝手がよいとは言えません。
やはり、定期的に情報を収集して、その結果をぱっと把握できることが、 必須なのではないかと思います。

というわけで、今回は、MRTG というものをご紹介したいと思います。

MRTG とは?

MTRG(The Multi Router Traffic Grapher)は、 SNMPを介してネットワークに関する情報を収集し、グラフ化してくれるツールです。

ネットワークの送受信の状況を SNMP で収集して、 結果をまとめて HTML と画像に変換してくれます。 ブラウザで直接参照してもよいですし、 WWWサーバが公開しているコンテンツに含めておけば、 外部のマシンから参照することもできます。
(後者は、公開してよいかなど十分検討した上で行ってください。)

1995年に最初のバージョンが公開されているようですので、 かなり老舗の部類に入るツールだと思います。
(わたしも、最初の会社でインストールして使った記憶があります。)

たいていのディストリビューションには、パッケージがあるようです。
いつもの以下の手順で、まずはインストールしてください。

  $ sudo apt-get install mrtg   (Debian系の場合)
  # yum install mrtg            (RedHat系の場合)

試す前に前準備が必要です

試すには、どこかにSNMPエージェントさんが必要です。
前回の本題を参考に、インストールしておいてください。

…ただ、snmpd を素のままで動かすだけでは、不十分です。
ネットワークインターフェースや、IPに関する情報を提供する必要があります。 そのため、/etc/snmp/snmpd.conf の中から、 以下のようになっている部分を探してください。
(2行目は、最後が .1.3.6.1.2.1.25.1.1 になっているかもしれません。)

view   systemonly  included   .1.3.6.1.2.1.1
view   systemonly  included   .1.3.6.1.2.1.25.1

あったら、ここに2行ほど継ぎ足して、以下のようにしてください。

view   systemonly  included   .1.3.6.1.2.1.1
view   systemonly  included   .1.3.6.1.2.1.25.1
view   systemonly  included   .1.3.6.1.2.1.2
view   systemonly  included   .1.3.6.1.2.1.4

snmptranslate -Tp を実行して眺めると、それとなく分かると思うのですが、 最初の2行で、system(1) と host(25).hrSystem(1) の情報を見せる(許可する)設定になっています。

ですが、MRTG は、interfaces(2) や ip(4) の情報も必要とします。
そのため、後半の2行を追加してあげる必要があります。

追加したら、snmpd を再起動してください。

  # service snmpd restart

また、自分以外のホストから情報を得る場合は、agentAddress の設定を変更したり、 ファイアウォールの設定を緩和したりする必要があります。
…ですが、諸般の事情により、以降では、 ローカルホストの snmpd から入手するという前提で、話を進めます。


あ、あと、一点、補足があります。

Ubuntu などの方で、snmpget コマンドでうまく情報取得できないという貴兄は、 /etc/snmp/snmp.conf に以下の行がないか、ご確認ください。

mibs :

あったら、先頭に「#」を入れてコメントアウトしてください。

#mibs :

こちらは、snmp.conf を書き換えるだけで、何かの再起動は不要です。
(snmpget などの実行の度に参照されるためです。)

まずはパッケージ標準的な使い方から

MRTGの設定ファイルは、/etc/mrtg.cfg もしくは /etc/mrtg/mrtg.cfg にあります。

この設定では、/var/www/mrtg に HTML やグラフの画像を作成します。
ですが、SNMPエージェントに関する情報が登録されていないため、 自分で設定する必要があります。エージェント毎に、以下を記述します。

  Target[名前]: ポート:コミュニティ名@ホスト
  MaxBytes[名前]: 最大バイト数
  Title[名前]: タイトル

まず、「名前」には、エージェントを特定するための名前を指定します。
他とかぶらない名前をつけましょう。 この名前がそのままHTMLのファイル名などになります。

「ポート」には、インターフェースの番号を指定します。たいていは、 1 が「lo」で、2が「eth0」になっていますので、2 を設定します。
それでは不安だという貴兄は、以下のように実行してご確認ください。

  $ snmpwalk -Ou -v 1 -c コミュニティ名 localhost \
  interfaces.ifTable.ifEntry.ifDescr
  interfaces.ifTable.ifEntry.ifDescr.1 = STRING: lo
  interfaces.ifTable.ifEntry.ifDescr.2 = STRING: eth0
  interfaces.ifTable.ifEntry.ifDescr.3 = STRING: wlan0
  interfaces.ifTable.ifEntry.ifDescr.5 = STRING: vmnet1
  interfaces.ifTable.ifEntry.ifDescr.6 = STRING: vmnet8

「コミュニティ名」には、snmpd で設定したコミュニティを指定します。
デフォルトのままであれば、「public」です。

「ホスト」には、エージェントのIPアドレスやホスト名を指定します。
今回は自分自身ですので、「localhost」です。

「最大バイト数」には、 そのインターフェースで送受信できるバイト数の最大値を指定します。 たとえば 100BASE-T であれば、

  100000000bps / 8bit = 12500000 B/s

ですので「12500000」を指定します。

「タイトル」には、出力されるHTMLのタイトルを指定します。

…以上、説明が長くなりましたが、たとえば以下のようになります。
(MaxBytes は 1000BASE-T で計算しています。)

Target[local]: 2:public@localhost
MaxBytes[local]: 125000000
Title[local]: Traffic Analysis about myself

そして、デフォルトでは、/etc/cron.d/mrtg で、 5分毎に実行されるようになっています。ただ、たとえば Ubuntu の場合、 /var/www/mrtg がないと実行されなくなっていますので、 以下のように作ってあげましょう。

  $ sudo mkdir -p /var/www/mrtg

あとは、しばらく経ってからそのページにアクセスすると、 時間や日ごとのグラフを参照できます。

file:///var/www/mrtg/local.html

うまく出てこない場合は、 cron で実行されるときにエラーが出力されて root 宛にメールが届いているはずです。root 宛のメールを見て、 原因を追求してください。

独自の場所に作ってみる

デフォルトでは /var/www/mrtg に作成されますが、それとは別に、 独自の場所に作ることもできます。

設定ファイルは、「cfgmaker」というコマンドで作成できます。
「--global」オプションで共通の設定を指定し、 「--output」オプションで出力する設定ファイル名を指定します。
そして最後に、「コミュニティ@ホスト」を引数に指定して実行します。
(他にもいろいろオプションはありますが、最低限これだけ必要です。)

たとえば、カレントディレクトリに mrtg というディレクトリを作って、 そこにHTMLファイルとグラフを置くようにしてみましょう。
設定ファイルは、別のどこか(~/mrtg.cfg)に置きます。

  $ mkdir mrtg
  $ cfgmaker --global "WorkDir: `pwd`/mrtg" --output ~/mrtg.cfg \
  public@localhost

すると、SNMPで自動的に情報を収集し、設定ファイルを作ってくれます。
ただ、Ubuntuでは、 以下のように /var/www/mrtg の設定が生きている行があります。必要ないので、 コメントアウトするか削除してください。

  WorkDir: /var/www/mrtg

そうしましたら、mrtg を実行します。
初回は、WARNING が3つほど出ますが、気にしないでください。

  $ LANG=C mrtg ~/mrtg.cfg
  2012-12-23 18:40:31, Rateup WARNING: /usr/bin/rateup could not \
  read the primary log file for localhost_2
  2012-12-23 18:40:31, Rateup WARNING: /usr/bin/rateup The backup \
  log file for localhost_2 was invalid as well
  2012-12-23 18:40:31, Rateup WARNING: /usr/bin/rateup Can't rename \
  localhost_2.log to localhost_2.old updating log file
  ERROR: writing /var/lib/mrtg/なんとか_mrtg.cfg.ok: Permission \
  denied at /usr/share/perl5/MRTG_lib.pm line 1630.

ただ、最後の行のエラーが出る場合は、 「--confcache-file」オプションで、 confcache-file というファイルが書き込めるパスを指定します。

  $ LANG=C mrtg --confcache-file `pwd`/localhost_2_mrtg.cfg ~/mrtg.cfg

独自のデータを収集する

MRTGでは、外部コマンドを起動した結果をグラフにすることもできます。

外部コマンド(あるいはスクリプトなど)では、4行の出力が必要です。
最初の2行は、入力と出力のデータです。(入出力じゃなくてもOKです。)
3行目は、そのホストの稼働時間です。
4行目は、計測対象の名前です。

さしあたって、メモリとスワップの空きをグラフにしてみましょう。
(SNMP のどこかにそんな情報がありそうですが、スルーしてください。)

外部コマンドは、こんなふうにしてみました。

#!/bin/sh
awk '/^MemFree:/ { print $2}' /proc/meminfo
awk '/^SwapFree:/ { print $2}' /proc/meminfo
snmpget -v 1 -c public localhost host.hrSystem.hrSystemUptime.0 \
	| sed 's/^.*) //'
echo "Memory and Swap Free"

これを、/some/where/meminfo.sh だとすると、 MRTG の設定ファイルには以下のように書けばよいです。

Target[mem]: `/some/where/meminfo.sh`
MaxBytes[mem]: 8388608
Title[mem]: Memory and Swap Free size

おわりに

以上、MRTGの設定手順と、簡単なカスタマイズの方法をご紹介しました。

MRTG には、超ありがたいことに、公式日本語サイトがあります。

MRTG: The Multi Router Traffic Grapher
http://www.mrtg.jp/doc/

インストールや設定手順、マニュアル、リファレンスなどの情報が、 多数あります。設定に困ったら、ぜひ探って読んでみてください。

宿題の答え

前回の宿題は、

  SNMPのパケットをダンプし、コミュニティ名が丸見えであることを確認
  してみましょう。

でした。

まず、どこかで、以下のように「tcpdump」コマンドを実行します。
ループバック・インタフェース(lo)に流れる、 ポート番号が161番(snmp)のパケットだけを出力します。

  $ sudo tcpdump -i lo -X port snmp

そして、SNMPで問い合わせてみましょう。

  $ snmpget -v 1 -c public localhost system.sysDescr.0
  SNMPv2-MIB::sysDescr.0 = STRING: Linux aaaaa 3.5.0-19-generic \
  #30-Ubuntu SMP Tue Nov 13 17:48:01 UTC 2012 x86_64

すると、以下のような結果が得られました。

  23:12:22.863394 IP localhost.44756 > localhost.snmp:  GetRequest(28) \
  system.sysDescr.0
    0x0000:  4500 0047 0000 4000 4011 3ca4 7f00 0001  E..G..@.@.<.....
    0x0010:  7f00 0001 aed4 00a1 0033 fe46 3029 0201  .........3.F0)..
    0x0020:  0004 0670 7562 6c69 63a0 1c02 040c 9635  ...public......5
    0x0030:  e902 0100 0201 0030 0e30 0c06 082b 0601  .......0.0...+..
    0x0040:  0201 0101 0005 00                        .......
  23:12:22.863570 IP localhost.snmp > localhost.44756:  GetResponse(107) \
  system.sysDescr.0="Linux aaaaa 3.5.0-19-generic #30-Ubuntu SMP Tue Nov \
  13 17:48:01 UTC 2012 x86_64"
    0x0000:  4500 0096 0000 4000 4011 3c55 7f00 0001  E.....@.@.<U....
    0x0010:  7f00 0001 00a1 aed4 0082 fe95 3078 0201  ............0x..
    0x0020:  0004 0670 7562 6c69 63a2 6b02 040c 9635  ...public.k....5
    0x0030:  e902 0100 0201 0030 5d30 5b06 082b 0601  .......0]0[..+..
    0x0040:  0201 0101 0004 4f4c 696e 7578 2074 6161  ......OLinux.aaa
    0x0050:  6161 2033 2e35 2e30 2d31 392d 6765 6e65  aa.3.5.0-19-gene
    0x0060:  7269 6320 2333 302d 5562 756e 7475 2053  ric.#30-Ubuntu.S
    0x0070:  4d50 2054 7565 204e 6f76 2031 3320 3137  MP.Tue.Nov.13.17
    0x0080:  3a34 383a 3031 2055 5443 2032 3031 3220  :48:01.UTC.2012.
    0x0090:  7838 365f 3634                           x86_64

リクエストにもレスポンスにも、 「public」という文字が含まれているのがわかります。

…も、もう少し具体的に説明します。
まず、0x0000〜0x0013 がIPヘッダ、0x0014〜0x001b がUDPヘッダです。
(詳細は、RFC791 および RFC768 をご覧ください。)

ですので、SNMPのデータは 0x001c〜 に格納されています。
で、SNMPでは「ASN.1」というややこしいデータ構造の表現を用います。

Abstract Syntax Notation One - Wikipedia
http://ja.wikipedia.org/wiki/Abstract_Syntax_Notation_One

ASN.1では、「型-長さ-値」という組で階層的にデータを表します。
たとえば、上記のリクエストのデータ(この色の部分)は、 以下のように解釈をすることができます。

  0x30(SEQUENCE) - 0x29(長さ) - 値は下記
  |
  +-0x02(INTEGER) - 0x01(長さ) - 0x00(Version - SNMPv1)
  +-0x04(OCTET STRING) - 0x06(長さ) - 0x7075626c6963("public")
  +-0xa0(GetRequest) - 0x1c(長さ) - 値は下記
    |
    +-0x02(INTEGER) - 0x04(長さ) - 0x0c9635e9(RequestID)
    +-0x02(INTEGER) - 0x01(長さ) - 0x00(ErrorStatus)
    +-0x02(INTEGER) - 0x01(長さ) - 0x00(ErrorIndex)
    +-0x30(SEQUENCE) - 0x0c(長さ) - 値は下記
      |
      +-0x06(OID) - 0x08(長さ) - 0x2b06010201010100(.1.3.6.1.2.1.1.1.0)
      +-0x05(NULL) - 0x00(長さ)

SEQUENCEは、値を束ねたものです。
OID(OBJECT ID)は、16進数の値とやや異なりますが、先頭の2つの値が、 1 x 40 + 3 = 43 = 0x2b となるそうです。

詳しくは、RFC1157 を眺めたり、検索などしてみてください。
(結構分かりにくいので、検索して理解を補った方がよいかもです。)

ちなみに、「-d」オプションをつけて snmpget コマンドを実行すると、 (UDPヘッダまでを除いた)SNMPパケットの内容をダンプしてくれます。
tcpdump が使えないなどの事情がある場合は、コレでしのいでくださいませ。

今回の宿題

今回の宿題は、

  ディスクの使用量を MRTG でグラフにしてみましょう。

です。

特にひねりはございませんが、外部コマンドを使いましょう、 とは一言も言っていないところがミソ(?)かもしれません。

あとがき

某雑誌の連載が終わり、間髪入れずに新連載が始まります。

Ubuntu が先日(といっても2ヶ月前ですが) 12.10 にバージョンアップをしましたが、新連載もそれをターゲットにします。 タイミング的にもよいと思い、HDDを購入して、 Ubuntu を新規にインストールしてみました。

ただ、そのまま日本語Remixを入れるのも芸がないと思って、 推奨の32bitではなく、64bit版を選びました。

推奨じゃないから、 なにか予想外のところに落とし穴でもあるのかな…と期待していたのですが、 いまのところは、何の問題もなく使えています。

いちおう気づいた点といえば、8GBのメモリをほぼフルに使っていること (32bitのPAEなカーネルでは、メモリに結構空きがあり、 スワップは使用されず、割とスカスカしてました)と、 32bitなバイナリが動かないこと…くらいです。

後者は、CPU自体は互換性があるはずなので、 なにかすれば動くと思っているのですが、 64bitに対する根本的な知識が不足しているため、 なにかがわからないまま今日に至っています。

余力ができたら、調べて、なんとかしたいと思います。
(…ということは、調べられないまま、年を越すだろうと思われます…。)

 

ちなみに、先週逼迫していたのは、某新連載の絵を大量に描いていたためです。 実際の記事をみると、 栗の絵がそんなに使われているようには感じられないのですが、 目を凝らすと、やや栗がいることがわかります。

1月8日発売ですので、よろしければ立ち読んでください。
…あ、雑誌名を書き忘れていました。 「日経Linux」です。

…それにしても、自分の本業がなんなのか、忘れてしまいそうです…。

 

今回も、ここまで読んでいただき、たいへんありがとうございました。
次回は、1月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/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)
http://twitter.com/kuriking/ (栗つぶやき)
http://facebook.com/kuriking3 (栗顔本)


[バックナンバーのトップへ] [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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本