サーバーを無人で24時間稼働させると何かと心配ですね、ここでは外部からでも監視できる
SNMPとMRTGを利用してサーバーの状況を外部から監視できるようにします。
監視する項目は
・ネットワークトラフィック(WAN,LAN)
・HDD使用量
・CPUパワー
・RAM使用量
・CPU温度
・FAN回転数
・HDD温度
です。
まずインストールする
# cd /usr/ports/net-mgmt/net-snmp
# make install clean
インストールしたら次に設定します。
/usr/local/share/snmp/snmpd.conf を編集するSNMPはセキュリティーがあまいプロトコルですので、SNMP自身で書き込み権限は誰にも与えない方が
# 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
よろしいと思います。また読み込みもサーバーからのみにしておきます。
起動時に立ち上げるように設定します
/etc/rc.conf
を追記します
snmpd_enable="YES"
設定が終了したらデーモンを走らせて見ましょう!
# /usr/local/etc/rc.d/snmpd start
次に動いているかコマンドラインで確認します。これで何かじゃらじゃら出て来たらまずは成功です。
# snmpwalk -v1 -c private localhost tcp
もしもうまくいかないときやデーモンが落ちたりしたときは/var/log/snmpd.logを見てみましょう。なんとなく原因がわかる?でしょう
まずはいつもどおりインストールします。
# 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]
出来上がったら動かして見ましょう。
コマンドラインからと打ち込めばWorkDirで設定したディレクトリーにファイルが出来ます。
# /usr/local/bin/mrtg /usr/local/share/mrtg/mrtg.cfg
最初はログファイルが無いのでエラーしますが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/
夏場を考えるとやはり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]: CPU0: LegendO[cputemp]: CPU1:
FreeBSD5.2以降の場合、HDD温度をモニターする事ができるようになりました
HDD寿命を伸ばすには温度を下げたい所ですが、夏場にどれくらいになるかがわかれば
どの程度対策すればいいかが分かると思いますので、是非モニターしましょう
使用するソフトはsmartmontoolsです
まずはインストール
特に設定はありませんがSMARTのアクセスを許可しないといけません
# cd /usr/ports/sysutils/smartmontools
# make install clean
最近の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そしてこのシェルを動作させますとad0とad1の温度だけが出て来ます、あとはこれをmrtg.cfgに入れればOKです
#!/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;}'
あとはCPU温度と同じようにmrtg.cfgを編集して完成。
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
引数の$1に対応してadの後ろに番号を入れてシェルを1個にしています
#!/bin/sh
DEV=/dev/ad$1
/usr/local/sbin/smartctl -a ${DEV} | grep Temp | awk '{if($1 == "194") print $10;}'
その中から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
この名前はsnmpd.confでexecの次に付けた名前です
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
なぜか書いた順番とはめちゃくちゃになりますので、execを追加したり削除した時は必ずチェックしましょう
それでは実際にmrtg.cfgへはこう書きます
ここではCPUとMBのファンをグラフする場合です
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:
数値を帰すのは101になり、その後の番号がsnmpwalkで調べた番号になります
これで全部snmpで帰す事ができタイムアウトも長くできるので反応が遅いコマンドでもエラーせずにすみます。
ただモニターしていただけでは不具合が起きた時に見ていなければ気がつきません
そこで、閾値を超えたらメールで内容を送る事により早急に把握できるので設定してみます。
まずはメールを送る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の容量などなど
お好きなように設定してください。
CPUクロックをモニターできるようになったら、自動で使用していない時に下がって欲しい。
FreeBSDでも制御できるのでやってみましょう。
/etc/rc.conf
powerd_enable="YES"
powerd_flags="-a adaptive -n adaptive"
-aは電源駆動の場合
-bがノーパソの場合バッテリ駆動らしい
-nはそのどちらでもない場合だが、そんなのあるのか?
adaptiveは可変、他にはmaxやminimumなどか?
-mで最低周波数、-Mで最高周波数が設定できるが
特に指定しなければ可能な範囲で自動に設定してくれるので不要。
これで自動的にCPUクロックが使用していない時に下がります。
自宅内にWindowsも24時間稼働するマシンがあったので、そちらの情報をmrtgでグラフ化したいと思いsnmpで情報を取得しようとやってみました。
Windowsの設定→アプリ→オプション機能→機能の追加
で検索ウィンドウに「snmp」と入れると2個出てきますので
簡易ネットワークプロトコル(SNMP)
を選んでインストールします。
インストールしたらタスクマネージャーからサービスタグを選び、下にある「サービス管理ツールを開く」でサービスの設定を開きます。
その中に「SNMPサービス」がありますのでダブルクリックしてプロパティを開きます。
その中でセキュリティタグを選び、コミュニティに名前を付けます。
また受付先にFreeBSDのIPを追加することで、FreeBSDマシンからWindowsのSNMOへアクセスできるようになります。
これだけでは大した情報が取り入れられないので、追加でSNMP-Informantをインストールします。
スタンダードであれば無料で使用できるので、スタンダード版をダウンロードします。
URLはこちら。
取り込む数値は
ネットワークは1024で割り(Windows10)、MaxBytesは1Gbpsの場合125000に。
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
メモリー容量は1000で割る。
HDDは空き容量率なので、使用率に変更するため *-1+100で変換するとちょうどよい感じでした。