ttt

getttyent

smartmontoolsでHDDのSMART属性を記録してrrdtoolでグラフ化するperlスクリプト(仮)

2006-07-09 22:28:14 | デジタル・インターネット

smartmontoolsのsmartctlコマンドを定期的に実行し、得られたSMARTのAttribute情報を、rrdtoolで記録しつつ、記録したデータをグラフにするperlスクリプトを書いてみました。xmbmonに入ってたmbmon-rrd.plをちょこっと参考にして、あとはテキトーなノリにまかせて作ってます。

2~3日、FreeBSDないくつかなマシンで使ってみて、だいたい動いてるっぽいので、ここに置いておきます。

ただ、rrdtoolの使い方が、いまひとつ、理解しきれていないところがあるので、(仮)バージョンとしておきます。

■ ダウンロード

「smartmon-rrd.pl」をダウンロード

■ 必要なもの

  • smartmontools (/usr/ports/sysutils/smartmontools/)
  • rrdtool (/usr/ports/net/rrdtool/)
  • perl (/usr/ports/lang/perl5.8/)

■ ごく簡単な使い方の説明

◎ データを記録する

# ./smartmon-rrd.pl -disk /dev/ad0 -host MYHOST -db_dir /var/tmp -monitor "1,5,8,9,201" &

  • -diskで、記録対象のディスクを指定する
  • -hostは、どのホストで実行しているのかわかりやすいように、適当な名前をつけるために指定
  • -db_dirは、rrdtoolのファイルを書き出すディレクトリ
  • -monitorでは、記録したいSMARTのAttributeのIDを、カンマ(,)で区切って指定する。IDというのは、「smartctl -A /dev/ad0」とか実行したときに表示される情報の、「ID#」列に並んでいる数値のこと(最後のほうに列挙した過去記事を参考のこと)
  • smartctlコマンドがroot権限でないと実行できないので、このsmartmon-rrd.plも、rootで実行しなくてはならない
  • 「&」でバックグラウンドで実行。複数のディスクを監視したいなら、ディスクの数だけsmartmon-rrd.plを実行すればよい。smartmon-rrd.plが動いている間は、定期的にsmartctlが実行され(デフォルトでは2分間隔)、rrdファイルに記録されていく
  • 実行すると、/var/tmp/smart.MYHOST.ad0.rrdというファイルと、/var/tmp/smart.MYHOST.ad0.logといったができる。.rrdがrrdtoolで使うrrdファイル。.logのほうは、グラフを作成するときに属性の名前を求めるために使っているもので、smartmon-rrd.plを実行し、最初に1回書き込まれるだけ
  • -monitorで指定するパラメータを変更したいときは、.rrdファイルを手で削除してから、smartmon-rrd.plを実行すること

◎ 記録したデータをグラフ化する

% ./smartmon-rrd.pl -disk /dev/ad0 -monitor "8,9,195,201" -graph "1h"

  • グラフを作成するときは、root権限で実行しなくてもよい(余談。ID番号をSeek Time Performanceといった文字列に変換する必要があったけど、.logファイルから読み出すのでsmartctlコマンドは実行しなくて済むようになった)
  • -graph "1h"で、ここ最近、過去1時間のデータをグラフにする。-graph "3h"なら3時間、-graph "1d"なら1日。-graph "1h,8h,1d,3d"のように、カンマで区切って複数指定することも可能
  • -monitorでは、データを記録するために実行したときに指定したのと同じものを指定する
  • 以下のような画像ファイル(PNG形式)が作成される

smart.HOST.ad0-1hours_N8.png
smart.HOST.ad0-1hours_N9.png
smart.HOST.ad0-1hours_N195.png
smart.HOST.ad0-1hours_N201.png
smart.HOST.ad0-1hours_R8.png
smart.HOST.ad0-1hours_R9.png
smart.HOST.ad0-1hours_R195.png
smart.HOST.ad0-1hours_R201.png

  • HOSTは-hostで指定したホスト名、ad0というのはディスク名(/dev/が省略される)、-graph "1h"を指定したなら1hoursとつく。
  • 「N」はNormalized値(過去記事を参照のこと)、をグラフ化したもの、「R」はRaw値。グラフの見た目は、Raw値のほうが、変化に富んでいておもしろい。Normalizedのほうには、VALUE、WORST、THRESHの3つの値がグラフ化される

