SDB Tools - S.M.A.R.T. D-B Tools Version 0.99a edition #01 (BETA)
(C) Copyright 2006, taro
SDB Tools MANUAL - SDB Tools マニュアル

 本プログラムは開発途中のベータ版です。 評価、実験には自由に利用してくださって構いませんが、転載・再配布は行なわないでください。
 このドキュメントも推敲が不十分で内容が間違っている箇所があるかもしれませんが、ご容赦願います。

- 目次 -


1-1 概要

 SDB ToolsはハードディスクのS.M.A.R.T.情報を記録・分析・管理するソフトウェアです。
 ハードディスクのS.M.A.R.T.情報を取得してネットワークを通じて転送するSDBクライアントと、 S.M.A.R.T.情報を登録・分析・管理するSDBサーバの2つのプログラムを中心に動作します。 複数のパソコンのS.M.A.R.T.情報を一括して管理でき、情報の閲覧・表示はWebブラウザから行えます。

 SDBクライアントにはWindows 2000/XP用とLinux(*1)用を用意しています。
 SDBサーバもWindowsおよびLinuxに対応していますが、別途Apache(Webサーバ)、 PostgreSQL(データベース)、PHP(スクリプト言語)といったソフトウェアが必要です。

 SDB ToolsのS.M.A.R.T.監視は秒単位、あいるは分単位以下の頻繁な監視には向いていません。
 監視するハードディスクが数台しかない場合や、SDBサーバの処理能力が高ければリアルタイムに近い監視も可能ですが、 ネットワークやサーバの負荷が大きくなります。
 SDBクライアントのS.M.A.R.T.データ収集は、5分から1時間程度の間隔が適当です。
 SDB Toolsでは数週間とか数ヶ月間といった長期間データを収集してステータスの変化を予測できますが、 収集データが大量にあると解析に時間がかかります。長期間のデータ収集を視野に入れている場合は、 1時間間隔のデータ収集でも十分役立ちます。
 ステータスの異常を監視するプログラムには短時間で検査するファストモードと、 収集したデータから将来の予測を行うロングモードがありますが、ファストモードは1時間毎、 ロングモードは1日1回程度の実行を想定しています。

*1  Linux用バイナリ(実行プログラムは)は収録していません。ソースコードからコンパイルしてください。


1-2 ファイル構成

 SDB ToolsはWindwos用はsdb-0.99a01-win.zipとして配布しています。zipファイルを展開すると、次のファイル・ディレクトリをsdb-0.99a01ディレクトリが得られます。
 Linux用はsdb-0.99a01-linux.tgzとして配布しています。内容はWindows用とほぼ同じですが、Linuxでは不要なrelaseディレクトリは収録していません。

ファイル/フォルダ 内容
manual\ マニュアル収録ディレクトリ
release\sdbctl.exe Windwos SDBクライアント
release\sdbtask.exe Windwos SDBクライアント(タスク登録用サブセット)
release\sdbwatch.exe Windwos 監視プログラム
release\libpq.dll Windows データベース(PostgreSQL)接続用DLL
release\sdb.def Windows 設定ファイル
sample\sdb-win.def Windows用 設定ファイル サンプル
sample\sdb-linux.def Linux用 設定ファイル サンプル
src\ ソースコード収録ディレクトリ
web\ Webサーバ用HTML収録ディレクトリ


1-3 実行環境

■ SDBクライアント

■ SDBサーバ

 Linux用はソースコードからコンパイルするために開発ツール(gcc,make等)が必要です。
 Linux用の動作確認はCentOS 4.3/Plamo Linux 3で行いました。


1-4 使用、転載、再配付について

 このプログラムの著作権は作者が保持しています。
 以下の条件に従って自由に使用してください。

  1.  著作権表示を変更しないこと。
  2.  このプログラムを使用したことによって生じた損害はまったく保証しない。
  3.  作者はこのプログラムに不備があっても、それを訂正する義務を負わない。
  4.  ベータ版につき転載・再配布は禁止します。
 感想・障害報告等、作者への連絡は、

e-mail taro.kobayashi@nifty.com

まで、願いします。
 電子メールでのお問い合わせは返事が遅れたり、あるいは返信のメールが行かないこともありますので、ご了承ください。
 開発途中のベータ版につき転載・再配布は禁止します。


1-5 説明・表記について

 コマンドプロンプトやコンソールでの実行例は次のように掲載しています。

C:\Documents and Settings\user> sdbctl  update  --disk  disk0  --smart_attr  194:word0
(省略)

 黄色の下線部分がユーザが入力した内容を表しています。表示の上では、複数行にわたっていても実際には改行せずに1行で入力してください。複数行として表示されている箇所ではスペース(空白)があるので、注意してください。
 入力部の最後に表示している水色の下矢印は、[Enter]キーを押すことを意味しています。この操作でコマンドが実行されます。

 入力内容の直前にあるプロンプトの部分(C:\Documents and Settings\user)は、環境によって内容は異なります。
 コマンドの実行結果や表示内容は省略することがあります。

 設定ファイルsdb.defの内容を示す場合は、次のように掲載しています。

