SDB Tools - S.M.A.R.T. D-B Tools Version 0.99a edition #01 (BETA)
(C) Copyright 2006, taro
SDB Server Setup Manual - SDBサーバ セットアップ マニュアル

 ここではSDBサーバのセットアップ手順を説明します。
 SDBサーバは使うためには別途、WebサーバApache、スクリプト言語PHP、データベースPostgreSQLが必要ですが、これらのソフトウェアのインストール方法等はここでは説明していません。
 またバージョンによっては本説明で取り上げている内容とは操作や設定が異なる場合があります。既にWebサーバやデータベースを運用しているパソコンにSDBサーバをインストールする場合は、本説明で示しているディレクトリや名前がそのままでは使えないことがあるかもしれません。本説明のでのディレクトリやデータベース、ユーザの名前は例として挙げているだけですので、各自で変更・カスタマイズしてください。
 SDBサーバはApache/PHP/PostgreSQLがあればWindwosでもLinuxでも動作します。ただし、HTMLやPHP用スクリプトの日本語コードはWindows環境で一般的なシフトJISではなくEUCを使っているので注意してください。

 基本的なセットアップ手順は、

  1. ファイルの展開・コピー
  2. データベースの設定
  3. 設定ファイルの編集
  4. データベースの初期化
  5. Webサーバの設定
  6. 監視用プログラムの設定
となります。
 必要ならSDBクライアントがWebサーバやデータベースにアクセスできるように、セキュリティやファイヤウォール等の設定を行ってください。

ファイルの展開・コピー

 収録ファイルにはインストール作業行うスクリプト/バッチファイルを用意しています。Linuxではsetup-linux.shを(rootで実行してください)、Windwosではsetup-win.batを実行してください。パラメータにはインストール先のディレクリトを指定できます。インストール先を省略した場合、Linuxでは /usr/local/sdb/http 、Windwosではc:\sdb にインストールします。
 これらのスクリプト/バッチファイルはファイルをコピーするだけです。Apache、PostgreSQL等の設定は手動で行います。

 また、SDBクイラアント用のプログラムもインストールしてください。Windows用のsetup-win.batを実行した場合はSDBクライアント用プログラムもインストールされますが、そうでない場合は手動でインストールしてください。
 Windows環境ではsdbctl.exe、sdbwatch.exe、sdb.def、libpq.dllの4つ、Linux環境ではsdbctl、sdbwatch、sdb.defの3つのファイルが必要です。
 SDBクライアント用プログラム・ファイルの中にはSDBサーバには不要なものもありますが、SDBサーバにするパソコンでSDBクライアントを動かしてS.M.A.R.T.情報を取得・監視できますので、すべてインストールしておくことをお勧めします。
 SDBクライアントのインストール・設定方法はSDB Toolsマニュアル(sdbtools.htm)か、Windowsではクイックスタート マニュアル(quickstart.htm)の中で説明しています。

データベースの設定

 PostgreSQLでS.M.A.R.T.情報を記録するデータベースを作成・設定します。
 必要な設定は、sdb_userというユーザを追加して、そのパスワードを「sdb_pass」に設定します。また、「sdb」という名前でデータベースを作成して、ユーザsdb_userが操作できるように設定します。
 設定・操作方法は色々と考えられますが、ここではデータベースsdbの、所有者をsdb_userにします。
 以後の操作はPostgreSQLのスーパーユーザ(通常はpostgresかと思います)で行ってください。

ユーザの作成

 PostgreSQLに「sdb_user」というユーザを追加します。パスワードは「sdb_pass」とします。
 「psql sdb」でpsqlを実行して、CREATE USER を実行してください。

ユーザの作成
postgres=> CREATE  USER  sdb_user  WITH  PASSWORD  'sdb_pass';

 後からユーザのパスワードを変更したい場合は、次のようにします。

パスワードを変更
postgres=> ALTER  USER  sdb_user  WITH  PASSWORD  'sdb_pass';

 SDBクライアントはここで作成したsdb_userというアカウントでデータベースを操作するので、データベースやユーザの操作権限は最小限にしておいたほうがいいでしょう。

データベース作成

 「sdb」という名前のデータベースを作成します。所有者は「sdb_user」とします。
 psqlから、CREATE DATABASE を実行します。

データベース作成
postgres=> CREATE  DATABASE  sdb  WITH  OWNER=sdb_user;

 後からデータベースの所有者をsdb_userに変更するときは次のようにします。

データベースの所有者を変更
postgres=> ALTER  DATABASE  sdb  OWNER  TO  sdb_user;

