Translate

2016年9月4日日曜日

HDD温度のグラフ化 その4)Windowsクライアントへのインストール(つづき その2)

こんにちは、稲田商会です。

前回では、クライアントのWindows7(64bit)にNET-SNMPをインストールしました。
今回は、NET-SNMPで配信される情報にHDDの温度を含めます。

◎Windows7(64bit)クライアントの設定(つづき その2)

○S.M.A.R.T.情報の加工
SmartMonToolsで取得したS.M.A.R.T.情報のうち必要な部分を切り出します。

1)busyboxのダウンロード、インストール
データの加工にawk、grepなどのコマンドが使えると便利なのと、linuxのshスクリプトが使えるようになるので、busyboxを使えるようにします。
(1)ファイルのダウンロード
下記URLを開いて下の方にあるリンクから「busybox.exe」をダウンロードします。

URL: http://frippery.org/busybox/

サイトのトップ。下の方にダウンロードのリンクがある。

「busybox.exe」のリンクをクリックするとダウンロードする。

(2)データの展開
ダウンロード後、PATHの通った位置に配置します。
今回はNet-SNMPのある、"C:\usr\bin"に配置します。
> move .\busybox.exe C:\usr\bin\busybox.exe
2)データの切り出し
S.M.A.R.T.情報のうち、温度データは"Temperature_Cel"のある行で、温度情報は10列目の値です。
今回はgrepで"Temperature_Cel"のある行を抽出、awkで10列目の値を抽出します。
> busybox sh #busyboxのシェルに移行
$ smartctl -A /dev/sda #S.M.A.R.T.情報の取得
smartctl 6.5 2016-05-07 r4318 [x86_64-w64-mingw32-win7-sp1] (sf-6.5-1)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org
Warning: Limited functionality due to missing admin rights
Read SMART Thresholds failed: Function not implemented
=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_
FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033   100   100   ---    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   096   096   ---    Old_age   Always       -       19774
 12 Power_Cycle_Count       0x0032   098   098   ---    Old_age   Always       -       1037
177 Wear_Leveling_Count     0x0013   087   087   ---    Pre-fail  Always       -       455
179 Used_Rsvd_Blk_Cnt_Tot   0x0013   100   100   ---    Pre-fail  Always       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   ---    Old_age   Always       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   ---    Old_age   Always       -       0
183 Runtime_Bad_Block       0x0013   100   100   ---    Pre-fail  Always       -       0
187 Reported_Uncorrect      0x0032   100   100   ---    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0032   068   057   ---    Old_age   Always       -       32
195 Hardware_ECC_Recovered  0x001a   200   200   ---    Old_age   Always       -       0
199 UDMA_CRC_Error_Count    0x003e   253   253   ---    Old_age   Always       -       0
235 Unknown_Attribute       0x0012   099   099   ---    Old_age   Always       -       164
241 Total_LBAs_Written      0x0032   099   099   ---    Old_age   Always       -       15529401389
$ smartctl -A /dev/sda | grep "Temperature_Cel" #温度該当行の抽出
190 Airflow_Temperature_Cel 0x0032   068   057   ---    Old_age   Always       -       32
$ smartctl -A /dev/sda | grep "Temperature_Cel" | awk '{print $10}' #温度情報の抽出
32
$ exit #シェルの終了
#windowsのプロンプト
上手く出来ました。

3)スクリプトによるコマンド化
一連の動きをスクリプトにまとめてコマンド化します。
今回は"c:\usr\bin"に"smart2value.sh"を作成します。内容は次の通りです。
"C:/Program Files/smartmontools/bin/smartctl.exe" -A $1 | grep 'Temperature' | awk '{print $10}'
ここで、注意しないといけないのは、smartctl.exeをフルパスで書いていることです。
実は当初は"smartctl -A ..."と書いていたのですが、Net-SNMPから呼んだときに上手く動きませんでした。
今回SmartMonToolsでインストールしてこの場所にあるので、上記のフルパスで良いと思いますが、
> busybox sh #busyboxのシェルに移行
$ which smartctl #smartctlの場所確認
C:/Program Files/smartmontools/bin/smartctl.exe #smartctlの場所
などとして確認しておいてください。