SdbDevOpt   sdbDevOptTbl[] =        //[21]
{
    { "HDT722520DLAT80", "VD051BTDDM86GL", "--smart_attr 3:word0 --smart_attr 194:word0" }, //[22]
    { "ST3200822A" "3LJ160QK", "" },    //[23]
};

 画面サイズや表示の都合上、複数行に渡っていることがありますが、グレーの下矢印マークまでが1行です。
 赤色の部分は説明のために示しています。動作上は入力する必要はありませんが、コメントとして残してもかまいません。
設定ファイルの中では「//」移行はコメントとなります。


2 インストール/アンインストール

2-1 Windwos SDBクライアントのインストール

 基本的なインストール手順は、

  1. ファイルの展開・コピー
  2. S.M.A.R.T.情報の確認
  3. sdb.defファイルの編集
  4. デバイスをSDBサーバに登録
  5. タスク ケジュールに登録
となります。
 公開SDBサーバを利用するセットアップ方法はクイックスタート マニュアル(quickstart.htm)で説明していますので、そちらを参照してください。公開SDBサーバを利用すれば、ユーザはSDBサーバをセットアップする必要はありません(ただし、公開SDBサーバは負荷低減のため限定した機能しか提供していません)

 クイックスタート マニュアルの内容と重複する部分もありますが、ここでは全般的なセットアップ手順を紹介します。

1. ファイルを展開・コピー

 次のファイルを適当なフォルダにコピーしてください。
 以後の説明では<c:\sdb\bin>フォルダにインストールしたとして説明します。
(1)sdbctl.exe
(2)sdbtask.exe
(3)sdbwatch.exe
(4)sdb.def
(5)libpq.dll
 PostgreSQLを使用中で libpq.dll がWindowsディレクトリ等に存在している場合、(5) libpq.dllは必要ありませんが、バージョンの違いもあるのでコピーしておくことをお勧めします。

2. S.M.A.R.T.情報の確認

 まずはハードディスクのS.M.A.R.T.情報が取得・表示できるか確認します。これが正常に動作しないことにはSDBクライアントは利用できません。

2-1. コマンドプロンプトの実行

 [スタート]メニューから「プログラム」→「アクセサリ」→「コマンドプロンプト」を選択して、コマンドプロンプトを実行、開いてください。
 コマンドプロンプトが開いたら、SDBクライアントをインストールしたフォルダに移動します。

コマンド プロンプト
C:\Documents and Settings\user> cd  \sdb\bin

C:\sdb\bin>

2-2. S.M.A.R.T.情報を確認
 sdbctl showコマンドを実行して、ハードディスクのS.M.A.R.T.情報が表示できるか確認します。

sdbctl show
C:\sdb\bin>sdbctl  show
(省略)
DBOpen error!
Device disk0
Model   : HDT722520DLAT80
Firmware: V44OA96A
Serial  : VD051BTDDM86GL
Capacity: 200.0G
    ID# S.M.A.R.T. Attribute          Val Wst Ths Flags               RAW Value
      1 Raw Read Error Rate           100 100  16 --1-OP                      0
      2 Throughput Performance        100 100  50 ---1-P                      0
      3 Spin Up Time                  204 204  24 ---1OP         12,896,567,461
      4 Start/Stop Count              100 100   0 -1--O-                     19
      5 Reallocated Sectors Count     100 100   5 11--OP                      0
      7 Seek Error Rate               100 100  67 --1-OP                      0
      8 Seek Time Performance         100 100  20 ---1-P                      0
      9 Power-On Hours                100 100   0 -1--O-                  1,167
     10 Spin Retry Count              100 100  60 -1--OP                      0
     12 Device Power Cycle Count      100 100   0 11--O-                     19
    192 Power off Retract Count       100 100  50 11--O-                     65
    193 Load/Unload Cycle Count       100 100  50 -1--O-                     65
    194 Temperature                   161 161   0 ----O-        158,915,035,170
    196 Reallocation Event Count      100 100   0 11--O-                      0
    197 Current Pending Sector Count  100 100   0 1---O-                      0
    198 Uncorrectable Sector Count    100 100   0 --1---                      0
    199 UltraDMA CRC Error Rate       200 200   0 --1-O-                     13

 実行例のようにS.M.A.R.T.情報が表示されれば成功です。
 「DBOpen error!」と表示されかもしれませんが、接続するデータベースを設定していない状態ではこれで正常です。
 S.M.A.R.T.情報が表示されない場合はBIOSの設定を確認したり、--devオプションでデバイスを直接指定してください。
 sdbctl showコマンドは、デバイスの指定がない場合は、disk0(物理ドライブ 0番)から順番に探しますが、デバイスが存在しないと検索をやめます。ほとんど場合、ドライブは0番から連続していますが、プラグ&プレイ等で取り外し可能なドライブを使用していると途中の番号が抜けていることがあります。そういう場合は、「--dev disk4」を指定するなど、手動でドライブを指定してください。
 S.M.A.R.T.情報が表示できない場合、SDBクライアントは利用はできません。

