hiroaki のすべての投稿

HDDの温度監視

LinkstationでもHDDの温度を監視出来ることを知りました!

参考ページ
PC破壊日記的ブログ

なんとapt-getを使って簡単にインストール出来ます。

apt-get install smartmontools

早速MRTGに登録してみましたが何故か値が取得できませんでした。
コマンドで試すとちゃんと温度だけが表示されるんですが。
MRTGをroot権限で動かしているのに何故反映されないかのか結局分からず・・・

そこで方法を変えて以下のスクリプトを作成しSNMPに外部スクリプトで登録しました。

--------------------
#!/usr/bin/perl —

$hddtemp = readpipe(‘smartctl -d marvell -a /dev/sda -s on | grep -i temp | awk ‘{print $10}”);

print $hddtemp;

exit $hddtemp;

--------------------
※今回のスクリプトはINTEGERで値が取得出来るようにexitで値を返しています。

するとちゃんと値が取得出来るようになりました。

snmpwalk -v 1 -c public localhost .1.3.6.1.4.1.2021.8.1.100.2

ファイルサーバーにも同じように設定しネットワーク越しでもHDDの温度の監視が出来るようになりました。

※気が付くとMRTGのインデックスページの項目が沢山増えてしまいました(笑)
 Linkstationにもそこそこ負荷が掛かってるでしょうね。

他サーバーの温度、FANを監視する

他サーバーのCPU使用率やディスク使用率は他サーバーにインストールしたsnmp経由で取得可能です。
しかし温度やFAN回転数などはsnmpでは標準ではサポートされていません。
出来れば温度監視、FAN監視も一緒にやっておきたいところです。
(ここではdebian化したLinkstationの温度、FAN監視を扱っていますので
 お使いの機器によって温度取得、FAN回転数などの取得スクリプトは異なります)

snmpには外部スクリプトの結果を返してくれるようにする設定が可能なのでそれを利用します。
snmpd.confのサンプルを見ると Executables/scripts という項目があるのが分かると思います。

#####################################
# Executables/scripts
#
#
# You can also have programs run by the agent that return a single
# line of output and an exit code. Here are two examples.
#
# exec NAME PROGRAM [ARGS …]
#
# NAME: A generic name.
# PROGRAM: The program to run. Include the path!
# ARGS: optional arguments to be passed to the program

この後ろに実行スクリプトを登録します。
ちなみに今回は本体で使用しているスクリプトをそのまま他サーバーにコピーし流用します。
以前紹介しているスクリプトを他サーバーにコピーしてください。

/usr/local/mrtg/bin/mon_fan.pl
/usr/local/mrtg/bin/mon_temp.pl

スクリプトをコピーしたらsnmpd.confに実行の記述を書き足します。

exec mon_fan /usr/bin/perl /usr/local/mrtg/bin/mon_fan.pl
exec mon_fan /usr/bin/perl /usr/local/mrtg/bin/mon_temp.pl

この二行を書き足すことでスクリプトの実行結果がsnmp経由で取得可能になります。
Executables/scriptsのコメント部分に取得の値もちゃんと書いてありますね。
1.3.6.1.4.1.2021.8.1.101.1 ←1つ目の実行結果をそのまま文字列で返すようです。
1.3.6.1.4.1.2021.8.1.101.2 ←2つ目の実行結果をそのまま文字列で返すようです。

しかしこの結果をそのまま取得すると「UCD-SNMP-MIB::extOutput.1 = STRING:」のような余計な文字まで取得します。
本来はスクリプトを数字で返すように書き換えてINTEGERの値を取得すべきですが楽に使い回すために
MRTGの取得側で細工を行い正常にMRTGが認識出来るようにします。

※温度、FAN回転数のMRTG側設定は以前紹介したものを一部書き換えて使用します。
 基本的には同じように書くことで設定温度、設定回転数を超えた場合にメールの送信まで行ってくれます。

tagert項目を以下のように書き換えてください。

Target[fan_nashiro]: `snmpwalk -v 1 -c public 192.168.x.x .1.3.6.1.4.1.2021.8.1.101.1 | awk ‘{print $4} {print “2640”} {print “hostname”}’`

※public 192.168.x.x の部分はsnmpで設定した名称、サーバーIPに書き換えてください。
 2640の部分は好きな数字に書き換えて構いません。
 もちろん0でもOKです。
 hostnameの部分は他サーバーのホスト名に書き換えます。
 また、.1.3.6.1.4.1.2021.8.1.101.1 の部分を .1.3.6.1.4.1.2021.8.1.101.2 に書き換えれば温度の取得が出来ます。