pg_hba.conf、postgresql.confの編集

 公開SDBサーバのようにHTTPモードを使うなら必要ありませんが、SDBクライアントを実行する各パソコンが直接データベースを操作するためにはPostgreSQLのクライアント確証の設定が必要です。
 LANにあるパソコンがデータベースに接続できるように、PostgreSQLのpg_hba.confとpostgresq.confを編集します。
 pg_hba.confではクライアント確証方式を指定します。確証方式はcrypto/md5/password/trust等が選択できますが、通常は推奨されているmd5を選択するのがいいでしょう。trustは無条件に接続を許可する方式ですのでお勧めできません。PostgreSQLのバージョンによって形式が異なりますので、使用しているPostreSQLに合わせて設定してください。

 たとえば、LANにあるパソコンのIPアドレスが192.168.1.1〜192.168.1.254、サブネットマスクが255.255.255.0として設定されているなら、次のような内容を追加します。

PostgreSQL 7.4:pg_hba.confの例
host    all         all         192.168.1.0       255.255.255.0     md5

PostgreSQL 8.1:pg_hba.confの例
host    all         all         192.168.1.0/24        md5

 加えてpostgresql.confにある「listen_addresses」を設定しておく必要があります。デフォルトでは「#」でコメントアウトされていると思います。SDBサーバのIPアドレスが「192.168.1.35」なら次のように設定します。

postgresql.confの例
listen_addresses = 'localhost,192.168.1.35'

 すべてのインターフェースから接続を受け付ける場合は次のように設定しておくこともできます。

postgresql.confの例
listen_addresses = '*'

 pg_hba.confやpostgresql.confの設定を変更した場合、PostgreSQLの構成のリロードか、サービスの再起動が必要です。

 以上でデータベースの準備は終了です。

設定ファイルの編集

 SDBクライアント用プログラムに含まれるsdb.defファイルと、Webサイト用のPHP用スクリプトsdbsite.incをユーザに環境に合わせて編集します。
 sdb.defはSDBクライアントでも使用しますが、ここではSDBサーバの関係する項目を説明します。SDBクライアントの関係する箇所につしては、SDBクラアントの説明を見てください。

sdb.defファイルの内容例

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 = "/usr/local/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]
};

 [1]〜[5]はデータベースPostgreSQLに関する設定です。データベースやユーザの名前を本説明の例と同様に設定したなら変更は不要です。

 [10]〜[13]は、S.M.A.R.T.情報を監視して異常を検出するための設定です。
 異常を検出したときにメールで通知したい場合には、[11]〜[13]を設定してください。

 PHP用のsdblib.incとsdbsite.incも編集しておく必要があります。これはHTMLファイルを格納したphplibディレクトリ(本説明と例と同じようにインストールした場合、Linuxでは/usr/local/sdb/http/phplib、Windowsではc:\sdb\http\phplib)にあります。
 データベースやユーザの名前を本説明の例と同様に設定した場合、変更する必要はないと思いますが、念のために確認してください。

sdblib.inc(一部)

define("SDB_DEFAULT_HOST"  , "localhost");
define("SDB_DEFAULT_PORT"  , "5432");
define("SDB_DEFAULT_USER"  , "sdb_user");
define("SDB_DEFAULT_PASS"  , "sdb_pass");
define("SDB_DEFAULT_DBNAME", "sdb");
define("SDB_DEV_TBLNAME"   , "dev");
define("SDB_WAT_TBLNAME"   , "wat");

sdbsite.inc(一部)

define("SITE_TITLE"           , "SDB");
define("SDB_INTERNAL_ENC"     , "EUC-JP");
define("SDB_OUTPUT_ENC"       , "EUC-JP");
define("SDB_HTML_WIDTH"       , "620");
define("SDB_TOP_PAGE"         , "index.php");
define("SDB_GRAPH_IMGTYPE"    , "png"); //  "gif", "png", "jpeg"
define("SDB_GRAPH_ALL"        , TRUE);  // 全属性のグラフ表示
define("SDB_GRAPH_OFFLINE_SEC", 3660);  // グラフ・オフライン・タイム
define("SDBWATCH_PATH"        , "/usr/local/sdb/bin/sdbwatch");
define("SDB_HTTPPOST_DAY_MAX" ,  900);  // HTTP POSTで1日に記録できるデータ数
define("SDB_AUTO_RAW_WORD_ID" , 9); // RAW VALUEの16ビットとして設定する属性ID(Maxtor HDD用
define("SDB_RAW_WORD_MAX"     , 65536);
define("SDB_RAW_WORD_MARGIN"  , 4320);
define("SDB_CFG_NOUSERPASS"   , FALSE); // Web操作で確証コードなしのデバイスの設定変更を許可
define("SDB_CFG_WEB_DELETE"   , FALSE); >// Web操作でのデータ削除を許可

 重要なのは、sdbsite.inc中のSDBWATCH_PATHに指定している、sdbwatchコマンドのパスです。
 公開SDBサーバはサーバの負荷低減のためグラフは1度に1種類しか表示しませんが、SDB_GRAPH_ALLをTRUEに指定しておくと全属性のグラフが表示できるようになります。