2-3. RAW Valueの調整

 使用しているハードディスクによってはRAW Valueの表示形式を指定したほうが良いことがあます。
 一部のハードディスクでは、RAW Valueに最大・最小値や平均値といった複数の情報が含まれていることがあります。
 先ほどの例では、S.M.A.R.T.情報のID#194 Temperatureがこれにあたります。ID#194 Temperatureは温度ですが、RAW Valueは158,915,035,170と温度としてもありえない数値を示しています。
 こういう場合は、sdbctlコマンドに「--smart_attr 194:divword」オプションを指定すると、3つの値に分解して表示してくれます。
 わかりにくいかもしれませんが、ID#3 Spin Up Time も、3つに分解すると正しい値を表示します。
 --smart_attrオプションを指定するには、--devオプションも合わせて必要なので、次のように指定します。

ex.2-1:
C:\sdb\bin>sdbctl  show  --dev  disk0  --smart  attr  3:divword  --smart_attr  194:divword
(省略)
DBOpen error!
Device disk0
Model   : HDT722520DLAT80
Firmware: V44OA96A
Serial  : VD051BTDDM86GL
Capacity: 200.0G
    ID# S.M.A.R.T. Attribute          Val Wst Ths Flags               RAW Value
      1 Raw Read Error Rate           100 100  16 --1-OP                     0
      2 Throughput Performance        100 100  50 ---1-P                     0
      3 Spin Up Time                  204 204  24 ---1OP     165    178      3
      4 Start/Stop Count              100 100   0 -1--O-                    19
      5 Reallocated Sectors Count     100 100   5 11--OP                     0
      7 Seek Error Rate               100 100  67 --1-OP                     0
      8 Seek Time Performance         100 100  20 ---1-P                     0
      9 Power-On Hours                100 100   0 -1--O-                 1,167
     10 Spin Retry Count              100 100  60 -1--OP                     0
     12 Device Power Cycle Count      100 100   0 11--O-                    19
    192 Power off Retract Count       100 100  50 11--O-                    65
    193 Load/Unload Cycle Count       100 100  50 -1--O-                    65
    194 Temperature                   161 161   0 ----O-      34     19     37
    196 Reallocation Event Count      100 100   0 11--O-                     0
    197 Current Pending Sector Count  100 100   0 1---O-                     0
    198 Uncorrectable Sector Count    100 100   0 --1---                     0
    199 UltraDMA CRC Error Rate       200 200   0 --1-O-                    13

3. sdb.defファイルの編集

 SDB Toolsを使うためには環境に合わせてsdb.defファイルを編集しておく必要があります。
 また、RAW Valueを正しく表示するのに毎回--smart_attrオプションを指定するのは大変です。こういう場合は、sdb.defファイルに登録しておくとパラメータの指定を省略できます。
 メモ帳などのテキストエディタでインストールしたsdb.defファイルを開いてください。

 先ほどの操作の続きで、コマンドプロンプトからメモ帳を開いてsdb.defを編集する場合は次のように入力してください。

メモ帳を開く
C:\sdb\bin>notepad  sdb.def

 sdb.defファイルの内容は次のようになっています。

ex.2-1:

string  sdb_db_host = "sdb-server"; //[1] データベース(PostgreSQL)のアドレス
string  sdb_db_port = "5432";       //[2] データベースのポート
string  sdb_db_user = "sdb_user";   //[3] データベースのユーザー名
string  sdb_db_pass = "sdb_pass";   //[4] データベースのパスワード
string  sdb_db_name = "sdb";        //[5] データベース名

string  sdb_http_post_host = "www.runser.jp";       //[6] HTTP SDBサーバ アドレス
string  sdb_http_post_port = "80";                  //[7] HTTP ポート
string  sdb_http_post_path = "/sdb/sdbpost.php";    //[8] HTTP パス

string  sdb_sub_dir = "c:\\sdb\\log";   //[9] エラー発生時データ保存用フォルダ

int     sdb_mail_warnlevel   = 3;   //[10] 警告レベル 0=off, 1=failure, 2=high, 3=mid, 4=low
string  sdb_mail_from        = "your@mail-addr";    //[11] 送信元メールアドレス
string  sdb_mail_to          = "your@mail-addr";    //[12] 送信先メールアドレス
string  sdb_mail_smtp_server = "your-mail-server";  //[13] SMTPサーバのアドレス
int     sdb_warn_high_estimate = 3; // [14] high
int     sdb_warn_mid_estimate = 14; // [15] mid
int     sdb_warn_low_estimate = 30; // [16] low

