21 April 2013

Raspberry Piにmrtgをインストールする

20130421-cputemp-day.png
CPU温度グラフの例

20130421-network-day.png
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を有効化)

/etc/snmp/snmpd.conf
 ~略~
 
###############################################################################
#
#  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]のようなメッセージが溢れかえるのを防ぐ。

/etc/init.d/snmpd
 ~略~
 
# 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'
 
 ~略~
/etc/default/snmpd
 ~略~
 
# 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のようなメッセージが出力されるのを防ぐ。

/etc/default/snmpd
# Don't load any MIBs by default.
# You might comment this lines once you have the MIBs downloaded.
#export MIBS=


■ cronの設定

syslogにcron起動ごとのメッセージを書き込まないようにする。

/etc/rsyslog.conf
 ~略~
 
###############
#### 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の設定

設定ファイルを編集する

/etc/mrtg.cfg
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.log1> /dev/null 2>&1に変更)

/etc/cron.d/mrtg
*/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$

そのログファイルを、復元する設定

/etc/cron.d/mrtg
*/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