debian lenny でのローカルからのSNMP

※実際には、7/18のネタです。

< CPU、メモリ、ディスク使用率 >

■SNMPとSNMPのデーモン、それにSNMP TRAPを導入する。
$ apt-cache search snmp | grep ^snmp
snmp - SNMP (Simple Network Management Protocol) applications
snmpd - SNMP (Simple Network Management Protocol) agents
snmptrapfmt - A configurable snmp trap handler daemon for snmpd
$ sudo apt-get install snmp snmpd snmptrapfmt

■「snmpd.conf」の現在の設定を確認する
$ sudo grep -v "^\#\|^\$" /etc/snmp/snmpd.conf
com2sec paranoid default public
group MyROSystem v1 paranoid
group MyROSystem v2c paranoid
group MyROSystem usm paranoid
group MyROGroup v1 readonly
group MyROGroup v2c readonly
group MyROGroup usm readonly
group MyRWGroup v1 readwrite
group MyRWGroup v2c readwrite
group MyRWGroup usm readwrite
view all included .1 80
view system included .iso.org.dod.internet.mgmt.mib-2.system
access MyROSystem "" any noauth exact system none none
access MyROGroup "" any noauth exact all none none
access MyRWGroup "" any noauth exact all all none
syslocation Unknown (configure /etc/snmp/snmpd.local.conf)
syscontact Root <root@localhost> (configure /etc/snmp/snmpd.local.conf)

■snmpdの設定項目の説明を表示してみます。
$ man snmpd | grep "\-H" -A 1 | head -2
-H Display a list of configuration file directives understood by
the agent and then exit.
$ sudo snmpd -H 2>&1 | grep sys
sysdescr description
syslocation location
syscontact contact-name
sysname node-name
sysservices NUMBER
sysobjectid OID
 ⇒結局、locationって何?というループ。

■MRTGの設定通りに、「syslocation」はホスト名を、「Contact」はそのままにします。
$ ls /etc/mrtg.cfg | sudo xargs cat | grep System -A 5 -B 1 | head -7
######################################################################
# System: sample-system
# Description: Linux sample-system 2.6.26-2-amd64 #1 SMP Mon Jun 13 16:29:33 UTC 2011 x86_64
# Contact: Root <root@localhost>
# Location: sample-system
######################################################################

■Debianでは「paradoid」はsystemまで。「readonly」は「all」の読み取りが可能です。
$ grep -A 2 "paranoid" /usr/share/doc/snmpd/README.Debian
The default configuration for snmpd is rather paranoid for security
reasons. Edit /etc/snmp/snmpd.conf or run snmpconf to allow greater
access.

■「readonly」に変更します。
$ sudo grep -v "^\#\|^\$" /etc/snmp/snmpd.conf | head -2
com2sec readonly 127.0.0.1 public
com2sec readonly 192.168.0.0/24 public

■設定を変更後、snmpdの再起動、接続確認をします。
$ sudo /etc/init.d/snmpd restart
$ snmpwalk -v 1 localhost -c public system | wc -l
31

■MIBを調べよう。
 例えば、「system」にアクセスする場合。
$ snmptranslate -On -IR system
.1.3.6.1.2.1.1