int     sdb_auto_raw_word_id = 9;       //[17]
int     sdb_random_wait_sec = 30;       //[18]
int     sdb_dialog_auto_close_sec = 15; //[19]

struct SdbDevOpt    // [20] 編集・変更しないでください
{
    string      model;
    string      serial;
    string      option;
};

SdbDevOpt   sdbDevOptTbl[] =    //[21]
{
 { "HDT722520DLAT80", "VD051BTDDM86GL", "--smart_attr 3:word0 --smart_attr 194:word0" }, //[22]
 { "ST3200822A" "3LJ160QK", "" }, //[23]
};

 LAN/イントラネット環境でデータベースに直接接続する場合は[1]〜[5]をSDBサーバに合わせて正しく設定しておく必要があります。
 インターネット経由のHTTPモードで使用するには[3]〜[5]のデータベースのユーザ名/パスワード/データベース名と、[9]〜[8]のHTTPサーバのアドレス/ポート/パスの設定が必要です。公開SDBサーバを利用する場合は、このサンプルのままでかまいません。
 [9]はSDBサーバにS.M.A.R.T.情報が記録できなかった場合に、データを保存するためのディレクトリです。

 RAW Valueの調整で--smart_attrオプションを使いたい場合は、sdb.defファイルの中に指定しておくことができます。
 [21]に「SdbDevOpt sdbDevOptTbl[] =」という内容がありますが、[22]のように「{"モデル名", "シリアル" , "オプション" }」という形式で追加します。複数のハードディスクがある場合、[23]のように続けて何台でも指定できます。
 モデル名やシリアルは正確に入力してください。1文字でも間違うと、正しく動作しないので、コマンドプロンプトの表示内容からコピーして貼り付け(ペースト)することをお勧めします。

 編集が終わったらsdb.defを保存してください。

4. SDBサーバにデバイスを登録

 sdbctl addコマンドを実行してデバイスをSDBサーバに登録します。
 showコマンドと同じように、--devオプションを省略するとdisk0から順番に処理しますが、なるべく--devオプションでドライブを指定してください。
 公開SDBサーバを利用する方法はクイックスタート マニュアル(quickstart.htm)で説明していますので、そちらを参照してください。ここでは、LAN/イントラネット環境でデータベースに直接接続して使用する場合を例に説明します。
 確認のダイアログが表示されたら、[はい]ボタンをクリックしてください。

sdbctl add
C:\sdb\bin>sdbctl  add  --dev  disk0
(省略)

 デバイスを登録したら、sdbctl updateコマンドを実行して、動作確認を行います。

sdbctl update
C:\sdb\bin>sdbctl  update  --dev  disk0
(省略)
Random wait 14 sec
Device disk0
Model : HDT722520DLAT80
Firmware: V44OA96A
Serial : VD051BTDDM86GL
Capacity: 200.0G

 sdbctl updateを実行すると、SDBサーバのデータベースにS.M.A.R.T.情報が記録されます。
 updateコマンドはランダムに待ち時間が入ります。しばらく動作が停止したような状態になりますが、そのまま待ってください。待ち時間は初期設定のままなら最大30秒です。
 連続して何度も実行すると、そのつどデータが記録されるので注意してください。

5. タスク スケジュールに登録

 先ほど説明したようにsdbctl updateを実行するとSDBサーバにS.M.A.R.T.記録できるので、後はこれを定期的に繰り返し実行します。
 ただし、sdbctlコマンドはコマンドプロンプト用のプログラムで、実行すると必ずコマンドプロンプトが開いてデスクトップ環境では邪魔なことがあります。このため、S.M.A.R.T.情報の記録・更新には専用のプログラムsdbtask.exeを使います。
 このsdbtask.exeをWindowsのタスク スケジュールに登録して、繰り返し実行するようにします。

 タスク スケジュールへの登録方法は、クイックスタート マニュアル(quickstart.htm)に詳しく説明しているので、そちらを参照してください。クイックスタート マニュアルは公開SDBサーバの使用が前提で--httpオプションを指定していますが、LAN/イントラネット環境でデータベースに直接接続して使用する場合は、--httpオプションは不要です。
 5分〜1時間くらいの間隔で実行するように設定しておけば十分かと思います。5〜10分とか実行間隔が短いほうが、異常をすぐに検出できますが、故障予測には間隔の長短は重要ではありません。故障予測には長期間(数週間以上)継続してデータを記録・蓄積することが重要となります。

2-2 Windows SDBクライアントの削除(アンインストール)

 タスク スケジュールに登録したアイテムを削除して、インストールしたフォルダ(c:\sdb\bin等)を削除してください。

