6月 03

xmbmon+cactiでモニタリング

Tag: Cacti, FreeBSD, net-snmpTOSHI @ 17:00:47

これからの暑い季節、おうちのルーターになってるマシンの温度が気になるわけで。家に帰って部屋に入ると、すんげー音でファンが回っててガクガク。てなわけでモニタリングをしてみようかと。

方向性
1. xmbmonで温度/ファン回転/電圧測定ができるような状態へ
2. xmbmonの出力をsnmpで取得できるようにする
3. cactiで視覚出力
まぁ、一番まんどいのはcactiのテンプレ作ることなんだけど(’A`)

1. xmbmon
とりあえずインスコは sysutils/xmbmon からportinstall。どうせルーターましんでXなんて使うはずもないので WITHOUT_X11=yes。
マザーに乗ってるハードウェアモニタのチップを調べる(各マザーのマニュアルにあるはず)。私のマザーに乗っかってたのはITE IT8721F。M/Bやchipの温度が狂ってるがCPUの温度だけ見れればいいやと無視。-12V/-5Vの値がおかしいのはハード的な問題なのでこれも気にしない。

% mbmon -d -I
Using ISA-IO access method!!
* Int.Tec.Exp. Chip IT8705F/IT8712F or SIS950 found.
% mbmon -I -c 1

Temp.= 127.0, 41.0, 127.0; Rot.= 2556, 4218,    0
Vcore = 1.33, 1.47; Volt. = 3.36, 4.92, 11.19,  -3.50, -6.14

ということで測定ができる状態に。

2. snmpd
mbmonの出力を加工して、snmpで取得できるように埋め込む。まずは加工。とはいってもmbmon -rで1行1ステータスにしたものから値だけ抜き出すだけ。マイナス数値は後でcactiに埋め込むときの利便性から絶対値にしておく(後述)。私は以下のようなshell scriptを書いたけど、snmpdはアクセスの度にshellを起動するので、3回も起動させるのどうよとか想う人は全部まとめてsnmpdに埋め込めばいい。

#!/bin/sh

cmd_mbmon='/usr/local/bin/mbmon -I -c 1'
cmd_awk='/usr/bin/awk'
cmd_sed='/usr/bin/sed'

case "$1" in
temp)
        # temp <MB, CPU, chip>
        $cmd_mbmon -T 7
        ;;
fan)
        # FAN <FAN0, FAN1, FAN2>
        $cmd_mbmon -r | $cmd_awk '/^FAN[0-3]/{print $3}'
        ;;
volt)
        # Volt <CPU VCore0, CPU VCore1, 3.3, 5, 12, -12, -5>
        $cmd_mbmon -r | $cmd_awk '/^V[C135]/{print $3}' | $cmd_sed 's/[+-]//'
        ;;
*)
        echo "Usage: `basename $0` {temp|fan|volt}" >&2
        exit 64
        ;;
esac

exit 0

んでこれ(getmbmon.shというファイル名にした)をsnmpdで呼ぶために、snmpd.confへ追加。execは出力の最初の一行以降は無視されるけど、extendを使えばmulti-lineな出力も順に入れてくれるので活用。というか、今のnet-snmp5は起動時にexecは古いからextendに以降汁と言われると想う。

extend mb1 /usr/local/share/snmp/getmbmon.sh temp
extend mb2 /usr/local/share/snmp/getmbmon.sh fan
extend mb3 /usr/local/share/snmp/getmbmon.sh volt

埋め込んだ値は、snmpで NET-SNMP-EXTEND-MIB::nsExtendOutLine をみれば取得できるので確認。

# snmpwalk -v 1 -c public localhost NET-SNMP-EXTEND-MIB::nsExtendOutLine
NET-SNMP-EXTEND-MIB::nsExtendOutLine."mb1".1 = STRING: 127.0
NET-SNMP-EXTEND-MIB::nsExtendOutLine."mb1".2 = STRING: 41.0
NET-SNMP-EXTEND-MIB::nsExtendOutLine."mb1".3 = STRING: 127.0
NET-SNMP-EXTEND-MIB::nsExtendOutLine."mb2".1 = STRING: 2556
<snip>

実際はOIDをcactiのconfigに入れると想うので、snmpwalkするとき-Onとかするとよいかも

3. cacti
これは正直説明するのまんどい。おおまかには
- Data TemplatesでGet SNMP Dataにして各値のテンプレを作る
- Graph Templatesで作ったデータテンプレを利用したグラフテンプレを作る
- Devices で該当のhostに作ったグラフテンプレ追加。後は New Graphs でグラフを作成する。
注意点は、データテンプレのData Source TypeをGAUGEにすると、マイナスの値をよろしく処理してくれないので、予め絶対値で出しておいた電圧のマイナス値を、グラフテンプレのItemにあるCDEF Function
でMake Stack Negativeにする。分かんなければメニューの英語全部訳汁。雰囲気つかめるんじゃないかすら。

extendで各OIDのIndexが出ればcacti側でIndexed使ってまとめて美しそうなんだけど、snmpdの設定読んでも分からなくて詰まった。mibみたらそれっぽいのはあるんだけどなぁ。のでtemp/FAN/Voltを分けて作った。誰か教えてplz
cactiの天麩羅くれとかは知らん。苦労して作ってYO!

コメント:2個

  1. taraiより、 2007/11/25 日:

    なんか見つけてしまったんで記念書き込み。
    voltいらない人は.sh書かずとも
    extend mb1 /path/to/mbmon -I -c 1 -T 2
    extend mb2 /path/to/mbmon -I -c 1 -F 2
    とかで切り出してもいいものですかね?

  2. としより、 2007/11/25 日:

    一個しか値がいらないならそれでおkでしょうね。要は必要な値さえ持って来れればいいんですし。
    ちなみにmuninもお勧め。ちょろっとconfig書いてpluginリンク張るだけで全部やってくれる優れもの。

コメントをどうぞ