実行してみると、
> busybox sh smart2value.sh /dev/sda
35
正しく動作しました。

○NET-SNMPへの組み込み

NET-SNMPには、snmpd.confに"extend"書式で記述した内容をsnmpとして配信する機能があります。

参考URL: Net-SNMPで外部コマンドの結果を返すときに、そのMIBを固定したいの ((ひ)めも)
参考URL: http://www.net-snmp.org/docs/man/snmpd.conf.html

書式:
extend [MIBIOD] name prog arg
※nameは配信する際の名称(OIDに変換)、progは実行するプログラム名、argはプログラムへの引数。

例:
extend Temp_sda /usr/local/bin/smart_snmp.sh /dev/sda
※"Temp_sda"の名前で、"/usr/local/bin/smart_snmp.sh /dev/sda"を実行した結果を配信する。

これをWindowsでもやってみます。

1)snmpd.confの編集
c:\usr\etc\snmp\snmpd.confをテキストエディタで開き、編集します。
編集箇所
 編集前
###############################################################################
# Further Information
#
# See the snmpd.conf manual page, and the output of "snmpd -H".
# MUCH more can be done with the snmpd.conf than is shown as an
# example here.
編集後
###############################################################################
# Further Information
#
# See the snmpd.conf manual page, and the output of "snmpd -H".
# MUCH more can be done with the snmpd.conf than is shown as an
# example here.

extend Temp_sda c:\\usr\\bin\\busybox.exe sh c:\usr\bin\smart2value.sh  /dev/sda
 編集内容
   Temp_sdaの名前でスクリプトの実行結果をSNMPで配信する。

注意してほしいのは、progに当たる部分
c:\\usr\\bin\\busybox.exe
では"\"はそのままではエスケープ文字になるので、"\\"と重ねる必要があるのに対し、argに当たる部分
sh c:\usr\bin\smart2value.sh  /dev/sda
では"\"は重ねる必要がないことです。

2)有効化
snmpd.confの変更を有効にするには、Net-SNMPのサービスを再起動してやる必要があります。

(1)[スタート]-[すべてのプログラム]-[Net-SNMP]-[Service]-[Register Agent Service]を右クリックし、「管理者として実行」を選択。
(2)[スタート]-[コントロールパネル]-[管理ツール]-[サービス]を開く。
(3)名前が"Net-SNMP Agent"の行を右クリックし「再起動」を選択。

3)実行テスト
 コマンドプロンプトを開いて、snmpwalkでの取得を試みます。
>snmpwalk -v1 -c public localhost #localhostのSNMP取得
SNMPv2-MIB::sysDescr.0 = STRING: Windows ti7-PC 6.1.7601 Service Pack 1  Home Ed
ition Intel64 Family 6 Model 58 Stepping 9
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::org
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (60931) 0:10:09.31
SNMPv2-MIB::sysContact.0 = STRING: Administrator <admin@example.jp>
SNMPv2-MIB::sysName.0 = STRING: ti7-PC
SNMPv2-MIB::sysLocation.0 = STRING: Right here, right now.
(省略)
SNMPv2-MIB::snmpSilentDrops.0 = Counter32: 0
SNMPv2-MIB::snmpProxyDrops.0 = Counter32: 0
次にextendで追加した部分のsnmpwalkでの取得を試みます。
> snmpwalk -v1 -c public localhost NET-SNMP-EXTEND-MIB::nsExtendObjects #extend部分のSNMP取得
NET-SNMP-EXTEND-MIB::nsExtendNumEntries.0 = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendCommand."Temp_sda" = STRING: c:\usr\bin\busybox.exe
NET-SNMP-EXTEND-MIB::nsExtendArgs."Temp_sda" = STRING: sh c:\usr\bin\smart2value.sh /dev/sda
NET-SNMP-EXTEND-MIB::nsExtendInput."Temp_sda" = STRING:
NET-SNMP-EXTEND-MIB::nsExtendCacheTime."Temp_sda" = INTEGER: 5
NET-SNMP-EXTEND-MIB::nsExtendExecType."Temp_sda" = INTEGER: exec(1)
NET-SNMP-EXTEND-MIB::nsExtendRunType."Temp_sda" = INTEGER: run-on-read(1)
NET-SNMP-EXTEND-MIB::nsExtendStorage."Temp_sda" = INTEGER: permanent(4)
NET-SNMP-EXTEND-MIB::nsExtendStatus."Temp_sda" = INTEGER: active(1)
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."Temp_sda" = STRING: 34
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."Temp_sda" = STRING: 34
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."Temp_sda" = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendResult."Temp_sda" = INTEGER: 0
NET-SNMP-EXTEND-MIB::nsExtendOutLine."Temp_sda".1 = STRING: 34