snmpでスクリプトからの取得設定を行えばスクリプトで取得できる値は
snmp標準の値でなくても取得可能になるのでスクリプトで取得できる殆どの値はsnmp経由で送信可能ということになります。

以前紹介したメール対応の設定サンプルを改造したものを載せておきます。

### fan rpm info NAS-HIRO ####

Options[fan_nashiro]: gauge,growright,nopercent,unknaszero
MaxBytes[fan_nashiro]: 3700
ThreshMaxI[fan_nashiro]: 3000
SetEnv[fan_nashiro]: EMAIL=”yourmail@yourdomain.com”
URL=”http://your url/temp_nashiro.html”
YLegend[fan_nashiro]: Fan RPM
ShortLegend[fan_nashiro]: rpm
LegendI[fan_nashiro]:RPM
LegendO[fan_nashiro]:fastline
Unscaled[fan_nashiro]: ymwd

Target[fan_nashiro]: `snmpwalk -v 1 -c public 192.168.x.x .1.3.6.1.4.1.2021.8.1.101.1 | awk ‘{print $4} {print “2640”} {print “NAS-HIRO”}’`
Title[fan_nashiro]: Fan RPM Information
PageTop[fan_nashiro]:

Fan RPM Information on NAS-HIRO

System:NAS-HIRO
Maintainer:Root
Ip:192.168.x.x

### temp info NAS-HIRO ####

Options[temp_nashiro]: gauge,growright,nopercent,unknaszero
MaxBytes[temp_nashiro]: 75
ThreshMaxI[temp_nashiro]: 50
SetEnv[temp_nashiro]: EMAIL=”yourmail@yourdomain.com”
URL=”http://your url/temp_nashiro.html”
YLegend[temp_nashiro]: Temperature
ShortLegend[temp_nashiro]: C-deg
LegendI[temp_nashiro]:TEMP
LegendO[temp_nashiro]:borderline
Unscaled[temp_nashiro]: ymwd

Target[temp_nashiro]: `snmpwalk -v 1 -c public 192.168.x.x .1.3.6.1.4.1.2021.8.1.101.2 | awk ‘{print $4} {print “55”} {print “NAS-HIRO”}’`
Title[temp_nashiro]: Temperature Information
PageTop[temp_nashiro]:

Temperature Information on NAS-HIRO

System:NAS-HIRO
Maintainer:Root
Ip:192.168.x.x

ネットワーク機器の監視

ファイルサーバーの監視もSNMP経由でMRTGで纏めてやってみようと思い
ファイルサーバー側のSNMPの設定を行ってみました。
繋がりません・・・
色々なサイトを見て設定は間違っていないと思うのですが。

試しにsnmpwalk で値が取得できるか試してみました。

snmpwalk -v 1 localhost -c pubilic

ちゃんと取得できます。

snmpwalk -v 1 192.168.X.X -c pubilic

IPだと取得できません・・・

hostsからIPが漏れていたので追加するとIPでも動きました。
しかしhostsにWebサーバーのIPを追加してもTimeout: No Response from 192.168.X.X
と表示されるだけで値は返って来ません。
ちゃんとネット経由用の設定も追加したのに何故だろうか?

※追記
snmpのバージョンアップで基本的に127.0.0.1からしか繋がらないようになったようです。
恐らく殆どのサイトがバージョンアップ前の古い記事でこの設定が書かれていないようです。
この設定を解除するには以下のファイルに手を加えます。

/etc/default/snmpd

#SNMPDOPTS=’-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1′
SNMPDOPTS=’-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid’

単純にSNMPDOPTSの127.0.0.1を外すだけで良いようです。
この後snmpdを再起動してあげれば無事ネット経由での取得が可能になりました。

ちなみに-u snmp オプションを消すと自前で登録したスクリプトなどをroot権限で動かすことが可能になります。
逆に言えばroot権限で実行させたい場合は外す必要があります。

ネットワーク経由のシャットダウン

UPSのランタイムも正常になったのでネットワーク経由で
バックアップ用のNASにもapcupsdをインストールし
ネットワーク経由でのシャットダウン環境を構築します。

設定に関しては詳しいサイトがあったのでそちらを参考にしました。
http://tejix.jp/cgi-bin/tex/wiki.cgi?APCUPSD
※既にリンク先のサイトはなくなっているようです

ただここに書いてある設定では私の環境では動かなかったので少しだけ補足を。
マスターもスレーブも以下の設定にしないと動きませんでした。

NETIP 0.0.0.0
NISPORT 3551 (参考サイトではマスターは3552となっていました)

とりあえずこれで正常に動いているようです。

