CPU温度グラフの例
Ethernet転送量グラフの例
■ 検証環境
・本体 : Raspberry Pi, model B
・OS : 2013-02-09-wheezy-raspbian.zip
■ 必要なソフトウエアをインストールする
$ sudo apt-get install snmpd snmp $ sudo apt-get install mrtg
snmpwalkでMIBを見ながら監視対象を決めたい場合は、次のパッケージもインストール
$ sudo apt-get install snmp-mibs-downloader
■ SNMPのセットアップ
snmpdへのpublicアクセスを許可する。(rocommunity public localhost
を有効化)
~略~
###############################################################################
#
# ACCESS CONTROL
#
# system + hrSystem groups only
view systemonly included .1.3.6.1.2.1.1
view systemonly included .1.3.6.1.2.1.25.1
# Full access from the local host
rocommunity public localhost
# Default access to basic system info
rocommunity public default -V systemonly
# Full access from an example network
# Adjust this network address to match your local
# settings, change the community string,
# and check the 'agentAddress' setting above
#rocommunity secret 10.0.0.0/16
~略~
syslogにsnmp関連のメッセージを書き込まないようにする。(-Lsd
オプションを削除)
※/var/log/syslogにApr 20 16:02:34 localhost snmpd[2512]: Connection from UDP: [127.0.0.1]:33674->[127.0.0.1]
のようなメッセージが溢れかえるのを防ぐ。
~略~ # Defaults export MIBDIRS=/usr/share/mibs/site:/usr/share/snmp/mibs:/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp SNMPDRUN=yes #SNMPDOPTS='-Lsd -Lf /dev/null -p /var/run/snmpd.pid' SNMPDOPTS='-Lf /dev/null -p /var/run/snmpd.pid' TRAPDRUN=no #TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid' TRAPDOPTS='-p /var/run/snmptrapd.pid' ~略~
~略~ # snmpd options (use syslog, close stdin/out/err). #SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid' SNMPDOPTS='-Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid' # snmptrapd options (use syslog). #TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid' TRAPDOPTS='-p /var/run/snmptrapd.pid' ~略~
snmp-mibs-downloaderをインストールした場合はsyslogに警告を出さないように、次の設定を変更(無効化)する。
※/var/log/syslogにsnmpd起動時Apr 20 16:25:12 localhost snmpd[6512]: /etc/snmp/snmpd.conf: line 144: Error: unknown monitor OID
のようなメッセージが出力されるのを防ぐ。
# Don't load any MIBs by default.
# You might comment this lines once you have the MIBs downloaded.
#export MIBS=
■ cronの設定
syslogにcron起動ごとのメッセージを書き込まないようにする。
~略~
###############
#### RULES ####
###############
#
# First some standard log files. Log by facility.
#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none;cron.none -/var/log/syslog
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
~略~
■ snmpwalkerで監視対象のMIBを探す
snmp-mibs-downloaderをインストールした場合は、文字列形式でMIBが表示されるはず…。 ネットワーク インターフェースのMIB周辺を例として切り出してみた。
$ sudo snmpwalk -v1 -c public localhost | less IF-MIB::ifDescr.1 = STRING: lo IF-MIB::ifDescr.2 = STRING: eth0 IF-MIB::ifDescr.3 = STRING: wlan0 IF-MIB::ifType.1 = INTEGER: softwareLoopback(24) IF-MIB::ifType.2 = INTEGER: ethernetCsmacd(6) IF-MIB::ifType.3 = INTEGER: ethernetCsmacd(6) IF-MIB::ifMtu.1 = INTEGER: 16436 IF-MIB::ifMtu.2 = INTEGER: 1500 IF-MIB::ifMtu.3 = INTEGER: 1500 IF-MIB::ifSpeed.1 = Gauge32: 10000000 IF-MIB::ifSpeed.2 = Gauge32: 100000000 IF-MIB::ifSpeed.3 = Gauge32: 0
数値形式で表示する場合は、-Onを付加する。
$ sudo snmpwalk -v1 -On -c public localhost | less .1.3.6.1.2.1.2.2.1.2.1 = STRING: lo .1.3.6.1.2.1.2.2.1.2.2 = STRING: eth0 .1.3.6.1.2.1.2.2.1.2.3 = STRING: wlan0 .1.3.6.1.2.1.2.2.1.3.1 = INTEGER: softwareLoopback(24) .1.3.6.1.2.1.2.2.1.3.2 = INTEGER: ethernetCsmacd(6) .1.3.6.1.2.1.2.2.1.3.3 = INTEGER: ethernetCsmacd(6) .1.3.6.1.2.1.2.2.1.4.1 = INTEGER: 16436 .1.3.6.1.2.1.2.2.1.4.2 = INTEGER: 1500 .1.3.6.1.2.1.2.2.1.4.3 = INTEGER: 1500 .1.3.6.1.2.1.2.2.1.5.1 = Gauge32: 10000000 .1.3.6.1.2.1.2.2.1.5.2 = Gauge32: 100000000 .1.3.6.1.2.1.2.2.1.5.3 = Gauge32: 0
■ /sys/class以下のファイルから得られるCPU温度などについて
CPU温度は lm_sensorsのインストールの必要すらなく、/sys/class 以下のファイルから直接得ることができる。単位は1/1000℃。
$ cat /sys/class/thermal/thermal_zone0/temp 47078
■ mrtgの設定
設定ファイルを編集する
WorkDir: /var/www/mrtg ### Global Defaults EnableIPv6: no Language:iso2022jp # CPU temperature Target[cputemp]: `cat /sys/class/thermal/thermal_zone0/temp|cut -c1-2 && cat /sys/class/thermal/thermal_zone0/temp|cut -c1-2 && echo && uname -n` MaxBytes[cputemp]: 70 Title[cputemp]: System Temperature Log PageTop[cputemp]: System Temperature Log Options[cputemp]: gauge,growright,absolute,noinfo,nopercent,unknaszero,integer Unscaled[cputemp]: dwmy YLegend[cputemp]: Temperature ShortLegend[cputemp]: deg-C LegendI[cputemp]: CPU (BCM2835) Temp LegendO[cputemp]: CPU (BCM2835) Temp Legend1[cputemp]: CPU (BCM2835) Temp Legend2[cputemp]: CPU (BCM2835) Temp # Ethernet #Target[network]: 2:public@localhost: Target[network]: iso.3.6.1.2.1.2.2.1.10.2&iso.3.6.1.2.1.2.2.1.16.2:public@localhost Options[network]: growright, bits, unknaszero MaxBytes[network]: 100000 Title[network]: Ethernet Network interface [eth0] log PageTop[network]: Network interface # Wifi #Target[network_wifi]: 3:public@localhost: Target[network_wifi]: iso.3.6.1.2.1.2.2.1.10.3&iso.3.6.1.2.1.2.2.1.16.3:public@localhost Options[network_wifi]: growright, bits, unknaszero MaxBytes[network_wifi]: 100000 Title[network_wifi]: Wireless Network interface [wlan0] log PageTop[network_wifi]: Network interface # memory Target[memory]: iso.3.6.1.2.1.25.2.3.1.6.1&iso.3.6.1.2.1.25.2.3.1.6.7:public@localhost Factor[memory]: 1000 MaxBytes[memory]:600000 Title[memory]:Memory Usage PageTop[memory]:Memory Usage Options[memory]: gauge,growright,absolute,noinfo,nopercent,unknaszero,integer ShortLegend[memory]: Bytes YLegend[memory]: Used Bytes LegendI[memory]: Physical Used LegendO[memory]: Cache Legend1[memory]: Physical Used Legend2[memory]: Cache
※ LM75をI2Cインターフェースに接続して温度測定出来る場合は、その温度を取り込むことも出来る。
# CPU temperature
Target[cputemp]: `/usr/sbin/i2cget -y 1 0x48 0 w | awk '{print(("0x"substr($1,5,2)substr($1,3,1))*0.0625)}' && cat /sys/class/thermal/thermal_zone0/temp|cut -c1-2 && echo && uname -n`
MaxBytes[cputemp]: 70
Title[cputemp]: System Temperature Log
PageTop[cputemp]: System Temperature Log
Options[cputemp]: gauge,growright,absolute,noinfo,nopercent,unknaszero,integer
Unscaled[cputemp]: dwmy
YLegend[cputemp]: Temperature
ShortLegend[cputemp]: deg-C
LegendI[cputemp]: Air (LM75) Tempereture
LegendO[cputemp]: CPU (BCM2835) Temperature
Legend1[cputemp]: Air (LM75) Temp
Legend2[cputemp]: CPU (BCM2835) Temp
mrtgの自動起動を確認する。(mrtgインストール時に、自動的にcron起動スクリプトが書き込まれているはず)
$ ls -la /etc/cron.d/ 合計 20 drwxr-xr-x 2 root root 4096 4月 15 22:32 . drwxr-xr-x 106 root root 4096 4月 18 23:01 .. -rw-r--r-- 1 root root 102 7月 10 2012 .placeholder -rw-r--r-- 1 root root 273 4月 20 18:11 mrtg -rw-r--r-- 1 root root 565 3月 7 20:29 php5
■ mrtgのエラーでroot宛メールが送信されるのを防ぐ
このようなメールが、エラー発生時に送信されてくる
From: root (Cron Daemon) To: root Subject: Cron <root@raspberrypi> if [ -x /usr/bin/mrtg ] && [ -r /etc/mrtg.cfg ] && [ -d "$(grep '^[[:space:]]*[^#]*[[:space:]]*WorkDir' /etc/mrtg.cfg | awk '{ print $NF }')" ]; then mkdir -p /var/log/mrtg ; env LANG=C /usr/bin/mrtg /etc/mrtg.cfg 2>&1 | tee -a /var/log/mrtg/mrtg.log ; fi Content-Type: text/plain; charset=UTF-8 X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <HOME=/root> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=root> Message-Id: <20130425215017.BEB9C14B97@raspberry-pi> Date: Fri, 26 Apr 2013 06:50:17 +0900 (JST) Use of uninitialized value in concatenation (.) or string at /usr/bin/mrtg line 1543. Use of uninitialized value in concatenation (.) or string at /usr/bin/mrtg line 1543. Use of uninitialized value in concatenation (.) or string at /usr/bin/mrtg line 1552. Use of uninitialized value in concatenation (.) or string at /usr/bin/mrtg line 1552.
起動スクリプト /etc/cron.d/mrtg を修正して、出力を/dev/nullに送るようにする。ついでに、ログファイルへの書き込みも停止する。(2>&1 | tee -a /var/log/mrtg/mrtg.log
を1> /dev/null 2>&1
に変更)
*/5 * * * * root if [ -x /usr/bin/mrtg ] && [ -r /etc/mrtg.cfg ] && [ -d "$(grep '^[[:space:]]*[^#]*[[:space:]]*WorkDir' /etc/mrtg.cfg | awk '{ print $NF }')" ]; then mkdir -p /var/log/mrtg ; env LANG=C /usr/bin/mrtg /etc/mrtg.cfg 1> /dev/null 2>&1 ; fi
■ /var/www/mrtgをRAMディスクに割り当てている場合
スケジュール・シャットダウン前にログファイルをSDCARDに退避する設定を行う(sudo crontab -e
)。
11 0 * * * cp /var/www/mrtg/*.log /var/mrtg_save/ 1> /dev/null 2>&1; /sbin/shutdown -h now$
そのログファイルを、復元する設定
*/5 * * * * root if [ ! -f /var/www/mrtg/cputemp.log ]; then cp /var/mrtg_save/*.log /var/www/mrtg/ 1> /dev/null 2>&1; fi; env LANG=C /usr/bin/mrtg /etc/mrtg.cfg 1> /dev/null 2>&1