サーバー状況表示(mrtg,snmp)

1.はじめに

サーバーを無人で24時間稼働させると何かと心配ですね、ここでは外部からでも監視できる
SNMPとMRTGを利用してサーバーの状況を外部から監視できるようにします。
監視する項目は
・ネットワークトラフィック(WAN,LAN)
・HDD使用量
・CPUパワー
・RAM使用量
・CPU温度
・FAN回転数
・HDD温度
です。

2.SNMP

まずインストールする
# cd /usr/ports/net-mgmt/net-snmp
# make install clean

インストールしたら次に設定します。
/usr/local/share/snmp/snmpd.conf を編集する
# localというグループにlocalhostの割り当て
com2sec local localhost private
# localnetworkというグループに192.168.1.1を割り当て
com2sec localnetwork 192.168.1.1 public

# localというグループに読み込み権限を与える
group MyROGroup v1 local
group MyROGroup v2c local
group MyROGroup usm local
# localnetworkというグループに読み込み権限を与える
group MyROGroup v1 localnetwork
group MyROGroup v2c localnetwork
group MyROGroup usm localnetwork

# incl/excl subtree mask
view all included .1 80

# context sec.model sec.level match read write notif
access MyROGroup "" any noauth exact all none none

syslocation freeBSD router
syscontact root
proc mountd
proc ntalkd 4
proc sendmail 10 1
exec echotest /bin/echo hello world

# マウントされているHDDを全て書く
disk /
disk /data
load 12 14 14
SNMPはセキュリティーがあまいプロトコルですので、SNMP自身で書き込み権限は誰にも与えない方が
よろしいと思います。また読み込みもサーバーからのみにしておきます。

起動時に立ち上げるように設定します
/etc/rc.conf
snmpd_enable="YES"
を追記します

設定が終了したらデーモンを走らせて見ましょう!
# /usr/local/etc/rc.d/snmpd start

次に動いているかコマンドラインで確認します。
# snmpwalk -v1 -c private localhost tcp
これで何かじゃらじゃら出て来たらまずは成功です。
もしもうまくいかないときやデーモンが落ちたりしたときは/var/log/snmpd.logを見てみましょう。なんとなく原因がわかる?でしょう

3.MRTG

まずはいつもどおりインストールします。
# /usr/ports/net-mgmt/mrtg
# make install clean

次に設定ですがここがかなりやっかいです。
cfgmakerというcfgを自動生成してくれるものがありますが、結局修正を入れないと
使い物にならないので以下を参照して自分で作りましょう!
試して見たいという方はコマンドラインから以下のコマンドで作成する事が可能です。
# /usr/local/bin/cfgmaker public@192.168.1.1>> /usr/local/share/mrtg/mrtg.cfg

/usr/local/share/mrtg/mrtg.cfg を編集する
# データを作るディレクトリーを指定します。通常Apacheで公開するディレクトリーになりますね
WorkDir: /usr/home/hogehoge/public_html/mrtg

# 表示を日本語にします
Language: euc-jp

# snmpdのタイムアウト時間を変更します
# 後で出て来るmbmonがタイムアウトしていたのでのばしました
SnmpOptions: timeout => 5
      
# WAN側の設定
# この1というのはifconfigで監視するネットワークインターフェースの出て来た上から数えた番号
# PPPoEの場合はtun0出有る事に注意
# [ ] 内は出来上がるファイル名です
Target[wan]: 7:private@localhost:
# PPPoEの場合はtun0にすること
# PPPoEの場合はIPは書かない
SetEnv[wan]: MRTG_INT_IP="192.168.1.1" MRTG_INT_DESCR="xl0"
# 最大値を指定(バイト/s)
MaxBytes[wan]: 12500000
# 生成されるhtmlのタイトルです
Title[wan]: Traffic Analysis for 1 -- sv-miya.dyndns.org
# 生成されるhtmlのTOPにかかれる文です
PageTop[wan]: <H1>Traffic Analysis for 1 -- sv-miya.dyndns.org</H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>sv-miya.dyndns.org in freeBSD router</TD></TR>
   <TR><TD>Maintainer:</TD> <TD>root</TD></TR>
   <TR><TD>Description:</TD><TD>tun0</TD></TR>
   <TR><TD>ifType:</TD>     <TD>ethernetCsmacd (6)</TD></TR>
   <TR><TD>ifName:</TD>     <TD>3COM 3c905C-TX onboard</TD></TR>
   <TR><TD>Max Speed:</TD>  <TD>12.5 MBytes/s (100Mbps)</TD></TR>
 </TABLE>
# オプションです
Options[wan]: noinfo, growright