■MIBのテキストは以下にあります。
$ ls /usr/share/snmp/mibs | wc -l
66
$ ls /usr/share/snmp/mibs/* | \
for list in `xargs`;do \
cat "$list" | grep CPU > /dev/null 2>&1 && echo "$list"; \
done
/usr/share/snmp/mibs/HOST-RESOURCES-MIB.txt
/usr/share/snmp/mibs/HOST-RESOURCES-TYPES.txt
/usr/share/snmp/mibs/SQUID.txt
/usr/share/snmp/mibs/UCD-SNMP-MIB.txt

■「OBJECT-TYPE」で絞り込んでも126もあります。
$ ls /usr/share/snmp/mibs/* | \
for list in `xargs`;do \
cat "$list" | grep OBJECT-TYPE | sed s/" OBJECT-TYPE"//g | grep -v " "; \
done | grep -i "cpu\|mem\|disk\|net" | wc -l
126

■CPUのアイドル時間を取得するMIBを見つけました。
$ ls /usr/share/snmp/mibs/* | \
for list in `xargs`;do \
cat "$list" | grep OBJECT-TYPE | grep -i "cpuidle" && echo "$list"; \
done
ssCpuIdle OBJECT-TYPE
/usr/share/snmp/mibs/UCD-SNMP-MIB.txt

■実際にデータを取得してみます。
$ snmpwalk -c public -v 1 localhost ssCpuIdle
UCD-SNMP-MIB::ssCpuIdle.0 = INTEGER: 98

■MIBのアドレスに変換します。
$ snmptranslate -On -IR ssCpuIdle
.1.3.6.1.4.1.2021.11.11

■デーモンを確認します。「127.0.0.1」の部分はリモートからのアクセスの際に変更するかも知れません。
$ ps aux | grep snmpd | cut -c 65- | head -1
/usr/sbin/snmpd -Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1

■ステータスを確認します。
$ snmpstatus -c public -v 1 localhost
[UDP: [127.0.0.1]:161]=>[Linux sample-system 2.6.26-2-amd64 #1 SMP Mon Jun 13 16:29:33 UTC 2011 x86_64] Up: 1:00:34.63
Interfaces: 4, Recv/Trans packets: 64768/49653 | IP: 64076/48830

■待ち受けは問題ないようです。
$ netstat -an | head -2 | tail -1;netstat -an | grep 161
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 127.0.0.1:161 0.0.0.0:*

■「init.d」スクリプトで変数の読み込みは2箇所あります。
$ grep start /etc/init.d/snmpd | grep '\$'
start-stop-daemon --quiet --start --exec /usr/sbin/snmpd -- $SNMPDOPTS
start-stop-daemon --quiet --start --exec /usr/sbin/snmptrapd -- $TRAPDOPTS
$ grep -A 1 start\) /etc/init.d/snmptrapfmt
start)
start-stop-daemon --start --verbose --exec $DAEMON -- -D -f /etc/snmp/snmptrapfmt.conf
$ grep 127 /etc/default/snmpd
SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1'
⇒「127.0.0.1」を変更する場合は、「/etc/default/snmpd」ファイルの「SNMPDOPTS」変数です。

■CPU関連の取得出来る情報を一覧します。
$ ls /usr/share/snmp/mibs/* | \
for list in `xargs`;do \
cat "${list}" | grep -i cpu; \
done | grep "OBJECT-TYPE" | awk '{print $1}' | \
for next in `xargs`;do \
echo -ne "$next\t:\t" ;snmptranslate -On -IR "$next"; \
done
hrSWRunPerfCPU : .1.3.6.1.2.1.25.5.1.1.1
cacheCpuTime : Unknown object identifier: cacheCpuTime
cacheCpuUsage : Unknown object identifier: cacheCpuUsage
ssCpuUser : .1.3.6.1.4.1.2021.11.9
ssCpuSystem : .1.3.6.1.4.1.2021.11.10
ssCpuIdle : .1.3.6.1.4.1.2021.11.11
ssCpuRawUser : .1.3.6.1.4.1.2021.11.50
ssCpuRawNice : .1.3.6.1.4.1.2021.11.51
ssCpuRawSystem : .1.3.6.1.4.1.2021.11.52
ssCpuRawIdle : .1.3.6.1.4.1.2021.11.53
ssCpuRawWait : .1.3.6.1.4.1.2021.11.54
ssCpuRawKernel : .1.3.6.1.4.1.2021.11.55
ssCpuRawInterrupt : .1.3.6.1.4.1.2021.11.56
ssCpuRawSoftIRQ : .1.3.6.1.4.1.2021.11.61

■「ssCpuIdle」と「ssCpuRawIdle」の違い
 シングルコアかマルチコアかです。「/proc/cpuinfo」を確認して下さい。
 ここでは
$ ls /usr/share/snmp/mibs/* | \
for list in `xargs`;do \
cat "${list}" | grep -A 11 "^ssCpuIdle\|^ssCpuRawIdle"; \
done
ssCpuIdle OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS deprecated
DESCRIPTION
"The percentage of processor time spent idle,
calculated over the last minute.
This object has been deprecated in favour of
'ssCpuRawIdle(53)', which can be used to calculate
the same metric, but over any desired time period."
::= { systemStats 11 }
--
ssCpuRawIdle OBJECT-TYPE
SYNTAX Counter32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The number of 'ticks' (typically 1/100s) spent
idle.
On a multi-processor system, the 'ssCpuRaw*'
counters are cumulative over all CPUs, so their
sum will typically be N*100 (for N processors)."
::= { systemStats 53 }

■取得してみます。
$ snmpwalk -c public -v 1 localhost ssCpuIdle
UCD-SNMP-MIB::ssCpuIdle.0 = INTEGER: 99

■CPU利用率(使用率)は100-(ssCpuIdle)で求められます。
$ snmpwalk -c public -v 1 localhost ssCpuIdle | awk '{print 100-$4}'
1

■メモリ関連の取得出来る情報を一覧します。
$ ls /usr/share/snmp/mibs/* | for list in `xargs`;do \
cat "${list}" | grep -i mem; \
done | \
grep "OBJECT-TYPE" | awk '{print $1}' | \
for next in `xargs`;do \
echo -ne "$next\t:\t" ;snmptranslate -On -IR "$next"; \
done
hrMemorySize : .1.3.6.1.2.1.25.2.2
hrSWRunPerfMem : .1.3.6.1.2.1.25.5.1.1.2
ipv6IfIcmpInGroupMembQueries : .1.3.6.1.2.1.56.1.1.1.15
ipv6IfIcmpInGroupMembResponses : .1.3.6.1.2.1.56.1.1.1.16
ipv6IfIcmpInGroupMembReductions : .1.3.6.1.2.1.56.1.1.1.17
ipv6IfIcmpOutGroupMembQueries : .1.3.6.1.2.1.56.1.1.1.32
ipv6IfIcmpOutGroupMembResponses : .1.3.6.1.2.1.56.1.1.1.33
ipv6IfIcmpOutGroupMembReductions : .1.3.6.1.2.1.56.1.1.1.34
cacheMemMaxSize : Unknown object identifier: cacheMemMaxSize
cacheMemUsage : Unknown object identifier: cacheMemUsage
memIndex : .1.3.6.1.4.1.2021.4.1
memErrorName : .1.3.6.1.4.1.2021.4.2
memTotalSwap : .1.3.6.1.4.1.2021.4.3
memAvailSwap : .1.3.6.1.4.1.2021.4.4
memTotalReal : .1.3.6.1.4.1.2021.4.5
memAvailReal : .1.3.6.1.4.1.2021.4.6
memTotalSwapTXT : .1.3.6.1.4.1.2021.4.7
memAvailSwapTXT : .1.3.6.1.4.1.2021.4.8
memTotalRealTXT : .1.3.6.1.4.1.2021.4.9
memAvailRealTXT : .1.3.6.1.4.1.2021.4.10
memTotalFree : .1.3.6.1.4.1.2021.4.11
memMinimumSwap : .1.3.6.1.4.1.2021.4.12
memShared : .1.3.6.1.4.1.2021.4.13
memBuffer : .1.3.6.1.4.1.2021.4.14
memCached : .1.3.6.1.4.1.2021.4.15
memUsedSwapTXT : .1.3.6.1.4.1.2021.4.16
memUsedRealTXT : .1.3.6.1.4.1.2021.4.17
memSwapError : .1.3.6.1.4.1.2021.4.100
memSwapErrorMsg : .1.3.6.1.4.1.2021.4.101

■実メモリの最大値と空き容量です。
$ snmpwalk -c public -v 1 localhost memTotalReal
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 1997200 kB
$ snmpwalk -c public -v 1 localhost memAvailReal
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 1705792 kB

■実メモリ使用量を計算します。
$ echo $( \
snmpwalk -c public -v 1 localhost memTotalReal | awk '{print $4}'; \
snmpwalk -c public -v 1 localhost memAvailReal | awk '{print $4}') \
| awk '{print $1-$2}'
292820

■スワップメモリの最大値と空き容量です。
$ snmpwalk -c public -v 1 localhost memTotalSwap
UCD-SNMP-MIB::memTotalSwap.0 = INTEGER: 3229024 kB
$ snmpwalk -c public -v 1 localhost memAvailSwap
UCD-SNMP-MIB::memAvailSwap.0 = INTEGER: 3229024 kB

■スワップメモリ使用量を計算します。
$ echo $( \
snmpwalk -c public -v 1 localhost memTotalSwap | awk '{print $4}'; \
snmpwalk -c public -v 1 localhost memAvailSwap | awk '{print $4}') \
| awk '{print $1-$2}'
0

■ディスク関連の取得出来る情報を一覧します。
$ ls /usr/share/snmp/mibs/* | \
for list in `xargs`;do \
cat "${list}" | grep -i "dsk\|disk"; \
done | grep "OBJECT-TYPE" | awk '{print $1}' | \
for next in `xargs`;do \
echo -ne "$next\t:\t" ;snmptranslate -On -IR "$next"; \
done
hrDiskStorageTable : .1.3.6.1.2.1.25.3.6
hrDiskStorageEntry : .1.3.6.1.2.1.25.3.6.1
hrDiskStorageAccess : .1.3.6.1.2.1.25.3.6.1.1
hrDiskStorageMedia : .1.3.6.1.2.1.25.3.6.1.2
hrDiskStorageRemoveble : .1.3.6.1.2.1.25.3.6.1.3
hrDiskStorageCapacity : .1.3.6.1.2.1.25.3.6.1.4
diskIOTable : .1.3.6.1.4.1.2021.13.15.1
diskIOEntry : .1.3.6.1.4.1.2021.13.15.1.1
diskIOIndex : .1.3.6.1.4.1.2021.13.15.1.1.1
diskIODevice : .1.3.6.1.4.1.2021.13.15.1.1.2
diskIONRead : .1.3.6.1.4.1.2021.13.15.1.1.3
diskIONWritten : .1.3.6.1.4.1.2021.13.15.1.1.4
diskIOReads : .1.3.6.1.4.1.2021.13.15.1.1.5
diskIOWrites : .1.3.6.1.4.1.2021.13.15.1.1.6
diskIOLA1 : .1.3.6.1.4.1.2021.13.15.1.1.9
diskIOLA5 : .1.3.6.1.4.1.2021.13.15.1.1.10
diskIOLA15 : .1.3.6.1.4.1.2021.13.15.1.1.11
diskIONReadX : .1.3.6.1.4.1.2021.13.15.1.1.12
diskIONWrittenX : .1.3.6.1.4.1.2021.13.15.1.1.13
dskTable : .1.3.6.1.4.1.2021.9
dskEntry : .1.3.6.1.4.1.2021.9.1
dskIndex : .1.3.6.1.4.1.2021.9.1.1
dskPath : .1.3.6.1.4.1.2021.9.1.2
dskDevice : .1.3.6.1.4.1.2021.9.1.3
dskMinimum : .1.3.6.1.4.1.2021.9.1.4
dskMinPercent : .1.3.6.1.4.1.2021.9.1.5
dskTotal : .1.3.6.1.4.1.2021.9.1.6
dskAvail : .1.3.6.1.4.1.2021.9.1.7
dskUsed : .1.3.6.1.4.1.2021.9.1.8
dskPercent : .1.3.6.1.4.1.2021.9.1.9
dskPercentNode : .1.3.6.1.4.1.2021.9.1.10
dskErrorFlag : .1.3.6.1.4.1.2021.9.1.100
dskErrorMsg : .1.3.6.1.4.1.2021.9.1.101

■どのMIBを使うか確認します。
$ ls /usr/share/snmp/mibs/* | \
for list in `xargs`;do \
cat "${list}" | grep -i "dsk\|disk"; \
done | grep "OBJECT-TYPE" | awk '{print $1}' | \
for next in `xargs`;do \
snmpwalk -v 2c -c public localhost ${next}; \
done | awk -F\: '{print $1}' | uniq
HOST-RESOURCES-MIB
UCD-DISKIO-MIB
UCD-SNMP-MIB

■ディスク関連のMIBが見つかりません。(「-v 1」だとメッセージも無く終了)
$ snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.9.1.9
UCD-SNMP-MIB::dskPercent = No Such Instance currently exists at this OID
$ snmpwalk -v 2c -c public localhost hrDiskStorageMedia
HOST-RESOURCES-MIB::hrDiskStorageMedia = No Such Instance currently exists at this OID

■強引に探します。
$ ls /usr/share/snmp/mibs/* | \
for list in `xargs`;do \
cat "${list}" | grep -i "dsk\|disk"; \
done | grep "OBJECT-TYPE" | awk '{print $1}' | \
for next in `xargs`;do \
snmpwalk -v 2c -c public localhost "${next}"; \
done | grep -v "No Such" | cut -c -25 | sort | uniq
UCD-DISKIO-MIB::diskIODev
UCD-DISKIO-MIB::diskIOInd
UCD-DISKIO-MIB::diskIONRe
UCD-DISKIO-MIB::diskIONWr
UCD-DISKIO-MIB::diskIORea
UCD-DISKIO-MIB::diskIOWri

■使えそうな部分を見つけます。
$ snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.13.15.1.1.2 | grep sda
UCD-DISKIO-MIB::diskIODevice.17 = STRING: sda
UCD-DISKIO-MIB::diskIODevice.18 = STRING: sda1
UCD-DISKIO-MIB::diskIODevice.19 = STRING: sda2
UCD-DISKIO-MIB::diskIODevice.20 = STRING: sda5

■「diskIO〜」の17値だけを取得します。
$ for list in `seq 1 15`;do \
snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.13.15.1.1.${list}.17; \
done | grep -v "No Such"
UCD-DISKIO-MIB::diskIOIndex.17 = INTEGER: 17
UCD-DISKIO-MIB::diskIODevice.17 = STRING: sda
UCD-DISKIO-MIB::diskIONRead.17 = Counter32: 202586112
UCD-DISKIO-MIB::diskIONWritten.17 = Counter32: 254611456
UCD-DISKIO-MIB::diskIOReads.17 = Counter32: 7739
UCD-DISKIO-MIB::diskIOWrites.17 = Counter32: 13924
UCD-DISKIO-MIB::diskIONReadX.17 = Counter64: 202586112
UCD-DISKIO-MIB::diskIONWrittenX.17 = Counter64: 254611456

■IOが取れているので、初心に返って「snmpd.conf」の設定を見ます。
$ sudo grep disk /etc/snmp/snmpd.conf | grep -v "^# "
#disk / 10000
$ sudo grep -B 2 "#disk" /etc/snmp/snmpd.conf | grep -v "^\$"
# Check the / partition and make sure it contains at least 10 megs.
#disk / 10000

■10MBを最小容量として「/」を監視するという意味だと分かります。
$ sudo snmpd -H 2>&1 | grep disk
ignoredisk name
disk path [ minspace | minpercent% ]

■「disk / 10000」の行頭のコメントアウトを外した所、動作しました。
$ echo 'hrDiskStorageTable
hrDiskStorageEntry
hrDiskStorageAccess
hrDiskStorageMedia
hrDiskStorageRemoveble
hrDiskStorageCapacity
dskTable
dskEntry
dskIndex
dskPath
dskDevice
dskMinimum
dskMinPercent' | for list in `xargs`;do snmpwalk -v 1 -c public localhost ${list};done
UCD-SNMP-MIB::dskIndex.1 = INTEGER: 1
UCD-SNMP-MIB::dskPath.1 = STRING: /
UCD-SNMP-MIB::dskDevice.1 = STRING: /dev/sda1
UCD-SNMP-MIB::dskMinimum.1 = INTEGER: 10000
UCD-SNMP-MIB::dskMinPercent.1 = INTEGER: -1
UCD-SNMP-MIB::dskTotal.1 = INTEGER: 73750784
UCD-SNMP-MIB::dskAvail.1 = INTEGER: 36141840
UCD-SNMP-MIB::dskUsed.1 = INTEGER: 33862588
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 48
UCD-SNMP-MIB::dskPercentNode.1 = INTEGER: 2
UCD-SNMP-MIB::dskErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::dskErrorMsg.1 = STRING:
UCD-SNMP-MIB::dskIndex.1 = INTEGER: 1
UCD-SNMP-MIB::dskPath.1 = STRING: /
UCD-SNMP-MIB::dskDevice.1 = STRING: /dev/sda1
UCD-SNMP-MIB::dskMinimum.1 = INTEGER: 10000
UCD-SNMP-MIB::dskMinPercent.1 = INTEGER: -1
UCD-SNMP-MIB::dskTotal.1 = INTEGER: 73750784
UCD-SNMP-MIB::dskAvail.1 = INTEGER: 36141836
UCD-SNMP-MIB::dskUsed.1 = INTEGER: 33862592
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 48
UCD-SNMP-MIB::dskPercentNode.1 = INTEGER: 2
UCD-SNMP-MIB::dskErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::dskErrorMsg.1 = STRING:
UCD-SNMP-MIB::dskIndex.1 = INTEGER: 1
UCD-SNMP-MIB::dskPath.1 = STRING: /
UCD-SNMP-MIB::dskDevice.1 = STRING: /dev/sda1
UCD-SNMP-MIB::dskMinimum.1 = INTEGER: 10000
UCD-SNMP-MIB::dskMinPercent.1 = INTEGER: -1

■ディスクの使用率「df」とinode使用率「df -i」
$ echo '.1.3.6.1.4.1.2021.9.1.9 .1.3.6.1.4.1.2021.9.1.10' | \
for list in `xargs`;do \
snmpwalk -v 1 -c public localhost ${list}; \
done
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 48
UCD-SNMP-MIB::dskPercentNode.1 = INTEGER: 2

■ディスクエラーとエラーメッセージ
$ echo '.1.3.6.1.4.1.2021.9.1.100 .1.3.6.1.4.1.2021.9.1.101' | \
for list in `xargs`;do \
snmpwalk -v 1 -c public localhost ${list}; \
done
UCD-SNMP-MIB::dskErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::dskErrorMsg.1 = STRING:

■MRTGの設定ファイルは分けておきます。
 不要になったり、トラブルシュートの際に楽になります。
 ※WorkDirの変更等、共通の設定項目は、ファイルの数だけ変更する必要があります。
$ cd /etc
$ sudo cp -p mrtg.cfg mrtg_cpu.cfg
$ sudo cp -p mrtg.cfg mrtg_mem.cfg
$ sudo cp -p mrtg.cfg mrtg_disk.cfg

■別々の作業ディレクトリを作成します。
$ cd /var/www/mrtg
$ sudo mkdir cpu
$ sudo mkdir mem
$ sudo mkdir disk

■CPU使用率の一般的な取得方法(mrtg_cpu.cfg)
Target[cpu]: .1.3.6.1.4.1.2021.11.50.0&.1.3.6.1.4.1.2021.11.52.0:public@localhost
MaxBytes[cpu]: 100
Options[cpu]: growright, noinfo, nopercent
YLegend[cpu]: CPU usage(%)
ShortLegend[cpu]: (%)
LegendI[cpu]: user
LegendO[cpu]: system
Legend1[cpu]: CPU usage(user)(%)
Legend2[cpu]: CPU usage(system)(%)
Title[cpu]: CPU usage
PageTop[cpu]: <h1>CPU usage</h1>

■メモリ使用率の一般的な取得方法(mrtg_mem.cfg)
Target[mem]: .1.3.6.1.4.1.2021.4.6.0&.1.3.6.1.4.1.2021.4.4.0:public@localhost
MaxBytes1[mem]: 4054440
MaxBytes2[mem]: 7815612
Unscaled[mem]: dwmy
Options[mem]: gauge, absolute, growright, noinfo
YLegend[mem]: Mem Free(Bytes)
ShortLegend[mem]: Bytes
kilo[mem]: 1024
kMG[mem]: k,M,G,T,P
LegendI[mem]: Real
LegendO[mem]: Swap
Legend1[mem]: free physical memory[MBytes]
Legend2[mem]: free swap[MBytes]
Title[mem]: free memory
PageTop[mem]: <h1>free memory</h1>

■ディスク使用率の一般的な取得方法(mrtg_disk.cfg)
Target[disk]: .1.3.6.1.4.1.2021.9.1.9.1&.1.3.6.1.4.1.2021.9.1.9.1:public@localhost
MaxBytes[disk]: 100
Unscaled[disk]: dwmy
Options[disk]: gauge, absolute, growright, nopercent, noinfo
YLegend[disk]: Disk Used(%)
ShortLegend[disk]: (%)
LegendI[disk]: / Disk used
LegendO[disk]: / Disk Used
Legend1[disk]: / Disk used
Legend2[disk]: / Disk used
Title[disk]: Disk usage
PageTop[disk]: <h1>Disk usage</h1>

■上記3ファイルのTargetを試す。
$ sudo grep "Target" /etc/mrtg_* | awk -F\: '{print $3}' | sed s/"\&"/" "/g | \
for list in `xargs`;do \
snmpwalk -v 1 -c public localhost ${list}; \
done
UCD-SNMP-MIB::ssCpuRawUser.0 = Counter32: 11226
UCD-SNMP-MIB::ssCpuRawSystem.0 = Counter32: 3317
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 48
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 48
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 1616840 kB
UCD-SNMP-MIB::memAvailSwap.0 = INTEGER: 3229024 kB

■設定ファイルを反映させる。
 ※各3回づつ実行し、メッセージが出なくなればOK。
$ sudo sh -c 'env LANG=C /usr/bin/mrtg /etc/mrtg_cpu.cfg'
$ sudo sh -c 'env LANG=C /usr/bin/mrtg /etc/mrtg_mem.cfg'
$ sudo sh -c 'env LANG=C /usr/bin/mrtg /etc/mrtg_disk.cfg'

■各インデックスページを作成する。
$ for list in cpu mem disk;do \
sudo indexmaker /etc/mrtg_${list}.cfg --column=1 --output=/var/www/mrtg/${list}/index.html; \
done

■各ログから情報取得を確認する
 ※headで取得する。また5分に一回の更新という点に注意
$ find /var/www/mrtg/ | grep ".log" | \
for list in `xargs`;do \
echo "###### $list";head -1 "$list"; \
done

■「/etc/cron.d/mrtg」を編集。
$ cat /etc/cron.d/mrtg
PATH=/usr/bin
*/5 * * * * root if [ -r /etc/mrtg.cfg ]; then env LANG=C mrtg /etc/mrtg.cfg 2>&1 | tee -a /var/log/mrtg/mrtg.log ; fi
*/5 * * * * root if [ -r /etc/mrtg.cfg ]; then env LANG=C mrtg  /etc/mrtg_cpu.cfg 2>&1 | tee -a /var/www/mrtg/cpu/cpu.log ; fi
*/5 * * * * root if [ -r /etc/mrtg.cfg ]; then env LANG=C mrtg  /etc/mrtg_mem.cfg 2>&1 | tee -a /var/www/mrtg/mem/mem.log ; fi
*/5 * * * * root if [ -r /etc/mrtg.cfg ]; then env LANG=C mrtg  /etc/mrtg_disk.cfg 2>&1 | tee -a /var/www/mrtg/disk/disk.log ; fi