>

次の箇所でHDDの温度値が取得できました。
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."Temp_sda" = STRING: 34
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."Temp_sda" = STRING: 34
NET-SNMP-EXTEND-MIB::nsExtendOutLine."Temp_sda".1 = STRING: 34

SNMPでデータを取得する際にはOIDの方が便利なことが多いのでOIDを調べておきます。
OIDを調べるにはオプションに"-O n"を指定します。
> snmpwalk -v1 -c public -O n localhost NET-SNMP-EXTEND-MIB::nsExtendObjects
.1.3.6.1.4.1.8072.1.3.2.1.0 = INTEGER: 1
.1.3.6.1.4.1.8072.1.3.2.2.1.2.8.84.101.109.112.95.115.100.97 = STRING: c:\usr\bin\busybox.exe
.1.3.6.1.4.1.8072.1.3.2.2.1.3.8.84.101.109.112.95.115.100.97 = STRING: sh c:\usr\bin\smart2value.sh /dev/sda
.1.3.6.1.4.1.8072.1.3.2.2.1.4.8.84.101.109.112.95.115.100.97 = STRING:
.1.3.6.1.4.1.8072.1.3.2.2.1.5.8.84.101.109.112.95.115.100.97 = INTEGER: 5
.1.3.6.1.4.1.8072.1.3.2.2.1.6.8.84.101.109.112.95.115.100.97 = INTEGER: exec(1)
.1.3.6.1.4.1.8072.1.3.2.2.1.7.8.84.101.109.112.95.115.100.97 = INTEGER: run-on-read(1)
.1.3.6.1.4.1.8072.1.3.2.2.1.20.8.84.101.109.112.95.115.100.97 = INTEGER: permanent(4)
.1.3.6.1.4.1.8072.1.3.2.2.1.21.8.84.101.109.112.95.115.100.97 = INTEGER: active(1)
.1.3.6.1.4.1.8072.1.3.2.3.1.1.8.84.101.109.112.95.115.100.97 = STRING: 34
.1.3.6.1.4.1.8072.1.3.2.3.1.2.8.84.101.109.112.95.115.100.97 = STRING: 34
.1.3.6.1.4.1.8072.1.3.2.3.1.3.8.84.101.109.112.95.115.100.97 = INTEGER: 1
.1.3.6.1.4.1.8072.1.3.2.3.1.4.8.84.101.109.112.95.115.100.97 = INTEGER: 0
.1.3.6.1.4.1.8072.1.3.2.4.1.2.8.84.101.109.112.95.115.100.97.1 = STRING: 34
>
次のOIDでHDDの温度値が取得できました。
.1.3.6.1.4.1.8072.1.3.2.3.1.1.8.84.101.109.112.95.115.100.97 = STRING: 34
.1.3.6.1.4.1.8072.1.3.2.3.1.2.8.84.101.109.112.95.115.100.97 = STRING: 34
.1.3.6.1.4.1.8072.1.3.2.4.1.2.8.84.101.109.112.95.115.100.97.1 = STRING: 34
以上の結果から、私はOIDを次のように考えています。
先頭の「.1.3.6.1.4.1.8072.1.3.2」がNET-SNMP-EXTEND-MIB::nsExtendObjectsで配信されるデータであることを表しています。
また、末尾の「84.101.109.112.95.115.100.97」はASCIIコードで"Temp_sda"ですので、snmpd.confのextendで指定したnameに当たる文字が入っています。