# LAN側の設定
Target[lan]: 2:private@localhost:
SetEnv[lan]: MRTG_INT_IP="192.168.1.1" MRTG_INT_DESCR="fxp0"
MaxBytes[lan]: 12500000
Title[lan]: Traffic Analysis for 2 -- sv-miya.dyndns.org
PageTop[lan]: <H1>Traffic Analysis for 2 -- sv-miya.dyndns.org</H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>sv-miya.dyndns.org in freeBSD router</TD></TR>
   <TR><TD>Maintainer:</TD> <TD>root</TD></TR>
   <TR><TD>Description:</TD><TD>fxp0  </TD></TR>
   <TR><TD>ifType:</TD>     <TD>ethernetCsmacd (6)</TD></TR>
   <TR><TD>ifName:</TD>     <TD>Intel(R) Ether Express PRO/100+</TD></TR>
   <TR><TD>Max Speed:</TD>  <TD>12.5 MBytes/s (100Mbps)</TD></TR>
   <TR><TD>Ip:</TD> <TD>192.168.1.1</TD></TR>
 </TABLE>
Options[lan]: noinfo, growright

# 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:private@localhost:
MaxBytes[cpu]: 100
Title[cpu]: CPU Load Avalage -- sv-miya.dyndns.org
PageTop[cpu]: <H1>CPU Load Avalage -- sv-miya.dyndns.org </H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>sv-miya.dyndns.org in freeBSD router</TD></TR>
   <TR><TD>Maintainer:</TD> <TD>root</TD></TR>
   <TR><TD>CPU type:</TD><TD>PentiumV  </TD></TR>
   <TR><TD>Clock:</TD>     <TD>1GHz</TD></TR>
   <TR><TD>FSB:</TD>     <TD>133MHz</TD></TR>
 </TABLE>
Options[cpu]: nopercent, gauge, absolute, withzeroes, noinfo, growright
YLegend[cpu]: CPU Load Av.(%)
ShortLegend[cpu]: percent
Legend1[cpu]: 5 min CPU Load Avalage使用率
Legend2[cpu]: 15 min CPU Load Avalage使用率
LegendI[cpu]: 5min
LegendO[cpu]: 15min

# RAM空き容量
Target[mem]: 1.3.6.1.4.1.2021.4.6.0&1.3.6.1.4.1.2021.4.4.0:private@localhost:
MaxBytes1[mem]: 262144
MaxBytes2[mem]: 1048576
Title[mem]: Free space Memory -- sv-miya.dyndns.org
PageTop[mem]: <H1>Free space Memory -- sv-miya.dyndns.org </H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>sv-miya.dyndns.org in freeBSD router</TD></TR>
   <TR><TD>Maintainer:</TD> <TD>root</TD></TR>
   <TR><TD>CPU type:</TD><TD>PentiumV  </TD></TR>
   <TR><TD>Clock:</TD>     <TD>1GHz</TD></TR>
   <TR><TD>FSB:</TD>     <TD>133MHz</TD></TR>
   <TR><TD>Memory type:</TD>     <TD>SD-RAM PC-133 CL2</TD></TR>
   <TR><TD>Memory SIZE:</TD>     <TD>Real:256MB Swap:1024MB</TD></TR>
 </TABLE>
Options[mem]: nopercent, gauge, absolute, noinfo, growright
YLegend[mem]: Free space Mem(Byts)
ShortLegend[mem]: Bytes
kMG[mem]: k,M,G,T
Legend1[mem]: Real Memory空き容量
Legend2[mem]: Swap Memory空き容量
LegendI[mem]: Real
LegendO[mem]: Swap

# HDD使用量
# 2021.9.1.9.* の部分はsnmpd.confでHDDのマウントを指定した上から数えた番号になります
Target[disk]: 1.3.6.1.4.1.2021.9.1.9.1&1.3.6.1.4.1.2021.9.1.9.2:private@localhost:
MaxBytes[disk]: 100
Title[disk]: Disk space -- sv-miya.dyndns.org
PageTop[disk]: <H1>Disk space -- sv-miya.dyndns.org </H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>sv-miya.dyndns.org in freeBSD router</TD></TR>
   <TR><TD>Maintainer:</TD> <TD>root</TD></TR>
   <TR><TD>HDD type(ad1):</TD><TD>IBM 120GXP IC35L120AVVA07 UA-100</TD></TR>
   <TR><TD>Interface:</TD>     <TD>Intel 815E</TD></TR>
   <TR><TD>HDD type(da0):</TD><TD>Maxtor D540X-4K MX-4K080H4 x4  UA-100</TD></TR>
   <TR><TD>Interface:</TD>     <TD>Adaptec RAID Card 2400A RAID-0</TD></TR>
 </TABLE>
