サーバー状況表示(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 ntalkd 4
proc sendmail 10 1
proc httpd
exec ups_cap /root/ups_cap
exec ups_load /root/ups_load
exec hddtemp0 /root/hddtemp 0
exec cputemp0 /root/cputemp
exec upsin /root/ups_in
exec upstime /root/ups_time
exec cpuclock /root/cpuclock

# マウントされている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

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

インストールしたら下記フォルダを作成しておきます。
# cd /var/cache
# mkdir mrtg
パーミッションも設定してください。

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

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

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

# snmpdのタイムアウト時間を変更します
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 -- hogehoge.mydns.jp
# 生成されるhtmlのTOPにかかれる文です
PageTop[wan]: <H1>Traffic Analysis for 1 -- hogehoge.mydns.jp</H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>hogehoge.mydns.jp 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 -- hogehoge.mydns.jp
PageTop[lan]: <H1>Traffic Analysis for 2 -- hogehoge.mydns.jp</H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>hogehoge.mydns.jp 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]: 400 #複数コアの場合は100xCPU数にする
Title[cpu]: CPU Load Avalage -- hogehoge.mydns.jp
PageTop[cpu]: <H1>CPU Load Avalage -- hogehoge.mydns.jp </H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>hogehoge.mydns.jp 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 -- hogehoge.mydns.jp
PageTop[mem]: <H1>Free space Memory -- hogehoge.mydns.jp </H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>hogehoge.mydns.jp 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 -- hogehoge.mydns.jp
PageTop[disk]: <H1>Disk space -- hogehoge.mydns.jp </H1>
 <TABLE>
   <TR><TD>System:</TD>     <TDhogehoge.mydns.jp 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温度モニター

夏場を考えるとやはりCPU温度などもモニターしたくなりますね!
新たにcoretempが出来たのでこれを利用します。

/boot/loader.conf
coretemp_load="YES"
を追記。
もしくはカーネル生成時にMYKERNで
device coretemp
を入れてあれば不要です。

手動の場合は
# kldload coretemp
# sysctl dev.cpu | grep temperature
で起動確認できます。

CPU温度を吐き出すシェルを作成
/root/cputemp
#!/bin/sh
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
sysctl dev.cpu | grep dev.cpu.0.temperature: | awk '{print substr($2,0,4)}'
吐き出す内容は"|"から先を無くせば全てのデータが表示されますので確認してみてください。
こちらのコマンドはgrepでまずふるいにかけて、mrtgが認識するようにawkで修正しています。

MRTGに追加します。
/usr/local/etc/mrtg/mrtg.cfgに追加
Target[cputemp]: 1.3.6.1.4.1.2021.8.1.101.5&1.3.6.1.4.1.2021.8.1.101.6:private@localhost:
# 数字は項目6を参照
MaxBytes[cputemp]: 100
ThreshMaxO[cputemp]: 90
#ThreshMaxI[cputemp]: 90
SetEnv[cputemp]: EMAIL="www@hogehoge.mydns.jp" #ワーニングをメールで送る
                 URL="http://hogehoge.mydns.jp/mrtg/cputemp.html"
Title[cputemp]: CPU/MB Temp. -- hogehoge.mydns.jp
PageTop[cputemp]: <H1>CPU Temp. -- hogehoge.mydns.jp</H1>
 <TABLE>
   <TR><TD>System:</TD>     <TD>hogehoge.mydns.jp in freeBSD router</TD></TR>
   <TR><TD>Maintainer:</TD> <TD>root</TD></TR>
   <TR><TD>CPU type:</TD><TD>Core i5-6200U</TD></TR>
   <TR><TD>Clock:</TD>     <TD>2.3GHz</TD></TR>
   <TR><TD>Memory type:</TD>     <TD>DDR3L 1866MHz SO-DIMM</TD></TR>
   <TR><TD>Mother Board:</TD><TD>DS67U5</TD></TR>
   <TR><TD>Tj-max:</TD><TD>100℃</TD></TR>
 </TABLE>