また、MRTGにUPSのロードキャパシティとバッテリー電圧の項目も追加しました。
あとは同じUPSに繋がってるWindowsXPも同じようにスレーブ設定してあげれば
ネット経由でのUPS電源連動は完了となります。
(マシン完のハブもUPSに繋がないと停電時は全く意味を持たないので注意が必要です)

※追記
Windows版も導入してみました。
Windows版はインストール先をC直下にしないとうまくconfファイルを読んでくれないようです・・・
またNETPORTがdebian版と違って6666になっているので忘れずに変更しましょう。
私は忘れて暫くconfファイルとにらめっこしてしまいました(笑)

#—————————————————————–
# UPS Load Capacity & Battery Voltage
#—————————————————————–
Target[upsLoadcapacity]: `/sbin/apcaccess status | awk ‘/^LOADPCT/ {print $3*10} /^BATTV/{print $3*10}’ && uname -n`
Maxbytes[upsLoadcapacity]: 1500
Options[upsLoadcapacity]: gauge, growright, absolute, nopercent, noinfo, unknaszero
YTicsFactor[upsLoadcapacity]: 0.1
Factor[upsLoadcapacity]: 0.1
YLegend[upsLoadcapacity]: UPS LCapa BVolt
ShortLegend[upsLoadcapacity]:
LegendI[upsLoadcapacity]: Capa(%)
LegendO[upsLoadcapacity]: Volt(V)
Legend1[upsLoadcapacity]: Load Capacity [LOADPCT]
Legend2[upsLoadcapacity]: バッテリー電圧 [BATTV]
Unscaled[upsLoadcapacity]: ymwd
Title[upsLoadcapacity]: UPS Load Capacity & Battery Voltage
PageTop[upsLoadcapacity]:

UPS Load Capacity & Battery Voltage for SmartUPS 700J

System:APC SmartUPS 700J
Maintainer:Root

ランタイム時間の較正

ランタイム較正を数度行うもUPSの残時間は変わらず・・・
(バッテリーに負荷が掛かって痛むんですよね)

色々調べてみたんですがとにかくコアな部分の情報が少ないですね。
APC smart protocolを隅々まで読んでいくとBatteryConstantsという項目があります。
このBatteryConstantsを使用して残時間を計算するらしいです。
SU700Jのデフォルト値は96みたいなのですがacptestで見てみると36になってます・・・
これが原因ですね。

しかしBatteryConstantsの変更方法が分かりません。
コマンドから0を打っても36が表示されるだけで変更は出来ません。
原因が特定出来たのに変更方法が分からないとは。
(このUPS中古で買ったんですが色々と値が変になってる。前の持ち主はどんな使い方してたのか(笑))

更に色々と調べてみるとapc-fixというソフトで規定値に戻せるそうです。
apc-fixをダウンロードしてWindowsから動かしてみるとメニューにoption項目があり
その中に書き戻してくれるオプションがあったのでチェックしてみる。
あれ、何も動かない・・・
何か良く分からないが一旦apc-fixを終了して再起動するとパラパラと36から96まで数字が変わっていった。
起動時に有効になる仕様ですか!!

本当に変わってるのか疑わしかったのでLinuxマシンに繋ぎ変えてapctestで再確認してみたらちゃんと変わっているようです。
ランタイム時間もload10%程度で120分と正常になったようです。
これでやっとランタイム時間の計算も正常になりました。
めでたし、めでたし。

UPSと通信してみる!

UPSの通信ケーブルが届いたので実際に通信を行ってみました。

まずは設定済みのconfでapctesが実行できるか?です。
apctestを実行してみるとあっさりと繋がりました。
EEPROMのバッテリー交換日付を書き換えてランタイム較正を実行。
ランタイム較正が終わってもランタイム時間が短い・・・
バッテリーの不良かと思い実際にUPSのコンセントを抜いてみる。
確かにバッテリーメーターの最低目盛までは4分程度で到達(負荷40%程度)
しかしそこから実際に電源が落ちるまでは20分近く持つのでした。

これってバッテリーの電圧低下が実残量があっても早いってことなんだろうな。
純正に使われているメーカーではなくFiam社製のバッテリーと交換したのが仇になったのだろうか?
UPSがバッテリーの残量を電圧で検知している以上はどうしようもないのだろうか・・・
負荷10%程度だと40分くらいと表示されるが実際は1時間半くらい持つんですが。

とりあえずUPSとの通信は正常に行われるのでこの辺は今後の課題ということにして終了。
apcupsdを実行するとwebから見るCGIもMRTGも正常に値が取得出来ています。