Options[disk]: nopercent, gauge, absolute, withzeroes, noinfo, growright
YLegend[disk]: Used Disk (%)
ShortLegend[disk]: percent
Legend1[disk]: ad1 Disk 使用量
Legend2[disk]: da0 Disk 使用量
LegendI[disk]: [ad1] LegendO[disk]: [da0]

出来上がったら動かして見ましょう。
コマンドラインから
# /usr/local/bin/mrtg /usr/local/share/mrtg/mrtg.cfg
と打ち込めばWorkDirで設定したディレクトリーにファイルが出来ます。
最初はログファイルが無いのでエラーしますが3回くらい実行すればエラーは無くなるはずです。
問題無ければcronに5分ごとに実行するように設定すれば終了です。

ここまでで、それぞれのHPは自動作成されますが、これらをまとめたindexページが欲しくなりますね。
まず自動生成できますので作って見ます。コマンドラインから
# /usr/local/bin/indexmaker --output=/usr/home/hogehoge/public_html/mrtg/index.html --columns=1
で生成されるので、あとはこれを自分で編集しましょう。

それぞれの詳しい説明がないとつらいので参照HPを紹介します。
・SNMPの番号に対する項目などインストールも含めて親切な説明が書かれています。
http://www.zdnet.co.jp/help/howto/linux/0007master/06/
・MRTGのオプションなど参照になるMTRG本家サイトです。
http://www.mrtg.jp/doc/

4.CPU温度&FAN回転数モニター

夏場を考えるとやはりCPU温度などもモニターしたくなりますね!
Linuxですとカーネルに組み込むlm_sensorといういいものがあるのですが、FreeBSDでは動かないようです。
仕方ないので清水様作成の「mbmon」というツールを使用します。
但し、これは断り無く容赦せずにモニターCHIPなどにアクセスするので最悪はシステム停止する可能性が
ありますので、ご了承下さい。(私は今のところ大丈夫のようですが...)

運良くxmbmon無しのmbmonだけのportsが有りました
次にいつものように解凍します。
# cd /usr/ports/sysutils/mbmon
# make install clean
オプションですが
SMB enable smb(4) support
のみで、私はSMB経由なはずなのになぜかONするとモニター出来ず
OFFだとモニター出来ました。
駄目な方は試して見てください。
2度目以降は
make config
で設定できます

対応しているハードは解凍したディレクトリーに説明が有るのでそちらをご覧ください。

それでは動かして見ましょう
# /usr/local/bin/mbmon -d
で確認して下さい。
だめですと、ハードが対応していないと思いますのであきらめましょうm(_ _)m
うまくいかない人は、00readmej.txtを読んで下さい。

うまくいったら温度を見て見ます
# /usr/local/bin/mbmon -T 4 -i -u -n -c 1
これで温度らしき数字が出たら成功です。
詳しいオプションはreadmeを参照下さい。

MRTGに追加します。
/usr/local/share/mrtg/mrtg.cfgに追加
Target[cputemp]: `/usr/local/bin/mbmon -T 4 -i -u -n -c 1`
MaxBytes[cputemp]: 80
Title[cputemp]: CPU temperature -- hogehoge.dyndns.org
PageTop[cputemp]: <H1>CPU temperature -- hogehoge.dyndns.org</H1>
 <TABLE>
  <TR><TD>System:</TD> <TD>hogehoge.dyndns.org in freeBSD router</TD></TR>
  <TR><TD>Maintainer:</TD> <TD>root</TD></TR>
  <TR><TD>CPU:</TD><TD>PentiumV 1000MHz</TD></TR>
  <TR><TD>Chipset:</TD><TD>Intel 815E</TD></TR>
  <TR><TD>Mother Board:</TD><TD>ASUS CUSL2-M</TD></TR>
  <TR><TD>Monitor Chip:</TD><TD>AS99127F</TD></TR>
 </TABLE>
Options[cputemp]: nopercent, gauge, absolute, withzeroes, noinfo, growright
YLegend[cputemp]: centigrade
ShortLegend[cputemp]: [℃]
Legend1[cputemp]: CPU 温度
Legend2[cputemp]: MB 温度
LegendI[cputemp]: &nbsp;CPU:
LegendO[cputemp]: &nbsp;MB:

