技林TOP > 自宅サーバ構築メモ > MRTG/SNMPについて


≫MRTGとは

このページは、自宅サーバ(Vine Linux2.5) に MRTG をインストールした時のメモです。

MRTG とは The Multi Router Traffic Grapher の頭文字を取ったもので、ネットワークの負荷を監視してその状態を示すグラフィックイメージを含むHTMLページを生成してくれるソフトです。PerlとCで記述されており、UNIXとWindows NTで動作します。

例えばこんな感じのページを自動的に作成してくれて、サーバの状態をチェックするのが楽しみになります。

さて、MRTGを知る前に、SNMPというものを知らなければなりません。SNMPとは、RFC1157で定義されているネットワークに接続された機器類をネットワーク経由で監視するためのプロトコルです。

SNMPに対応したネットワーク機器は、SNMPエージェントと呼ばれ、例えばそれがルータなら、自身のステータス状況や流れるデータ量を記録しています。そして、その記録したデータにアクセスするためのインターフェースをSNMPマネージャと言います。

SNMPマネージャからSNMPエージェントに対しては、情報を取得したり設定したりするという関係が成り立ちます。その情報を取得するSNMPマネージャの代表格が、このページの主役 MRTG なのです。

もとい、MRTGは、その機能の一部としてSNMPマネージャの機能があるに過ぎず、本来は数値の統計を取ってグラフ化するためのソフトですが、サーバのトラフィックやCPUやメモリやディスクの状態をチェックするにはうってつけのソフトなのです。

というわけで、MRTGを使ってサーバの各種データをグラフ化してみましょう。

≫レシピ

ucd-snmpSNMPエージェントソフト
Perl入ってないことは無いと思いますが、バージョンは5.005以降
zlibデータ圧縮ライブラリ
libpngPNG形式の画像用ライブラリ。zlibと依存関係にあり。
GD画像生成用ライブラリ。libpngと依存関係にあり。
MRTG本体です。


MRTG をインストールして実行するには、MRTG以外にも上の表にある様なものを揃えなければなりません。
Vine Linux2.5の場合はucd-snmpとMRTG本体以外は既に入っていました。

インストールされているかどうかは、
#>rpm -aq | grep PACKAGE_NAME
とか。

表の上から順番にインストールして設定していきます。
特に zlib より下は上下で依存関係のあるライブラリなので順番に入れないとダメです。

≫ucd-snmp のインストール

ダイ@管理人の場合は、ucd-snmp は apt で入れました。

#>apt-get update
#>apt-get install ucd-snmp

確かデフォルトの設定では apt-get しようとしても、ucd-snmp が見つからなかったので /etc/apt/sources.list を編集した記憶があります。と言っても、コメントアウトしていた所を有効に直してダウンロード先を増やしただけですが。

ucd-snmp をサイトからダウンロードして入れようとする場合は、net-snmp というのがあって紛らわしいと思いますが、この net-snmp は ucd-snmp の後継らしいです。どちらも SNMPエージェント統合環境ソフトですが、ひとまずここは ucd-snmp を入れましょう。
え?! net-snmp の方が新しくていいんじゃないの? と思うあなたはするどい。しかし、この世界では最新が最適とは限らず、ちょっと古い、いわゆる「枯れた」ソフトの方が良い場合が多いのです。なので、ucd-snmp にしときます。バージョンアップは後から出来る!まずは動くことが大切。

さて、ucd-snmp の設定ファイルは /etc/snmp/snmpd.conf です。

デフォルトで用意されているものはバックアップを取って、以下の様にしましょう。

# snmpd.conf

# コミュニティ名とセキュリティ名の対応を設定
# private や public は任意でユニークな名称に変更する
#       sec.name  source          community
com2sec local     localhost       private
com2sec mynetwork 192.168.0.0/24  public

# グループごとに権限を設定するための設定
view all    included  .1             80

# view に対して権限を許可する設定
access MyROGroup "" any noauth exact all none none
access MyRWGroup "" any noauth exact all all none