2-3 Linux SDBクライアントのインストール

 Linux用バイナリ(実行ファイル)は収録していないので、ソースコードからコンパイルしてください。
 コンパイルするにはPostgreSQLのソースコードも必要です。

 src/sdbctlディレクトリに移動して、configure、make、make installの手順でコンパイル、インストールしてください。
 configureでは、--with-pgsrcオプションでPostgreSQLソースコードのディレクトリを指定してください。
 make installはrootで行ってください。
 標準では/usr/local/sdbディレクトリにインストールします。ディレクトリを変更する場合はconfigureに--prefixオプションを指定してください。

ex.1.5.X: configure実行例
~$ ./configure  --with-pgsrc=/usr/local/src/pgsql/postgresql-8.1.3
(省略)

~$ make
(省略)

~$ su  root
(省略)

~# make  install
(省略)

 続いて、src/sdbwatchディレクトリに移動して、sdbctlと同様にconfigure、make、make installの手順でコンパイル、インストールしてください。

 Linux用の設定ファイルはサンプルをsample/sdb-linux.defとして収録していますので、これをsdb.defというファイル名で/usr/local/sdb/etcにsdb.defに格納してください。sdb.defファイルの内容は各自の環境に合わせて変更してください。

 設定、運用方法はWindowsとほぼ同じですので、Windows版SDBクライアントの説明を参照してください。
 Linuxでは--devオプションで指定するデバイスは「--dev /dev/hda」のようにデバイスファイルを指定します。
 S.M.A.R.T.情報の記録・更新はsdbctlコマンドをcronを使って5分から1時間程度の間隔で実行してください。

2-4 Linux SDBクライアントの削除(アンインストール)

 cronに登録したプログラムを削除して、インストールしたフォルダ(/usr/local/sdb等)を削除してください。


2-4 あると便利なソフトウェア

 SDB Toolsを使う際、以下のプログラム/ソフトウェアをそろえておくと便利かと思います。

 以下のWebページからダウンロードして入手できます。
http://www.runser.jp/softlib.html

 DevTestはコマンドプロンプト用のプログラムですが、ハードディスク、CD/DVDドライブ等の様々なドライブ情報を表示できます。
 たとえば、「devtest disk」として実行すれば、sdbctlに指定できる物理ドライブ番号(disk0等)が表示されます。
 ドライブの指定セクタのデータ内容をダンプ表示して確認することもできます。たとえば、「devtest C: --dump 0」とするとCドライブのMBR(マスターブートレコード)の内容が表示されます。


3 プログラム・コマンド仕様詳細

表記説明
角かっこ [ ]省略可能な項目
中かっこ { }縦棒(|) で区切られた選択肢のうち、いずれか1つを選択できる。例:{start|stop}
・・・繰り返し指定できるパラメータ。
< >特定の書式をもつパラメータ。例:<数値>、<デバイス>


3-1 sdbctl

 sdbctlコマンドはSDBクライアント、SDBサーバの双方で使用するコマンドライン用プログラムです。
 ハードディスクのS.M.A.R.T.情報を取得してSDBサーバに記録する機能と、SDBサーバのデータベースをメンテナンス・操作する機能が備わっています。

sdbctlコマンド書式

sdbctl  <コマンド>  [--csvfile <ファイル名>]  [--db_host <アドレス>]  [--db_name <データベース名>]  [--db_pass <パスワード>]  [--db_port <ポート>]  [--db_user <ユーザ>]  [--deffile <ファイル名>]  [--help]  [--http]  [--http_auth <確証方式>]  [--http_pass <パスワード>]  [--http_user <ユーザ名>]  [--random_wait <秒>]  
  [--dev <デバイス>  [--groupname <グループ名>]  [--hostname <ホスト名>]  [--memo <テキスト>]  [--smart_attr <属性ID>:<RAWタイプ>[:<テキスト>]]・・・  [--user_pass <確証コード>]]・・・

【解説】

 show/add/delete/updateコマンドは--devオプションで指定したデバイスに対して操作を行います。Windows版では--devオプションの指定がない場合はdisk0から順番に検索して実行します。デバイスが存在しないためエラーが発生した時点で操作を止めます。Linux版ではデバイスの自動検索は行いません。
 loadコマンドも--devオプションで指定したデバイスに対して操作を行います。--devオプションの指定がない場合、CSV・ログファイルに記録されているすべてのデバイスが対象となります。

 データベース接続とHTTPモードに関するオプションは設定ファイルsdb.defでも指定できますが、設定ファイルとコマンドラインの両方に指定がある場合は、コマンドラインのほうが優先されます。

■ sdbctl show : デバイス情報の表示

 デバイスのS.M.A.R.T.情報を表示します。

■ sdbctl createdb : データベースの作成

 SDBサーバのデータベースを作成して初期化します。
 具体的にはデバイス情報を格納するdevというテーブルを作成します。既にテーブルが存在する場合はエラーとなります。
 このコマンドは、SDBサーバのデータベースに直接接続して実行する必要があります。