Options[cputemp]: nopercent, gauge, absolute, withzeroes, noinfo, growright
YLegend[cputemp]: centigrade
ShortLegend[cputemp]: [℃]
Legend1[cputemp]: CPU0 温度
Legend2[cputemp]: CPU1 温度
LegendI[cputemp]: &nbsp;CPU0:
LegendO[cputemp]: &nbsp;CPU1:

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あたりですね
USBHDDの場合は
# smartctl -A -d sat /dev/ad0

そしてこれを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です
あとはCPU温度と同じようにmrtg.cfgを編集して完成。

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で温度だけを表示するようにしています

番号などは各自の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で帰す事ができタイムアウトも長くできるので反応が遅いコマンドでもエラーせずにすみます。

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

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

mail_warning.pl
#!/usr/bin/perl

$to = $ENV{'EMAIL'};
$from = "mrtg\@hogehoge.mydns.jp";
$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.mydns.jp";
$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/etc/mrtg/mrtg.cfg
# テンポラリーデータを書いておく場所を指定する
ThreshDir: /usr/local/www/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.mydns.jp"
# このワーニングが該当するURL
URL="http://hogehoge.mydns.jp/mrtg/cpu.html"
MaxBytes[cpu]: 400
# 以下省略・・・
と、それぞれの項目で設定できます
HDDの温度、HDD容量、UPSの容量などなど
お好きなように設定してください。

8.CPUクロックの制御

CPUクロックをモニターできるようになったら、自動で使用していない時に下がって欲しい。
FreeBSDでも制御できるのでやってみましょう。

/etc/rc.conf
powerd_enable="YES"
powerd_flags="-a adaptive -n adaptive"

-aは電源駆動の場合
-bがノーパソの場合バッテリ駆動らしい
-nはそのどちらでもない場合だが、そんなのあるのか?
adaptiveは可変、他にはmaxやminimumなどか?
-mで最低周波数、-Mで最高周波数が設定できるが
特に指定しなければ可能な範囲で自動に設定してくれるので不要。

これで自動的にCPUクロックが使用していない時に下がります。

9.WindowsマシンからSNMPを受信し表示する

自宅内にWindowsも24時間稼働するマシンがあったので、そちらの情報をmrtgでグラフ化したいと思いsnmpで情報を取得しようとやってみました。
Windowsの設定→アプリ→オプション機能→機能の追加
で検索ウィンドウに「snmp」と入れると2個出てきますので
簡易ネットワークプロトコル(SNMP)
を選んでインストールします。

インストールしたらタスクマネージャーからサービスタグを選び、下にある「サービス管理ツールを開く」でサービスの設定を開きます。
その中に「SNMPサービス」がありますのでダブルクリックしてプロパティを開きます。
その中でセキュリティタグを選び、コミュニティに名前を付けます。
また受付先にFreeBSDのIPを追加することで、FreeBSDマシンからWindowsのSNMOへアクセスできるようになります。

これだけでは大した情報が取り入れられないので、追加でSNMP-Informantをインストールします。
スタンダードであれば無料で使用できるので、スタンダード版をダウンロードします。
URLはこちら
取り込む数値は
Cドライブ空き容量  1.3.6.1.4.1.9600.1.1.1.1.5.2.67.58
Dドライブ空き容量  1.3.6.1.4.1.9600.1.1.1.1.5.2.68.58
メモリ空き容量  1.3.6.1.4.1.9600.1.1.2.3.0
CPU1使用率  1.3.6.1.4.1.9600.1.1.5.1.5.1.48
CPU2使用率  1.3.6.1.4.1.9600.1.1.5.1.5.1.49
ネットワーク(送信)  Windows10 1.3.6.1.2.1.2.2.1.16
Windows11 1.3.6.1.2.1.6.11.0
ネットワーク(受信)  Windows10 1.3.6.1.2.1.2.2.1.10
Windows11 1.3.6.1.2.1.6.10.0
ネットワークは1024で割り(Windows10)、MaxBytesは1Gbpsの場合125000に。
メモリー容量は1000で割る。
HDDは空き容量率なので、使用率に変更するため *-1+100で変換するとちょうどよい感じでした。