Target[fan]: `/usr/local/bin/mbmon -F 4 -u -n -c 1`
MaxBytes[fan]: 5000
Title[fan]: FAN Speed -- hogehoge.dyndns.org
PageTop[fan]: <H1>FAN Speed -- hogehoge.dyndns.org</H1>
 <TABLE>
  <TR><TD>System:</TD> <TD>hogehoge.dyndns.org in freeBSD router</TD></TR>
  <TR><TD>Maintainer:</TD> <TD>root</TD></TR>
  <TR><TD>CPU:</TD><TD>PentiumV 1000MHz</TD></TR>
  <TR><TD>Chipset:</TD><TD>Intel 815E</TD></TR>
  <TR><TD>Mother Board:</TD><TD>ASUS CUSL2-M</TD></TR>
  <TR><TD>Monitor Chip:</TD><TD>AS99127F</TD></TR>
 </TABLE>
Options[fan]: nopercent, gauge, absolute, withzeroes, noinfo, growright
YLegend[fan]: rpm
ShortLegend[fan]: [rpm]
Legend1[fan]: CPU FAN 回転数
Legend2[fan]: 電源 FAN 回転数
LegendI[fan]: &nbsp;CPU:
LegendO[fan]: &nbsp;Power:
mbmonのオプションはソースを解凍したディレクトリーに説明ファイルが有りますので
そちらを参照下さい。

5.HDD温度モニター

FreeBSD5.2以降の場合、HDD温度をモニターする事ができるようになりました
HDD寿命を伸ばすには温度を下げたい所ですが、夏場にどれくらいになるかがわかれば
どの程度対策すればいいかが分かると思いますので、是非モニターしましょう
使用するソフトはsmartmontoolsです
まずはインストール
# cd /usr/ports/sysutils/smartmontools
# make install clean
特に設定はありませんがSMARTのアクセスを許可しないといけません
最近のMBで有ればBIOSでS.M.A.R.T.をONしたままにできるので、それで設定してしまうのが楽でしょう

状況を見るには
# /usr/local/sbin/smartctl -a /dev/ad0
これでじゃらじゃら出て来ます
この中で194番のところに温度が出て来ます
その下に温度範囲が出ていますのでこの温度範囲を越えないように熱対策しましょう
また、エラーセクターなどもありますので、こちらもモニターして見てもいいかもしれません
196〜199あたりですね

そしてこれをMRTGに出す為にシェルを組みます
/usr/home/hogehoge/hdd_temp.sh
#!/bin/sh
/usr/local/sbin/smartctl -a /dev/ad0 | grep Temp | awk '{if($1 == "194") print $10;}'
/usr/local/sbin/smartctl -a /dev/ad1 | grep Temp | awk '{if($1 == "194") print $10;}'
そしてこのシェルを動作させますとad0とad1の温度だけが出て来ます、あとはこれをmrtg.cfgに入れればOKです
mbmonの真似をすればOKですので、ここでは省略して1行目だけ
Target[cputemp]: `/usr/home/hogehoge/hdd_temp.sh`

6.コマンド系をsnmpにする

4と5のTargetをコマンドで入れていますがせっかくなのでsnmpで対応して見ます
snmpd.confのexecに入れる事によりmrtgからsnmpの番号で呼び出す事ができます

/usr/local/share/snmp/snmpd.conf
exec hddtemp0 /usr/local/etc/hddtemp 0
exec hddtemp1 /usr/local/etc/hddtemp 1
exec cputemp /usr/local/etc/cputemp
exec mbtemp /usr/local/etc/mbtemp
exec cpufan /usr/local/etc/cpufan
exec psfan /usr/local/etc/psfan
それぞれのシェルは

/usr/local/etc/hddtemp
#!/bin/sh
DEV=/dev/ad$1
/usr/local/sbin/smartctl -a ${DEV} | grep Temp | awk '{if($1 == "194") print $10;}'
引数の$1に対応してadの後ろに番号を入れてシェルを1個にしています
その中からTempの有る行だけをgrepで抜き取りawkで温度だけを表示するようにしています

/usr/local/etc/cputemp
#!/bin/sh
/usr/local/bin/mbmon -T 2 -i -c 1
番号などは各自のMBに合わせて下さい
mbtempも同様です
fanは-Tを-FにしてそれぞれのMBに合わせて作れば終了です

私はついでにUPS系もいろいろ作りました
たとえばAPCのCS500ですがAPCUPSDを使用して
/usr/local/etc/ups_load
#!/bin/sh
/sbin/apcaccess status | awk '/^LOADPCT/ {print int($3)}'
こんな感じで負荷が取得できます