■ sdbctl dropdb : データベースの削除

 SDBサーバのデータベースをすべて削除します。
 具体的にはデバイス情報を格納するdevというテーブルと、各デバイスのS.M.A.R.T.情報が記録されたsmt_という名前で始まるテーブルを削除します。
 このコマンドは、SDBサーバのデータベースに直接接続して実行する必要があります。

■ sdbctl add : デバイスをデータベースに追加

 デバイスをSDBサーバに追加します。
 S.M.A.R.T.情報を記録するためには、このコマンドでデバイスをSDBサーバに追加・登録しておく必要があります。
 指定のデバイスが既に登録されている場合はエラーとなります。

■ sdbctl delete : デバイスをデータベースから削除

 デバイスをSDBサーバから削除します。
 このコマンドは、SDBサーバのデータベースに直接接続して実行する必要があります。

■ sdbctl load : CSV・ログファイルを読み込んでデバイス情報を更新

 CSV形式のログファイルに記録されているS.M.A.R.T.情報をデータベースに記録します。
 このコマンドは、SDBサーバのデータベースに直接接続して実行する必要があります。
 udapeコマンド実行時にSDBサーバが停止していたりエラーが発生して記録ができなかった場合、ログファイルにデータを保存します。loadコマンドはこのログファイルの内容を読み込み、データベースに記録します。
 --csvfileオプションで読み込むファイルを指定できます。

■ sdbctl update : デバイス情報を更新

 デバイスのS.M.A.R.T.情報を取得して、SDBサーバに記録します。
 S.M.A.R.T.情報をSDBサーバに記録するためには、sdbctl addコマンドでデバイスを追加・登録しておく必要があります。
 実行時にランダムに待ち時間が入ります。これはSDBサーバの負荷低減のための処理です。待ち時間は--random_waitオプション、または設定ファイルsdb.defのsdb_random_wait_sec変数で指定・変更できます。


3-2 sdbtask

 sdbtaskはWindows用SDBクライアントで、sdbctl updateコマンドと同等の機能を持っています。
 sdbctlコマンドをタスク スケジュールから実行するとコマンドプロンプトが必ず開くので、これを回避するために用意しています。

 オプションはsdbctl updateコマンドと共通ですので、詳細はsdbctlの解説を見てください。

sdbctl  update  [--db_host <アドレス>]  [--db_name <データベース名>]  [--db_pass <パスワード>]  [--db_port <ポート>]  [--db_user <ユーザ>]  [--deffile <ファイル名>]  [--help]  [--http]  [--http_auth <確証方式>]  [--http_pass <パスワード>]  [--http_user <ユーザ名>]  [--random_wait <秒>]  
  [--dev <デバイス>  [--groupname <グループ名>]  [--hostname <ホスト名>]  [--memo <テキスト>]  [--smart_attr <属性ID>:<RAWタイプ>[:<テキスト>]]・・・  [--user_pass <確証コード>]]・・・


3-3 sdbwatch

 sdbwatchコマンドはSDBサーバに記録されたS.M.A.R.T.情報を監視し、異常があれば知らせるプログラムです。

sdbwatchコマンド書式

sdbwatch  watch  [--db_host <アドレス>]  [--db_name <データベース名>]  [--db_pass <パスワード>]  [--db_port <ポート>]  [--db_user <ユーザ>]  [--deffile <ファイル名>]  [--disable_title]  [--fast]  [--help]  [--long]  [--offline_margin <秒>]  [--prev_time <秒>]  [--sendmail]  
  [--dev <デバイス>  [--groupname <グループ名>]  [--hostname <ホスト名>]  [--model <モデル>]  [--serial <シリアル>]]・・・


4-1 監視用テーブル設定

 sdbwatchコマンドを使うことでS.M.A.R.T.情報を監視し、異常を検出できますが、監視方法や警告レベル等をカスタマイズすることが可能です。
 監視方法をカスタマイズするには、データベースに監視用のテーブルを作成しておく必要があります。このテーブルの作成を行うのが、createwatch.phpというPHP用スクリプトです。このスクリプトはtools\createwatch.phpとして収録しています。
 設定内容はsdbwatch.incというファイルに記述されていますので、これをテキストエディタで編集してください。データベースへの接続方法やユーザ、パスワードはphplin/sdblib.incに記述されていますので、必要ならこのファイルも編集してください。
 テーブルを作成する場合は「php createwatch.php」として実行します。

 設定は$SdbWatchTblという配列に格納されます。配列の各要素は更に次のキーを持つ連想配列として指定します。
キー 内容
model デバイスのモデル名
serial デバイスのシリアル
attr_id 属性ID
watch 監視方式
warn 警告レベル
op 比較条件
right 比較対象

 PHPスクリプトの中では、次のように形式で記述します。