# セキュリティ名とグループ名を対応させます
group MyROGroup v1 mynetwork
group MyROGroup v2c mynetwork
group MyROGroup usm mynetwork

# システム情報
syslocation SERVER_LOCATION_INFO
syscontact root 

# パーティションの空きを調べる
#disk / 10000
#disk /var 10000

# httpd のプロセスをチェックする
#proc httpd


SNMP の起動は

#>snmpd

です。
以下のようでも大丈夫。

#>service snmpd start

動いているかの確認は

#>ps -ax | grep snmpd

止める時は

#>service snmpd stop

再起動した時に SNMPを動かし忘れないように設定しときましょう。[*] snmpd

#>ntsysv

もしくは /etc/rc.d/ に起動用の設定をしましょう。

≫Perl/zlib/libpng/GD のインストール

ダイ@管理人の場合(Vine Linux2.5)、全部最初から入っていました。

運が良いと、apt や rpm で一撃インストール完了の余裕しゃくしゃくだと思います。しかし、バージョンを選んでインストールしたい場合もあると思うので、以下。

■Perl
Perl のインストール方法はさすがに割愛。初心者がPerlの入ってないLinux環境をどうやって手に入れるのか、いや、手に入れない(反語)。

■zlib
#>tar xvzf zlib-X.X.X.tar.gz
#>cd zlib-X.X.X
zlib-X.X.X#>./configure
zlib-X.X.X#>make
zlib-X.X.X#>make test
*** zlib test OK ***
zlib-X.X.X#>make install


■libpng
#>tar xvzf libpng-X.X.X.tar.gz
#>cd libpng-X.X.X
libpng-X.X.X#>cp ./scripts/makefile.mips ./Makefile
libpng-X.X.X#>make test
libpng passes test
libpng-X.X.X#>make install


■GD
#>tar xvf gdX.X.X.tar.gz
#>cd gdX.X.X
gdX.X.X#>make
gdX.X.X#>make install


インストールが済めば特に設定などありません。

≫MRTG のインストール

いよいよメインです。

MRTG はソースからコンパイルしてインストールします。

#>tar xvfz mrtg-X.X.X.tar.gz
#>cd mrtg-X.X.X
mrtg-X.X.X#>./configure
mrtg-X.X.X#>make
mrtg-X.X.X#>make install


以上。
デフォルトだと、/usr/local/mrtg-2/ にインストールされます。

≫MRTG の設定

MRTG の設定ファイルを作成します。