■ 例

  • Seek Time Performance(ID# 8) Raw Value

Smarthostad03days_r8

  • Seek Time Performance(ID# 8) Normalized Value

緑の線がVALUE、赤がWORST、青がTHRESH

Smarthostad03days_n8

  • Reallocated Sector Ct (ID# 5) Raw Value

エラーセクタが発生して、代替セクタが割り当てられた数のことか?ちょうど、1個、増えたところ。

Smarthostad03days_r5

  • Reallocated Sector Ct (ID# 5) Normalized Value

VALUEが、1だけ、減少した・・・

Smarthostad03days_n5

■ 今後

画像ファイルの出力先ディレクトリを指定できるようにしなくちゃいけませんね。今のは、カレントディレクトリに出てきてしまいます。

あと、サムネイル(縮小画像)を作成し、HTMLファイルを作成する機能を追加するといいかもしれません。

■ 過去記事

■ 2006年7月12日追記

“今後”のところにあげた機能を実装してみました。

  • 「-output ディレクトリ」でファイルの出力先ディレクトリを指定可能
  • 「-html ファイル名」で、HTMLファイルとサムネイル画像(縮小画像)を作成。サムネイル作成のためには、ImageMagickのconvertが必要

Smartmonrrdhtml

あと、データが3日分しか記録されていないことに気が付きました。perlスクリプト中で

$rows = $RRD_STEP * 20; # ???

となっていて、これが記録するデータサンプル数のようなんですが、$RRD_STEPのデフォルトが120で、

120 * 20 * 120 / 60 / 60 /24
= 3.3333333333

ということで、約3日です。$rowsの計算式で「* 200」にすれば約33日になりますが、.rrdファイルのサイズが大きくなります(8~9MBくらいだったかも)。もっとも、120秒ごとに記録する必要もないので、$RRD_STEPをもっと大きくすれば(引数の「-step 値」で指定可能)、「* 20」のままでも、計測期間を延ばせます。

■ 2006年7月13日追記

  • ボタン1発で、画像サイズを変更できるようにしました(無駄にJavaScriptを使ってますが・・・)
  • デフォルトでは3日しかデータが記録されないのを修正しました。rrdtoolマニュアルをじっくりと読んだ結果、データベースの定義(RRA:AVERAGE:ほにゃらら のところ)を変更することで、よさそうです。

■ 2006年7月31日追記

けっこう変更しました。

  • 3wareのRAIDカードで接続するディスクにも対応しました。「-device 3ware,0 -disk /dev/twe0」みたいに指定します。単に、smartctlコマンドにそのまま渡しているだけですので、何を指定するかはsmartctlコマンドのマニュアルを参考にしてください。
  • 日時で、月が0~11になっている恥ずかしいバグをなおしました。
  • ディスクの個数だけプログラムを実行するのはマヌケなので、smartmon-rrd.confというようなファイルを作成して、そこに、まとめて指定できるようにしてみました。
  • 大幅に書き換えたため、どこか動かなくなっているとまずいので、ファイル名を変更してアップロードしておきます。
  • デフォルトでのファイルの保存先ディレクトリが、/var/tmpから、/var/dbに変更されています(これまで記録してきた*.rrdファイルを引き継ぎたい場合は、ファイルを移動させるか、-db_dir /var/tmpを指定する)。そのほか、ほとんどのものは、引数でカスタマイズできるようにしてあるつもりです。
  • 一応、debianなリナックスと、Fedora Core 5なリナックスでも、動いています。smartmontoolsのほかに、ImageMagickとrrdtoolが必要です。

● ダウンロード(2006年7月31日版)

「smartmon-rrd.20060731.pl」をダウンロード

「smartmon-rrd.sample1.conf」をダウンロード

「smartmon-rrd.sample2.conf」をダウンロード

「smartmon-rrd.sample-graph.conf」をダウンロード

「smartmon-rrd.sh」をダウンロード

● confファイルのサンプル

confファイルの書式は、これまで、コマンドライン引数で指定するものと同じです。
ただし、「-daemon」というのを追加してください。
ディスクが複数個あるときは、1台につき1行で、記述していきます。
行頭に「#」をつけるとコメントになります。

一番単純なのは、こんなかんじです。

-daemon -host MYHOST -disk /dev/ad0  -monitor 1,7,9,12,194,195

● グラフ&HTMLファイル生成用のconfファイル

まだまだマヌケですみませんが、グラフ作成のときは、別のconfファイルを使ってください。例はこんなかんじです。

-host MYHOST -disk /dev/ad0  -monitor 1,7,9,12,194,195 -graph "6h,3d,1w,1m" -html MYHOST-ad0.html  -output /usr/local/www/data/SMART

ようするに、-graphと-htmlと-outputを指定してくれればOKです。ディスクが複数台あれば、複数行指定するのは同じです。6h,3d,1w,1mは、6時間、3日、1週間、1ヶ月のグラフを作るという意味です。

● confファイルを指定する場合の実行方法

引数で、confファイルを指定します。それだけ。

smartmon-rrd confファイル

● FreeBSD用rcファイルの見本

見よう見まねで、rcファイル(起動スクリプト)を作成してみました。以下のようなことをすれば、FreeBSD起動時にSMARTで監視するスクリプト自動起動します。

(1)上のほうのリンクで、ファイルsmartmon-rrd.shをダウンロードし、/usr/local/etc/rc.d/smartmon-rrdという名前でコピーする。

# cp smartmon-rrd.sh /usr/local/etc/rc.d/smartmon-rrd

(2)smartmon-rrd.plは、/usr/local/sbin/smartmon-rrdという名前でコピーする

# cp smartmon-rrd.pl /usr/local/sbin/smartmon-rrd

(3)/usr/local/etc/smartmon-rrd.confに、上記のようなconfファイルでの設定を記述する。

(4)/etc/rc.confに、以下の1行を追加する。

smartmon_rrd_enable="YES"

以上です。

■ 2006年8月1日追記

早々に、不具合やら気に入らない点が見つかったので修正。

  • /usr/local/bin/perlから、/usr/bin/perlに変更した。
  • confファイルに^Mが入っている場合の対処。
  • rrdtoolコマンド実行時のエラー処理を追加。
  • それから、LinuxなFedora Core 5で使える起動スクリプトを、見よう見まねで作ってみました。

● ダウンロード(2006年8月1日版)

● Fedora Core 5で自動起動するようにする方法のメモ

ダウンロードした*.rcファイルをコピー

# cp smartmon-rrd.rc /etc/init.d/smartmon-rrd

なんかよくわからないけど、こんなコマンドを実行。

# chkconfig --add smartmon-rrd

私はもともとLinuxは10年前にslackwareを使ったくらいしか経験がないので、chkconfigってのは、FreeBSDにはないし、よくわかりません。Solarisみたいに、symlink作ったものの、それだけじゃ、実行されないみたいだし・・・

こんなふうに、手動で起動したり、*.confを書き換えて再起動するとかができるようです。

# /etc/init.d/smartmon-rrd start
Starting smartmon-rrd: [  OK  ]

# /etc/init.d/smartmon-rrd restart
Shutting down smartmon-rrd: [  OK  ]
Starting smartmon-rrd: [  OK  ]

このへんは、最近のFreeBSDと同じですね・・・あ、言い忘れてましたが、FreeBSD 5.5と6.1でしか、動作確認していません。rcスクリプトまわりが、最近大きく変更されているので、古いFreeBSDでは自動起動スクリプトはそのままでは動かないような気がします。

以上です。