$SdbWatchTbl = array(
// [1] 監視条件 No.1
array("model"=><モデル>, "serial"=><シリアル>, "attr_id"=><属性ID>, "watch"=><監視方式>, "warn"=><警告レベル>, "op"=><比較条件>, "right"=><比較対象>),
// [2] 監視条件 No.2
array("model"=><モデル>, "serial"=><シリアル>, "attr_id"=><属性ID>, "watch"=><監視方式>, "warn"=><警告レベル>, "op"=><比較条件>, "right"=><比較対象>),



// [N] 監視条件 No.N
array("model"=><モデル>, "serial"=><シリアル>, "attr_id"=><属性ID>, "watch"=><監視方式>, "warn"=><警告レベル>, "op"=><比較条件>, "right"=><比較対象>),
);

 複数の監視条件が指定されている場合、登録されている順番に処理します。
 modelが指定されている監視条件を処理すると、以後は同じmodelの監視条件だけを処理します。
 たとえば、次のようにmodelを省略した監視条件[A]と、mdoelに「HD1」を指定した監視条件[B]を設定したします。この場合、HD1というモデルのハードディスクは[A]、[B]両方の監視条件を処理します。


$SdbWatchTbl = array(
// [A] Start/Stop Countが50000回を超えた
array("model"=>"", "attr_id"=>  4, "watch"=>SDB_WATCH_RAW_VALUE   , "warn"=>SDB_WARN_MID, "op"=>">", "right"=>"50000"), 

// [B] Start/Stop Countが5000回を超えた
array("model"=>"HD1", "attr_id"=>  4, "watch"=>SDB_WATCH_RAW_VALUE , "warn"=>SDB_WARN_MID, "op"=>">" ,"right"=>"5000"),
);

 しかし、次のように監視条件の登録順序を[B]→[A]に変更すると、HD1というモデルのハードディスクは最初の監視条件[B]だけを処理します。


$SdbWatchTbl = array(
// [B] Start/Stop Countが50000回を超えた
array("model"=>"HD1", "attr_id"=>  4, "watch"=>SDB_WATCH_RAW_VALUE , "warn"=>SDB_WARN_MID, "op"=>">" ,"right"=>"50000"),

// [A] Start/Stop Countが5000回を超えた
array("model"=>"", "attr_id"=>  4, "watch"=>SDB_WATCH_RAW_VALUE   , "warn"=>SDB_WARN_MID, "op"=>">", "right"=>"5000"),
);

警告レベルについて

 警告レベルにはSDB_WARN_OFF、SDB_WARB_FAILURE、SDB_WARN_HIGH、SDB_WARN_MID、SDB_WARN_LOWの5種類があります。
 監視条件にSDB_WARN_OFFを指定した場合、警告は無効となります。つまり、S.M.A.R.T.エラーを検出しても警告やエラーにはなりません。
 SDB_WARB_FAILUREは属性値が閾値(Threshold)以下になるような明らかなエラーや異常を検出した場合です。
 それ以外の、SDB_WARN_HIGH、SDB_WARN_MID、SDB_WARN_LOWは警告の状態を高・中・低によって指定できます。

 設定ファイルsdb.defに「sdb_mail_warnlevel」という項目があり、指定レベル以上の警告エラーを検出した場合にメールを送信します。次の例では、警告レベルがSDB_WARN_FAILUREかSDB_WARN_HIGHでメールを送信します。

sdb.def: sdb_mail_warnlevel 設定例
int sdb_mail_warnlevel   = 2;   // 0=off, 1=failure, 2=high, 3=mid, 4=low

 また、ロングモードでは属性値が閾値(Threshold)に達するまでの期間や、RAW Valueが指定の値に達するまでの期間を予測・分析しますが、残り時間に応じて警告を発することができます。
 デフォルトでは残り時間が3日、14日、30日以内でそれぞれSDB_WARN_HIGH、SDB_WARN_MID、SDB_WARN_LOWの警告を発します。
 この期間を変更したい場合は、次の変数をsdb.defに追加してください。

sdb.def: 設定例
# 将来予測による警告レベル(日数で指定)
int sdb_warn_high_estimate = 3; // high 
int sdb_warn_mid_estimate = 14; // mid 
int sdb_warn_low_estimate = 30; // low 

監視条件のRAW Valueについて

 監視条件で比較・操作するRAW Valueは、--smart_attrオプションで指定した形式を扱います。
 特に指定がない場合、RAW Valueは48ビット整数として扱いますが、--smart_attrオプションでdivword/word0/word1/word2等が指定されている場合は16ビット整数として扱います。

 また、一部のハードディスクは、属性ID #9の稼働時間が分単位で記録されていますが、16ビットの最大値65535分(約45日)で溢れて0に戻ってしまうことがあります。このため、属性ID #9のRAW Valueが65000から0に戻ってしまうような変化を検出した場合は、自動的に桁を繰り上げて、稼働時間が連続するように処理します。
 この処理を行う属性ID番号は、設定ファイルsdb.defのsdb_auto_raw_word_id変数で指定しています。