■5分ごとに足並みそろえて更新されていることを確認。
$ echo 'cpu mem disk' | for list in `xargs`;do head -1 /var/www/mrtg/${list}/*.log | date -d @`awk '{print $1}'`;done;date
2011718日 月曜日 04:05:02 JST
2011718日 月曜日 04:05:02 JST
2011718日 月曜日 04:05:02 JST
2011718日 月曜日 04:09:57 JST

■UNIX時間を現在のローカル時刻に変換。
$ LANG=C;date -d '@1310925809'
Mon Jul 18 03:03:29 JST 2011
$ LANG=C;date
Mon Jul 18 03:04:46 JST 2011

■トラブルシュート用
$ echo 'cpu mem disk' | \
for list in `xargs`;do \
head -1 /var/www/mrtg/${list}/*.log; \
sudo grep "Target" /etc/mrtg_${list}.cfg | awk -F\: '{print $2}' | sed s/"\&"/" "/g | \
for next in `xargs`;do \
snmptranslate -On -IR ${next};snmpwalk -v 1 -c public localhost ${next}; \
done; \
done | grep -v "^\$"
1310925809 23232 4941
Unknown object identifier: .1.3.6.1.4.1.2021.11.50.0
UCD-SNMP-MIB::ssCpuRawUser.0 = Counter32: 23665
Unknown object identifier: .1.3.6.1.4.1.2021.11.52.0
UCD-SNMP-MIB::ssCpuRawSystem.0 = Counter32: 5039
1310925815 1600808 3229024
Unknown object identifier: .1.3.6.1.4.1.2021.4.6.0
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 1612664 kB
Unknown object identifier: .1.3.6.1.4.1.2021.4.4.0
UCD-SNMP-MIB::memAvailSwap.0 = INTEGER: 3229024 kB
1310925822 48 48
Unknown object identifier: .1.3.6.1.4.1.2021.9.1.9.1
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 48
Unknown object identifier: .1.3.6.1.4.1.2021.9.1.9.1
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 48

■GUIのMIBブラウザは「mbrowse」が見やすい。
 結局使わなかったけど。。。
$ apt-cache search ^mbrowse
mbrowse - a SNMP MIB browser