マクロ 内容
SDB_GRAPH_IMGTYPE グラフの画像形式(gif,png,jpeg)
SDB_GRAPH_ALL 全属性のグラフ表示を許可
SDB_GRAPH_OFFLINE_SEC グラフ表示でオフライン(電源オフ)と認識する秒数
SDBWATCH_PATH sdbwatchコマンドのパス
SDB_HTTPPOST_DAY_MAX HTTPモードで1日に記録できるデータ数
SDB_CFG_NOUSERPASS Web操作で確証コードなしのデバイスの設定変更を許可
SDB_CFG_WEB_DELETE Web操作でデータの削除を許可

 SDB_GRAPH_OFFLINE_SECはグラフ表示でオフライン状態、つまり電源オフの状態を認識する秒数です。デフォルトでは3660秒(1時と1分)を指定しています。データの更新間隔が5分とか10分とか短い場合は、SDB_GRAPH_OFFLINE_SECを1800秒(30分)とか900秒(15分)にしてもいいでしょう。

 SDB_HTTPPOST_DAY_MAXはHTTPモードで1日に記録できるデータ数の制限です。これは1デバイスあたりの制限です。デフォルトでは900個を指定しています。S.M.A.R.T.情報は最大で30個(属性IDは1〜255までありますが)ありますので、900の設定なら「900÷30=30」で1日に30回データが記録できます。

 SDB_CFG_NOUSERPASSをTRUEにすると、確証コードが設定されていないデバイスをWeb操作で設定変更できます。
 確証コードが設定されていないデバイスというのは、SDBクライアントで--httpオプションを指定しないでデータベースに追加したデバイスのことです。

データベースの初期化

 sdbctl createdbコマンドを実行して、データベースを作成・初期化しておきます。

sdbctl createdb
~$ sdbctl  createdb

Webサーバの設定

 収録ファイルのweb/httpディレクトリをWebページとして公開できるようにWebサーバApacheを設定します。また、拡張子.phpのファイルはPHPスクリプトとして実行できるように設定します。
 通常はApacheの設定ファイルはhttpd.confに次のような内容を追加します。

httpd.confの例
# 拡張子.php
AddType application/x-httpd-php .php

# "/usr/local/sdb/http/" を "/sdb" として公開
Alias   /sdb/  /usr/local/sdb/http/
<Directory /usr/local/sdb/http/>
    AllowOverride All
</Directory>

 日本語の文字が化けてしまって正しく表示できない場合には、php.iniや.htaccessでPHP関連の日本語コードを設定しておく必要があります。

.htaccessの例
DirectoryIndex  index.php
php_value   default_charset EUC-JP
php_value   mbstring.http_output    EUC-JP

監視用プログラムの設定

 S.M.A.R.T.情報の監視は「設定ファイルの編集」で説明したようにsdb.defを編集しておけば、基本的な機能は動作します。
 あとは、監視のためsdbwatchコマンドをcronで定期的に実行するように設定しておきます。
 sdbwatchには単純に属性値と閾値(Threshold)を比較だけのファストモードと、蓄積されたデータを元に将来の予測を行うロングモードがあります。指定がなければファストモードとして実行されますが、明示的に--fastオプションを指定することもできます。ロングモードを使う場合は--longオプションを指定します。
 通常、ファストモードは1時間に1回程度、ロングモードは1日に1回程度の頻度で実行することを想定しています。ロングモードは解析に時間がかかるので、頻繁に実行するのは向いていません。ファストモードは短時間で実行できますが、管理するハードディスクの台数が多いと時間がかかるので、各自の環境に合わせて調整してください。
 1時間毎にファストモードを、毎朝8時にロングモードでの監視を実行するなら、cronに次のように設定します。Windowsではタスク スケジュールを使ってください。
 エラーや警告が出たときにメールで通知したい場合は--sendmailオプションも追加してください。また、メールでの通知機能を使うためには設定ファイルsdb.defに必要な設定を行っておく必要があります。

cronの設定