sdb.def: sdb_auto_raw_word_id 設定例
int sdb_auto_raw_word_id = 9;

監視条件の設定例


$SdbWatchTbl = array(
// 「ID#5 Reallocated Sectors Count」が変化したら警告(中)
array("attr_id"=>5, "watch"=>SDB_WATCH_ATTR_VALUE, "warn"=>SDB_WARN_MID, "op"=>"<" ,"right"=>"prev"),
array("attr_id"=>5, "watch"=>SDB_WATCH_RAW_VALUE , "warn"=>SDB_WARN_MID, "op"=>">" ,"right"=>"prev"),

// Maxtorモデル「ID#9 Power-On Minute」が 900000分(1万5000時間)を越えたら警告(中)
array("model"=>"Maxtor", "attr_id"=>9, "watch"=>SDB_WATCH_RAW_VALUE , "warn"=>SDB_WARN_MID, "op"=>">" ,"right"=>"900000"),

// 「ID#9 Power-On Hours」が 1万5000時間を越えたら警告(中)
array("attr_id"=>9, "watch"=>SDB_WATCH_RAW_VALUE , "warn"=>SDB_WARN_MID, "op"=>">" ,"right"=>"15000"),

// 「ID#194 Temperature」が 10度以下、60度以上になったら警告(高)
array("attr_id"=>194, "watch"=>SDB_WATCH_RAW_VALUE , "warn"=>SDB_WARN_HIGH, "op"=>"<=" ,"right"=>"10"),
array("attr_id"=>194, "watch"=>SDB_WATCH_RAW_VALUE , "warn"=>SDB_WARN_HIGH, "op"=>">=" ,"right"=>"60"),

// 「ID#194 Temperature」の属性値・閾値は予測分析はしない
array("attr_id"=>194, "watch"=>SDB_WATCH_ATTR_ANALYS, "warn"=>SDB_WARN_OFF, "op"=>"" ,"right"=>"off"),

// 「ID#196 Reallocation Event Count」が変化したら警告(中)
array("attr_id"=>196, "watch"=>SDB_WATCH_ATTR_VALUE, "warn"=>SDB_WARN_MID, "op"=>"<" ,"right"=>"prev"),
array("attr_id"=>196, "watch"=>SDB_WATCH_RAW_VALUE , "warn"=>SDB_WARN_MID, "op"=>">" ,"right"=>"prev"),

// 「ID#197 Current Pending Sector Count」が変化したら警告(高)
array("attr_id"=>197, "watch"=>SDB_WATCH_ATTR_VALUE, "warn"=>SDB_WARN_HIGH, "op"=>"<" ,"right"=>"prev"),
array("attr_id"=>197, "watch"=>SDB_WATCH_RAW_VALUE , "warn"=>SDB_WARN_HIGH, "op"=>">" ,"right"=>"prev"),

);


4-2 設定ファイルsdb.def

 設定ファイルsdb.defには次の変数が使用できます。

変数 内容
sdb_db_host string データベースのアドレス
sdb_db_port string データベースのポート番号
sdb_db_user string データベースのユーザ名
sdb_db_pass string データベースのパスワード
sdb_db_name string データベースの名前
sdb_http_post_host string HTTPモード使用時 SDBサーバのアドレス
sdb_http_post_port string HTTPモード使用時 SDBサーバのポート
sdb_http_post_path string HTTPモード使用時 SDBサーバのパス
sdb_sub_dir string エラー発生時のS.M.A.R.T.情報の保存ディレクトリ
sdb_mail_warnlevel int メールを送信する警告レベル
sdb_mail_from string 送信元のメールアドレス
sdb_mail_to string 送信先のメールアドレス
sdb_mail_smtp_server string SMTPサーバのアドレス
sdb_warn_high_estimate int 予測により警告「高」を出す残り日数
sdb_warn_mid_estimate int 予測により警告「中」を出す残り日数
sdb_warn_low_estimate int 予測により警告「低」を出す残り日数
sdb_auto_raw_word_id int 16ビット整数を自動的に繰り上げする属性ID
sdb_random_wait_sec int sdbtask実行時にランダムにウェイトを入れる最大秒数
sdb_dialog_auto_close_sec int sdbtask実行時に警告ダイアログを表示する秒数
sdbDevOptTbl SdbDevOpt[] デバイス オプション
 次のモデル、シリアル、オプションを持つ構造体の配列です。
struct SdbDevOpt
{
string model;
string serial;
string option;
};
 optionには、sdbctlコマンドのデバイス関連オプション --groupname、--hostname、--smart_attr、--user_passが指定できます。


4-3 注意・制限事項


付録A 参考

 SDB Toolsを開発するにあたって次の資料・ソフトウェアを参考にしました。


付録B 変更履歴