さて、データが増えた場合OIDはどうなるのでしょうか。
例えば、snmpd.confを
extend Temp_sda c:\\usr\\bin\\busybox.exe sh c:\usr\bin\smart2value.sh /dev/sda
extend Temp_sdb c:\\usr\\bin\\busybox.exe sh c:\usr\bin\smart2value.sh /dev/sdb
として、snmpを取得した場合
> snmpwalk -v1 -c public localhost NET-SNMP-EXTEND-MIB::nsExtendObjects
NET-SNMP-EXTEND-MIB::nsExtendNumEntries.0 = INTEGER: 2
NET-SNMP-EXTEND-MIB::nsExtendCommand."Temp_sda" = STRING: c:\usr\bin\busybox.exe
NET-SNMP-EXTEND-MIB::nsExtendCommand."Temp_sdb" = STRING: c:\usr\bin\busybox.exe
NET-SNMP-EXTEND-MIB::nsExtendArgs."Temp_sda" = STRING: sh c:\usr\bin\smart2value.sh /dev/sda
NET-SNMP-EXTEND-MIB::nsExtendArgs."Temp_sdb" = STRING: sh c:\usr\bin\smart2value.sh /dev/sda
NET-SNMP-EXTEND-MIB::nsExtendInput."Temp_sda" = STRING:
NET-SNMP-EXTEND-MIB::nsExtendInput."Temp_sdb" = STRING:
NET-SNMP-EXTEND-MIB::nsExtendCacheTime."Temp_sda" = INTEGER: 5
NET-SNMP-EXTEND-MIB::nsExtendCacheTime."Temp_sdb" = INTEGER: 5
NET-SNMP-EXTEND-MIB::nsExtendExecType."Temp_sda" = INTEGER: exec(1)
NET-SNMP-EXTEND-MIB::nsExtendExecType."Temp_sdb" = INTEGER: exec(1)
NET-SNMP-EXTEND-MIB::nsExtendRunType."Temp_sda" = INTEGER: run-on-read(1)
NET-SNMP-EXTEND-MIB::nsExtendRunType."Temp_sdb" = INTEGER: run-on-read(1)
NET-SNMP-EXTEND-MIB::nsExtendStorage."Temp_sda" = INTEGER: permanent(4)
NET-SNMP-EXTEND-MIB::nsExtendStorage."Temp_sdb" = INTEGER: permanent(4)
NET-SNMP-EXTEND-MIB::nsExtendStatus."Temp_sda" = INTEGER: active(1)
NET-SNMP-EXTEND-MIB::nsExtendStatus."Temp_sdb" = INTEGER: active(1)
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."Temp_sda" = STRING: 34
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."Temp_sdb" = STRING: 34
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."Temp_sda" = STRING: 34
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."Temp_sdb" = STRING: 34
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."Temp_sda" = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."Temp_sdb" = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendResult."Temp_sda" = INTEGER: 0
NET-SNMP-EXTEND-MIB::nsExtendResult."Temp_sdb" = INTEGER: 0
NET-SNMP-EXTEND-MIB::nsExtendOutLine."Temp_sda".1 = STRING: 34
NET-SNMP-EXTEND-MIB::nsExtendOutLine."Temp_sdb".1 = STRING: 34
> snmpwalk -v1 -c public -O n localhost NET-SNMP-EXTEND-MIB::nsExtendObjects
.1.3.6.1.4.1.8072.1.3.2.1.0 = INTEGER: 2
.1.3.6.1.4.1.8072.1.3.2.2.1.2.8.84.101.109.112.95.115.100.97 = STRING: c:\usr\bin\busybox.exe
.1.3.6.1.4.1.8072.1.3.2.2.1.2.8.84.101.109.112.95.115.100.98 = STRING: c:\usr\bin\busybox.exe
.1.3.6.1.4.1.8072.1.3.2.2.1.3.8.84.101.109.112.95.115.100.97 = STRING: sh c:\usr\bin\smart2value.sh /dev/sda
.1.3.6.1.4.1.8072.1.3.2.2.1.3.8.84.101.109.112.95.115.100.98 = STRING: sh c:\usr\bin\smart2value.sh /dev/sda
.1.3.6.1.4.1.8072.1.3.2.2.1.4.8.84.101.109.112.95.115.100.97 = STRING:
.1.3.6.1.4.1.8072.1.3.2.2.1.4.8.84.101.109.112.95.115.100.98 = STRING:
.1.3.6.1.4.1.8072.1.3.2.2.1.5.8.84.101.109.112.95.115.100.97 = INTEGER: 5
.1.3.6.1.4.1.8072.1.3.2.2.1.5.8.84.101.109.112.95.115.100.98 = INTEGER: 5
.1.3.6.1.4.1.8072.1.3.2.2.1.6.8.84.101.109.112.95.115.100.97 = INTEGER: exec(1)
.1.3.6.1.4.1.8072.1.3.2.2.1.6.8.84.101.109.112.95.115.100.98 = INTEGER: exec(1)
.1.3.6.1.4.1.8072.1.3.2.2.1.7.8.84.101.109.112.95.115.100.97 = INTEGER: run-on-read(1)
.1.3.6.1.4.1.8072.1.3.2.2.1.7.8.84.101.109.112.95.115.100.98 = INTEGER: run-on-read(1)
.1.3.6.1.4.1.8072.1.3.2.2.1.20.8.84.101.109.112.95.115.100.97 = INTEGER: permanent(4)
.1.3.6.1.4.1.8072.1.3.2.2.1.20.8.84.101.109.112.95.115.100.98 = INTEGER: permanent(4)
.1.3.6.1.4.1.8072.1.3.2.2.1.21.8.84.101.109.112.95.115.100.97 = INTEGER: active(1)
.1.3.6.1.4.1.8072.1.3.2.2.1.21.8.84.101.109.112.95.115.100.98 = INTEGER: active(1)
.1.3.6.1.4.1.8072.1.3.2.3.1.1.8.84.101.109.112.95.115.100.97 = STRING: 34
.1.3.6.1.4.1.8072.1.3.2.3.1.1.8.84.101.109.112.95.115.100.98 = STRING: 34
.1.3.6.1.4.1.8072.1.3.2.3.1.2.8.84.101.109.112.95.115.100.97 = STRING: 34
.1.3.6.1.4.1.8072.1.3.2.3.1.2.8.84.101.109.112.95.115.100.98 = STRING: 34
.1.3.6.1.4.1.8072.1.3.2.3.1.3.8.84.101.109.112.95.115.100.97 = INTEGER: 1
.1.3.6.1.4.1.8072.1.3.2.3.1.3.8.84.101.109.112.95.115.100.98 = INTEGER: 1
.1.3.6.1.4.1.8072.1.3.2.3.1.4.8.84.101.109.112.95.115.100.97 = INTEGER: 0
.1.3.6.1.4.1.8072.1.3.2.3.1.4.8.84.101.109.112.95.115.100.98 = INTEGER: 0
.1.3.6.1.4.1.8072.1.3.2.4.1.2.8.84.101.109.112.95.115.100.97.1 = STRING: 34
.1.3.6.1.4.1.8072.1.3.2.4.1.2.8.84.101.109.112.95.115.100.98.1 = STRING: 34
となり、extendをいくら増やしてもOIDは変わらず、nameの文字列のみで一意に決まることがわかります。
 これから、extendのnameでOIDを固定することが出来ること、またextendの追加では変化しないことがわかります。

それでは、今回はこのへんで。