0 * * * * /usr/local/sdb/bin/sdbwatch watch --fast --sendmail
0 8 * * * /usr/local/sdb/bin/sdbwatch watch --long --sendmail

 Windows用のSDBクライアント・プログラムsdbtaskは実行時にファストモードと同様のチェック(属性値と閾値の単純な比較)を行っていますので、SDBサーバでの監視頻度は低くてもデスクトップを利用しているユーザは異常に気がつくでしょう。

 ユーザが警告内容を変更したい場合は、データベースsdbのwatテーブルに警告内容を設定しておく必要があります。これは、toolsディレクトリに収録してあるcreatewatch.phpを使って行います。sdbwatch.incに設定内容が記述されていますので、これを編集・変更した上で「php createwatch.php」として実行してください。
 監視用テーブルの設定方法についてはSDB Toolsマニュアル「4-1 監視用テーブル設定」を参照してください。

動作確認

 SDBクライアントがWebサーバやデータベースにアクセスできるように、セキュリティやファイヤウォール等の設定を行ってください。
 WebブラウザからURLに「http://<SDBサーバのアドレス>/sdb/index.php」を入力して開いてください。SDBサーバと同じパソコンでWebブラウザを使う「http:://localhost/sdb/index.php」とします。SDBサーバのIPアドレスが192.168.1.35なら「http://192.168.135/sdb/index.php」としてください。
 これでSDB ToolsのWebページが表示できれば、ApacheとPHPは正常に動いていることになります。

 S.M.A.R.T.情報を監視したいデバイスをSDBサーバに登録するには、Windowsでは「sdbctl add --dev disk0」、Linuxでは「sdbctl add --dev /dev/hda」とします。デバイスのdisk0や/dev/hdaの部分は実際のハードディスクに合わせて変更してください。

 デバイス登録したらWebブラウザで表示したSDB ToolsのWebページに戻ってください。「モデル」の「シリアル」は空欄でかまわないので「デバイスの検索・表示」ボタンをクリックして、先ほど登録したデバイスが表示されれば正常に動作しています。

 デバイスを登録しただけでは、S.M.A.R.T.情報は記録されていません。S.M.A.R.T.情報を記録するには「sdbctl update --dev disk0」や「sdbctl update --dev /dev/hda」を実行してください。

HTTPモードと確証コードについて

 「sdbctl add --http --dev disk0」のように、HTTPモードを使ってデバイスを登録すると、確証コードが発行されます。
 HTTPモードでは.M.A.R.T.情報の記録や設定変更を行うには、このとき発行された確証コードが必要になります。

 便宜上、LAN/イントラネット環境でSDBクライアントが直接データベースを操作することをダイレクトモードと呼ぶことにしますが、ダイレクトモードでは確証コードは使用しません。
 ダイレクトモードで追加したデバイスには確証コードは発行されませんし、sdbctlコマンドでの操作や設定変更には確証コードは必要ありません。HTTPモードで登録した確証コード付のデバイスでも、ダイレクトモードでは操作・設定変更が可能です。

 デフォルトではダイレクトモードで追加したデバイス(確証コードなし)は、SDBサーバの/sdb/devstat.php等のWebインターフェース経由では設定変更できません。
 ダイレクトモードで追加したデバイスの設定変更を許可したい場合は、sdbsite.incのマクロSDB_CFG_NOUSERPASSをTRUEにしてくたざい。
 HTTPモードとダイレクトモードを混在している利用している場合には注意してください。