色んな所に、cfgmaker を使って、設定ファイルを作る方法が載っていると思いますが、別に使わなければならないという決まりはありません。なので、ここではツールを使わずにやります(´ν`)

では、適当に、/usr/local/mrtg-2/cfg/ というディレクトリでも作成して、その中に mrtg.cfg というファイルを作ります(普通のテキストファイルですが、文字コードはEUC、改行コードはLFに)。

中身は以下。

# mrtg.cfg

# 閲覧用のHTMLや画像データを出力するディレクトリ
# http で閲覧できる場所に設定
WorkDir: /home/httpd/html/mrtg

# MRTG のアイコンを置いておくディレクトリ
# 以下の記述で /home/httpd/html/mrtg/icons/ の意味
IconDir: /mrtg/icons/

# 日本語化する設定
Language: eucjp

# Traffic_Analysis
Target[Traffic_Analysis]: 5:public@192.168.0.2:
SetEnv[Traffic_Analysis]: MRTG_INT_IP="192.168.0.2" MRTG_INT_DESCR="eth0"
MaxBytes[Traffic_Analysis]: 1250000
YLegend[Traffic_Analysis]: Traffic
Options[Traffic_Analysis]: growright
Title[Traffic_Analysis]: Traffic Analysis
PageTop[Traffic_Analysis]: Traffic Analysis


それぞれの意味は後述します。

ただし、
Target[Traffic_Analysis]: 5:public@192.168.0.2:
行の public@192.168.0.2 は環境に合わせて変更して下さい。
public は snmpd.conf で設定内容に合わせて。192.168.0.2 はサーバのアドレスです。

つづいて、アイコン画像をコピーします。
(しなきゃしないで支障はありませんが、表示がかっこ悪いのでちゃんとやった方がいいです)

#>mkdir -p /home/httpd/html/mrtg/icons
#>cp /usr/local/mrtg-2/lib/mrtg2/*.png /home/httpd/html/mrtg/icons/

では、MRTG を実行してみましょう。

#>/usr/local/mrtg-2/bin/mrtg /usr/local/mrtg-2/cfg/mrtg.cfg

/usr/local/mrtg-2/bin/mrtg はデフォルトの場合で、インストール先が違えばパスが変わります。
/usr/local/mrtg-2/cfg/mrtg.cfg は先ほど作成した mrtg.cfg です。作成した場所が違えばパスが変わります。

なんかずらずらっと表示が出たと思います。5つぐらい。

Rateup WARNING: なんてのが含まれていて、ドキッとするかもしれませんが、正常な動作です。

もしここで、

gd-png: fatal libpng error: Invalid filter type specified
gd-png error: setjmp returns error condition


と出たら、libpng が古いとかバージョンの違いによるエラーなので、ライブラリなどを入れ替える必要があります。

で、もしもエラーメッセージ通り libpng を替えてもダメだぞ! という場合は、MRTG 自体のバージョンを替えてみましょう。
さあ、ここでバージョンを下げることによってうまくいったら、SNMP の段でなぜ最新の net-snmp にしなかったか、「枯れた」ものが良しと言ったのはなぜかが理解できる思います。

さて、無事 Rateup WARNING: エラーが出たら、再び MRTG を実行します。

#>/usr/local/mrtg-2/bin/mrtg /usr/local/mrtg-2/cfg/mrtg.cfg

一度目よりは数が減るものの、まだエラーが出ます。しかし、これも正常の動作。

懲りずにもう一度実行します。

#>/usr/local/mrtg-2/bin/mrtg /usr/local/mrtg-2/cfg/mrtg.cfg

今度はエラーも何も出ずに実行できたと思います。

/home/httpd/html/mrtg/ をのぞいてみましょう。

Traffic_Analysis-day.png
Traffic_Analysis-week.png
Traffic_Analysis-month.png
Traffic_Analysis-year.png
Traffic_Analysis.html
Traffic_Analysis.log
Traffic_Analysis.old


というようなファイル群があると思います。もし、正常に作成できていなければ、設定ファイルを見直してみましょう。

では、感動の瞬間です。

ブラウザで、http://サーバのIPアドレス/mrtg/Traffic_Analysis.html を見てみましょう。

感動しましたか?

この時点ではグラフが全然進んでませんが、実行を繰り返すと出来てきます。

実行を繰り返すといっても、いちいち手動で実行するのも馬鹿げているので、cron に登録します。

#>crontab -e
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/local/mrtg-2/bin/mrtg /usr/local/mrtg-2/cfg/mrtg.cfg

以上でひと通りの設定は終了です。
1日くらい経つとグラフらしくなってくると思います。

上記設定では、サーバのトラフィック量をグラフ化していますが、他にもメモリや CPU やハードディスクや httpd のプロセス数なんかをグラフ化できます(それ以外にもまあ、なんでも出来るらしいが)。

下の解説などを参考にやってみてください。

≫mrtg.cfg の解説

mrtg.cfg ファイルは、実行時に設定ファイルを引数として渡すので、ファイル名は本当は何でもOKです(ここではわかりやすく mrtg.cfg と言ってるだけで、hoge.cfg でも何でもOK)。

例えば、トラフィック量とメモリ使用量を同時に統計出力する場合は、ひとつの mrtg.cfg ファイルに両方の設定を書きます。

中身には、 先頭位置でまず指定しなければいけないのは

WorkDir:
IconDir:
Language:

です。

設定の文法は

設定[識別子]: 設定内容

です。(ex. Target[traffic]: 5:public@192.168.0.5:)

識別子に指定した文字列でファイルが出力されます(ex.では traffic)。
複数の統計を取る場合に、識別子を指定せずに、全ての統計に対して設定内容を指定するには識別子を [_] アンダーバーにします。(ex. Options[_]: noinfo)

全ての統計に対して設定内容を指定するが、それぞれの統計で設定内容を追加する場合は、識別子に [^] を指定します。(ex. Options[^]: growright)

それぞれの設定内容を優先し、全体の設定内容を後ろに付ける場合は識別子に [$] を指定します。(ex. Options[$]: integer)

■基本設定
Target統計データの対象
MaxBytesデータがとりうる最大値
TitleWebページを出力した時の<TITLE>タグの内容
PageTopグラフの前に表示するHTMLテキスト
Optionsグラフの描画オプション


■グラフの設定
AbsMaxグラフの絶対的な最大値を指定する。このオプションを指定しない場合,取得したデータの値に応じて縦軸が適時拡大縮小される。
UnScaledデータに合わせて拡大縮小しない。
WithPeak平均値ではなく,ピーク値をとる。
Suppress日グラフ(d),週グラフ(w),月グラフ(m),年グラフ(y)どの種類のグラフを作成するのかを設定する。Suppress で指定したグラフが作成されない。例えば、Suppress[_] my とすると、月、年グラフが作成されない。
MaxBytes1データ1の最大値を設定
MaxBytes2データ2の最大値を設定
XSize作成するグラフの画像ファイルの横幅のピクセル数を指定する。20〜600まで指定できる。デフォルトは400
YSize作成するグラフの画像ファイルの縦幅のピクセル数を指定する。20以上の値を指定できる。デフォルトは100
XZoom横軸の拡大縮小率を指定
YZoom縦軸の拡大縮小率を指定
XScale横軸の拡大縮小率を指定する。画像ファイルのサイズは変更されない。
YScale縦軸の拡大縮小率を指定する。画像ファイルのサイズは変更されない。
YTics1つのグラフに4本以上の線を描画するときに設定
YTicsFactorY軸のデータにここで指定した値を乗算する
Factor取得したデータにここで指定した値を乗算する
Stepデータの描画間隔を指定する。デフォルトは300秒
Coloursグラフの描画色を設定
YLegendY軸の軸の名前(ラベル)を指定
ShortLegendY軸の軸の単位(ラベル)を指定
Legend1データ1(受信データ)のグラフ名(ラベル)を指定
Legend2データ2(送信データ)のグラフ名(ラベル)を指定
Legend3データ1(受信データ)の百分率グラフ名(ラベル)を指定
Legend4データ2(送信データ)の百分率グラフ名(ラベル)を指定
LegendIデータ1(受信データ)のラベルを指定
LegendOデータ2(送信データ)のラベルを指定
kiloキロの単位を切り替える。デフォルトは1000
kMGk(キロ),M(メガ),T(テラ)などの単位を変更
Timezoneタイムゾーンを設定
Weekformat週の表示形式を変更する
SetEnv外部プログラムを呼び出すときに設定する環境変数を指定


■HTML出力設定
PageFootWebページの一番下に表示されるHTMLテキストを指定
AddHead<HEAD>タグと<BODY>タグのあいだに指定したいHTMLテキストを指定
BodyTag<BODY>タグを変更する場合に指定
Background背景色を変更
Extension作成されるファイルの拡張子を変更


■Options で指定できる内容(Options[_]: XXXXX)
growrightグラフの横軸(時間)を左から右方向にする
bits値を8倍し、ビットとして扱う
perminute分単位のグラフを表示するときに値を60倍する
perhour時間単位のグラフを表示するときに値を3600倍する
noinfo出力するWebページにデバイス名や時刻情報を出力しない
nopercentパーセント表示しない
transparentグラフ画像の背景を透明にする
integer値を整数化する
dorelpercent百分率にしたグラフを重ねて表示する
gaugeデータの値の差をとらない
absoluteデータの値を時間で割らない
unknaszero取得できなかった部分のデータを0として扱う
withzeroes0であるデータを無視しない


■Target での指定
OID(Object IDentifier:オブジェクト識別子)ツリーを理解して設定するのも難しいので、以下に代表的なものを上げてみます(public@192.168.0.5 はsnmpd.confや環境に合わせて変更すること)。
トラフィック量Target[traffic]: 5:public@192.168.0.5:
メモリ使用量Target[memory]: 1.3.6.1.4.1.2021.4.6.0&1.3.6.1.4.1.2021.4.4.0:public@192.168.0.5
CPU負荷Target[cpu]: 1.3.6.1.4.1.2021.10.1.5.2&1.3.6.1.4.1.2021.10.1.5.3:public@192.168.0.5
Disk空き容量 *1Target[disk]: .1.3.6.1.4.1.2021.9.1.9.1&.1.3.6.1.4.1.2021.9.1.9.2:public@192.168.0.5
HTTPdプロセス数 *2Target[httpd]: .1.3.6.1.4.1.2021.2.1.5.1&.1.3.6.1.4.1.2021.2.1.4.1:public@192.168.0.5:
*1 : snmpd.conf で disk / 10000 と disk /var 10000 を有効に設定する(#を取る)
*2 : snmpd.conf で proc httpd を有効に設定する(#を取る)

≫indexページの作成

複数の統計を出力した場合、全ての統計を一覧できるインデックスページがあると便利です。

MRTG にはちゃんとインデックスページを作成するツールがあります。

/usr/local/mrtg-2/bin/indexmaker がそれです。

#>/usr/local/mrtg-2/bin/indexmaker /usr/local/mrtg-2/cfg/mrtg.cfg > /home/httpd/html/mrtg/index.html

http://サーバのIPアドレス/mrtg/

どうですか? 正しくインデックスページが表示されましたでしょうか?

indexmaker の実行時にはオプションを付けることが可能です。

/usr/local/mrtg-2/doc/mrtg2/indexmaker.html にマニュアルがありますので、読んでみましょう。英語ですが、そうたいしたオプション内容でもないので理解できると思います(だって、ダイ@管理人でも読めたのだから)。

その他のマニュアルも /usr/local/mrtg-2/doc/mrtg2/ にあります。一読してみましょう。

≫シェルと組み合わせてログファイルの監視

サーバログを監視してみましょう。どんなログでもいいんですが、せっかくなのでWebサーバ・Apacheのアクセスログとエラーログをモニタします。


仕組みというか、原理というか、MRTGは以下の4行の出力を受けてグラフを作成します。

1行目 : 値1(整数・必須)
2行目 : 値2(整数・必須)
3行目 : システムが起動してから経過した時間(uptime)
4行目 : 値の説明


というわけで、まず、この4行を返すシェルスクリプトを作成します。

#!/bin/sh

LANG=C
export LANG

ACCESSLOG=`wc -l /var/log/httpd/access_log | awk '{print $1}'`
ERRORLOG=`wc -l /var/log/httpd/error_log | awk '{print $1}'`
UPTIME=`uptime | awk '{print $3$4}' | sed -e "s/,//g"`

echo "$ERRORLOG"
echo "$ACCESSLOG"
echo "$UPTIME"
echo "AccessLog and ErrorLog"


/var/log/httpd/access_logはApacheのログファイルへのパスです。
単純にログファイルの行数を数えて出力しています。

/usr/local/mrtg-2/bin/apachelog.sh などのように設置して、パーミションを 705 にして実行してみると、4行の出力が返ってきます。

これをグラフ化するには、mrtg.cfg に設定を書きます。

# ApacheLog
Target[ApacheLog]: `/usr/local/mrtg-2/bin/apachelog.sh`
MaxBytes[ApacheLog]: 500000
YLegend[ApacheLog]: ApacheLog
Title[ApacheLog]: ApacheLog
PageTop[ApacheLog]: ApacheLog
ShortLegend[ApacheLog]: hit
LegendI[ApacheLog]: Error
LegendO[ApacheLog]: Access
Options[ApacheLog]: gauge, absolute


以上です。

詳しくは、こちらの「SNMPに頼らないでMRTGグラフを作成する」も参照してみてください。

≫参考にしたページ

(C) bayashi.net