そしてこれらをsnmpでどういう番号か調べます
# snmpwalk -v1 -c private localhost .1.3.6.1.4.1.2021.8.1.2
とやればこんな感じで出て来ます
UCD-SNMP-MIB::extNames.1 = STRING: ups_load
UCD-SNMP-MIB::extNames.2 = STRING: hddtemp0
UCD-SNMP-MIB::extNames.3 = STRING: ups_cap
UCD-SNMP-MIB::extNames.4 = STRING: hddtemp1
UCD-SNMP-MIB::extNames.5 = STRING: cputemp
UCD-SNMP-MIB::extNames.6 = STRING: mbtemp
UCD-SNMP-MIB::extNames.7 = STRING: cpufan
UCD-SNMP-MIB::extNames.8 = STRING: psfan
この名前はsnmpd.confでexecの次に付けた名前です
なぜか書いた順番とはめちゃくちゃになりますので、execを追加したり削除した時は必ずチェックしましょう

それでは実際にmrtg.cfgへはこう書きます
Target[fan]: 1.3.6.1.4.1.2021.8.1.101.7&1.3.6.1.4.1.2021.8.1.101.8:private@localhost:
ここではCPUとMBのファンをグラフする場合です
数値を帰すのは101になり、その後の番号がsnmpwalkで調べた番号になります
これで全部snmpで帰す事ができタイムアウトも長くできるので反応が遅いmbmonなどでもエラーせずにすみます。

7.ワーニングをメールで送る

ただモニターしていただけでは不具合が起きた時に見ていなければ気がつきません
そこで、閾値を超えたらメールで内容を送る事により早急に把握できるので設定してみます。
まずはメールを送るperl文を作成します
ワーニングが起こった時と、解除されたとき用です

mail_warning.pl
#!/usr/bin/perl

$to = $ENV{'EMAIL'};
$from = "mrtg\@hogehoge.dyndns.org";
$subject = "[ Warning ]  $ARGV[0] on $ENV{'HOST'}";

open(MAIL,"|/usr/local/bin/nkf -j | /usr/sbin/sendmail -t -f $from");

print MAIL "From: $from\n";
print MAIL "To: $to\n";
print MAIL "Subject: $subject\n\n";

print MAIL `date` . "$ARGV[0] が閾値 を超えました。\n";

print MAIL "------------------------------------------------- \n";
print MAIL "  閾値     : $ARGV[1] \n";
print MAIL "  現在の値 : $ARGV[2] \n";
print MAIL "------------------------------------------------- \n\n";

print MAIL "$ENV{'URL'} \n";

foreach(@ARGV){
    print MAIL $_;
}

close(MAIL);

次に解除されたときのメール

mail_recovery.pl
#!/usr/bin/perl

$to = $ENV{'EMAIL'};
$from = "mrtg\@hogehoge.dyndns.org";
$subject = "[ Recovery ]  $ARGV[0] on $ENV{'HOST'}";

open(MAIL,"|/usr/local/bin/nkf -j | /usr/sbin/sendmail -t -f $from");

print MAIL "From: $from\n";
print MAIL "To: $to\n";
print MAIL "Subject: $subject\n\n";

print MAIL `date` . "$ARGV[0] が正常値に戻りました。\n";

print MAIL "------------------------------------------------- \n";
print MAIL "  閾値     : $ARGV[1] \n";
print MAIL "  現在の値 : $ARGV[2] \n";
print MAIL "------------------------------------------------- \n\n";

print MAIL "$ENV{'URL'} \n";
close(MAIL);

それぞれに実行権限を与えておくのを忘れないように

それではmrtgの設定ですが、mrtg.cfgに追記します

/usr/local/share/mrtg/mrtg.cfg
# テンポラリーデータを書いておく場所を指定する
ThreshDir: /usr/local/www/data/mrtg/threshdir
# ディレクトリーを作成し書き込み権限を与えておくのを忘れないように

# ワーニングが発生した時に実行する、場所は上記perl文を置いた場所に
ThreshProgI[_]: /usr/local/mail_warning.pl
ThreshProgO[_]: /usr/local/mail_warning.pl

# ワーニング解除した時に実行する
ThreshProgOKI[_]: /usr/local/mail_recovery.pl
ThreshProgOKO[_]: /usr/local/mail_recovery.pl

# たとえば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:private@localhost:
# たとえばこの場合ですと5分平均で199%、15分平均で100%超えたら
ThreshMaxO[cpu]: 100
ThreshMaxI[cpu]: 199
# メールの送り先
SetEnv[cpu]: EMAIL="hogehoge@hogehoge.dyndns.org"
# このワーニングが該当するURL
URL="http://hogehoge.dyndns.org/mrtg/cpu.html"
MaxBytes[cpu]: 200
# 以下省略・・・
と、それぞれの項目で設定できます
HDDの温度、HDD容量、UPSの容量などなど
お好きなように設定してください。