SDBサーバの運用、メンテナンスについて

 SDBサーバを長期間運用する場合にはデータサイズに注意してください。
 記録したデータ数が増えてくると、グラフ表示や分析に時間がかかるようになります。

 S.M.A.R.T.情報は1属性につき最低38バイト使います。実際のファイルやメモリ消費量はプログラミング言語やシステムに影響されますが、圧縮しない限りこれより小さくなることはありません。
 属性IDは255種類ありますが、1つのデバイスに使われているのは最大30種類です。これを1時間間隔で記録するとしたら、30種類×24時間で720個、365日記録するとデータ数は720個×365日で262,800個となり、データサイズは9,986,400バイト、約10Mバイトになります。
 実際のデータ量はもっと大きいと思いますが、数倍になってもこの程度なら十分処理できるはずです。

 しかし、S.M.A.R.T.情報の記録間隔で5〜10分になるとデータ量は6〜12倍になり、数百Mバイトから下手するとギガバイト単位になります。特に故障時期の予測は、過去に記録したすべてのデータを使うので、データベースの処理や分析に時間もメモリも使います。
 十分なパソコンの性能があれば別ですが、5〜10分といった頻度で数ヶ月とか長期間記録するのは現実的ではありません。
 5〜10分間隔といった高い頻度で記録している場合、過去のデータは1時間単位にデータをまとめるといいでしょう。そういった処理を行うメンテナンス用ツールadjust-smart.phpやcopy-smart.phpを用意しています。これらのツールについては次項で説明しています。


  メンテナンス用ツール

 SDBサーバのメンテナンス用にいくつかツールを用意しています。

  adjust-smart.php

 adjust-smart.phpは、指定期間のS.M.A.R.T.情報を平均化して記録・更新するツールです。
 5〜10分という比較的高い頻度で数ヶ月とか数年に渡って記録しているとデータ量が増加し、グラフ表示や分析に時間がかかるようになります。しかし、1ヶ月以上前の古いデータは5〜10分という頻度で記録していても将来予測には影響しないので、これらを1時間単位にまとめて記録しなおします。
 たとえば、5分間隔で24時間30日記録すると、データ件数は属性1つにつき8640件となります。属性が最大の30種類あったら30日で25万9,200件になります。これを1時間単位で記録しなおすと、属性1種類につき720件と、12分の1にデータ量を減らすことができます。

 次の書式で利用します。

adjust-smart.php  [--db_host <アドレス>]  [--db_name <データベース名>]  [--db_pass <パスワード>]  [--db_port <ポート>]  [--db_user <ユーザ名>]  [--dev_id <デバイスID>]・・・  [--end <日時>]  [--interval <秒数>]  [--start <日時>]

 PHP用のスクリプトですので、実際にはphpを介して「php adjust-smart.php 〜」として実行します。
 --dev_idオプションの指定がない場合は、登録されているすべてのデバイスが対象となります。--dev_idオプションを指定すると、指定したデバイスIDのデバイスだけを処理します。--dev_idオプションは複数指定できます。
 --intervalオプションでデータをまとめる間隔を秒数で指定します。デフォルトは3600秒(1時間)です。300秒以上の数値で指定してください。複数のデータをまとめる場合、属性値/閾値/RAW Valueは平均値にします。その他の値は範囲内の最後の値を採用します。
 --start、--endオプションで指定する<日時>は「--start "2006-01-01 12:30:00"」として何月日・時分秒で指定できます。数値を指定した場合は現在時刻からの秒単位のオフセットとなります。たとえば、「--end -3600」は現在時刻の3600秒(1時間)前となります。
 --start、--endオプション共に指定のない場合は、「--end -2592000」を指定したとみなし、259200秒(30日)前より過去の記録データを処理します。

  copy-smart.php

 copy-smart.phpは異なるデータベース間でS.M.A.R.T.情報をコピーするツールです。また、記録データは指定の間隔にまとめて(adjust-smart.phpと同様の処理)した上でコピーします。
 5分間隔で記録しているS.M.A.R.T.情報を、別のSDBサーバやデータベースに1時間隔にまとめてコピーすることができます。

copy-smart.php  
  <コピー元アドレス>  [[--db_name <データベース名>]  [--db_pass <パスワード>]  [--db_port <ポート>]  [--db_user <ユーザ名>]]  
  <コピー先アドレス>  [[--db_name <データベース名>]  [--db_pass <パスワード>]  [--db_port <ポート>]  [--db_user <ユーザ名>]]  
  [--dev_id <デバイスID>]・・・  [--end <日時>]  [--interval <秒数>]  [--start <日時>]

 PHP用のスクリプトですので、実際にはphpを介して「php copy-smart.php 〜」として実行します。
 --dev_idオプションの指定がない場合は、コピー元に登録されているすべてのデバイスが対象となります。--dev_idオプションを指定すると、コピー元の指定したデバイスIDのデバイスだけを処理します。--dev_idオプションは複数指定できます。
 --start、--endオプションの指定方法はadjust-smart.phpと同じですので、そちらの説明を見てください。
 --start、--endオプション共に指定のない場合は、「--start -3600」を指定したとみなし、3600秒(1時間)前からの記録データをコピーします。
 --db_〜のデータベース関連のオプションは、最後に指定した<コピー元アドレス>または<コピー先アドレス>に対して有効です。たとえば、「copy-smart.php localhost --db_name sdb_orig 192.168.1.11 --db_name sdb_back」という指定は、コピー元localhostのデータベース名がsdb_orig、コピー先192.168.1.11のデータベース名がsdb_backとなります。
 copy-smart.phpには--db_hostオプションはありませんが、<コピー元アドレス>または<コピー先アドレス>がデータベースのアドレスになります。