ディスクのS.M.A.R.T.(以降、SMART)から情報を取得したり、ディスクのチェックができる。
FreeBSDではsysutils/smartmontoolsからインストールできる。
smartmontoolsのインストール、実施例はいろんなところに書かれているので、ここではメモ程度にまとめる。

FreeBSD 9.2-RELEASE-p3(i386), smartmontools-6.2_1での内容。

インストール

portsもpkgもsysutils/smartmontoolsからインストールできる。
smartctlとsmartdが/usr/local/sbin/にインストールされる。

smartctlがメインのコマンド。

smartdがデーモンプログラム。
立ち上げておくと、定期的にディスクチェックを行い、結果をdaemonファシリティのログに書き込んでくれる。
必要であれば問題発生時にメールも送ってくれる。
設定ファイルは/usr/local/etc/smartd.conf。

ディスクの確認

何はともあれ、どんなディスクが繋がっているか調べる。
smartctl -scanで得られる。
なお、SMARTにアクセスするには管理者権限が必要。
以下は実行例。
ここではHDDは/dev/ada0である。
環境により/dev/da0の場合もあるでしょう。

$ sudo smartctl --scan
/dev/ada0 -d atacam # /dev/ada0, ATA device
/dev/cd0 -d atacam # /dev/cd0, ATA device

ディスクが分かったら、SMARTに対応しているかどうかを調べる。
smartctlでデバイスファイルを開いてみればよい。

$ sudo smartctl /dev/ada0
smartctl 6.2 2013-07-26 r3841 [FreeBSD 9.2-RELEASE-p3 i386] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

ATA device successfully opened

Use 'smartctl -a' (or '-x') to print SMART (and more) information

大丈夫そう。

SMARTからの情報の取得

smartctl -a <デバイスファイル>で情報を全部、-xでSMART以外の情報も表示。

実行例

$ sudo smartctl -a /dev/ada0
smartctl 6.2 2013-07-26 r3841 [FreeBSD 9.2-RELEASE-p3 i386] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Seagate Barracuda 7200.10
Device Model:     ST380815AS
Serial Number:    5RW18X0V
Firmware Version: 3.ADA
User Capacity:    80,000,000,000 bytes [80.0 GB]
Sector Size:      512 bytes logical/physical
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA/ATAPI-7 (minor revision not indicated)
Local Time is:    Thu Feb 27 23:10:37 2014 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
See vendor-specific Attribute list for marginal Attributes.
(略)

ディスクのテスト実行

smartctl -t short <デバイスファイル>で実行する。
-tはテストの種類の指定。
shortと指定しているが、shortとくればlongもある。
それ以外にもある。
詳しくはman smartctl(「-test」で検索するとよい)。
shortだと10分以内、longだと数十分単位でのテスト。
運用中でも可能。

上記のコマンドは、ディスクのSMARTに対して「テストをせい」と指示をするだけ。
コマンド叩いたときには、「何時何分ごろに終わるからね」と言うだけで結果は表示されない。
結果はsmartctl -aで確認する。
smartctl -Xでテストを中止する。

以下実行例。

$ sudo smartctl -t short /dev/ada0
パスワード:
smartctl 6.2 2013-07-26 r3841 [FreeBSD 9.2-RELEASE-p3 i386] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Short self-test routine immediately in off-line mode".
Drive command "Execute SMART Short self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 2 minutes for test to complete.
Test will complete after Thu Feb 27 23:35:37 2014

Use smartctl -X to abort test.

$

結果確認

smartctl -aで確認する。
見るのはSelf-test execution status、SMART Self-test logの二つのエリア

以下の通り、「Self-test execution status」「SMART Self-test log」ともにエラーなし(without error)となっている。
なお、テスト実行をしてすぐsmartctl -aとすると、「いまテストしているところだよ」という表示になるので興味があればご覧ください。

(前略)
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever
                                        been run.
(略)
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%     41957         -
# 2  Short offline       Completed without error       00%     41956         -
# 3  Short offline       Completed without error       00%         0         -

常時モニタリングのためのsmartd

cronでsmartctlを実行してもよいけど、smartdを立ち上げおくのがよい。
テストの自動実行や、後述するようなディスクの変化についてもレポートしてくれる。
/usr/local/etc/smartd.confが設定ファイル。
デフォルトでは問題のあったときにしか報告してくれない。
日々のログを吐き出させたいのなら、syslogd, newsyslogの設定変更も必要。

smartd.confの変更

最低限やることは二つ。
①DEVICESCANはコメントアウト
②ディスクとテスト種別、スケジュールを指定。

①DEVICESCANのコメントアウト
デフォルトではDEVICESCANが有効になっている。
DEVICESCANがあると、smartdはそれ以降の設定をすべて無視して、実行される都度、デバイスのスキャンを行う。
それよりも、チェックするデバイスを明示した方がよい。

②ディスクとテスト種別、スケジュールを指定。
書式例は以下の通り。
<ディスク> <各種オプション> -s <スケジュール>
実際の例は以下の通り。

/dev/ada0 -a -o on -S on -s S/../.././02

<ディスク>にはデバイスファイルを指定。
<各種オプション>は以下の通り。
-a: ATAではデフォルト。全部入り。黙ってつけとけ。
-o: ATA専用。SMARTのオフラインテストを有効にするか。ONにしとけ。
-S: autosaveを有効にするか。ONにしとけ。
-s: T/MM/DD/d/HH でスケジュール指定。

T/MM/DD/d/HH
T: テストのタイプ。short(S)かlong(L)か。
MM: 月。01-12で指定。必ず二桁で指定。
DD: 日。01-31で指定。必ず二桁で指定。
d: 曜日。1が月曜、7が日曜。
HH: 時刻。00-23で指定。必ず二桁で指定。

以下だと毎日の午前2時にshortのテストを実施。

-s S/../.././02

syslogdの設定

smartdは、デフォルトではdaemonファシリティにログを吐く。
そのままだと使いにくいので、ログの出力先を変える。
たとえばlocal3ファシリティにする。
それには/etc/rc.confで、smartd_flagsとして指定する。

/etc/rc.conf

#SMART monitor tool
smartd_enable="YES" # マシン起動時にsmartdも起動させる設定
smartd_flags=" -l local3 " # ログ出力先の指定

そうしておいて、/etc/syslog.confにて以下を追加。
/etc/syslog.conf

#
# smartd(smartmontools)
#
local3.*                                        /var/log/smartd.log

変更したらsyslogdを再起動。

$ sudo service syslogd restart
Stopping syslogd.
Waiting for PIDS: 26185
Starting syslogd.
$

しかしこのままだとsmartd.logが際限なく大きくなる。
newsyslog.confにも変更を加える。

newsyslog.confの設定

以下を追加。
/etc/newsyslog.conf

#
# smartd(smartmontools)
#
/var/log/smartd.log                     640  10    1024 *     JC

1MBを超えたらログをローテート。bzipで圧縮。10個まで保存。圧縮後のパーミッションは640。

終わったらnewsyslogを一回再起動しておくとよいかな。

$ sudo service newsyslog restart
Creating and/or trimming log files.
$

やっと準備完了。
smartdを起動しよう。

smartdの起動

再掲になるけれども、/etc/rc.confを修正してsmartdを起動する。

/etc/rc.conf

#SMART monitor tool
smartd_enable="YES" # マシン起動時にsmartdも起動させる設定
smartd_flags=" -l local3 " # ログ出力先の指定

smartdを起動する。

$ sudo service smartd start
Starting smartd.
$

先ほど指定したログファイルを見る。

$ cat /var/log/smartd.log
Mar  4 22:17:59 ascomoid newsyslog[38905]: logfile first created
Mar  4 22:26:32 ascomoid smartd[53036]: smartd 6.2 
(略)
Mar  4 22:26:32 ascomoid smartd[53038]: file /var/run/smartd.pid written containing PID 53038

動いていますね。

ただこれだけでは、指定したディスクをチェックしてくれるか、分からない。
smartdはSIGUSR1シグナルを送ってやるとステータスチェックをしてくれるというので試してみよう。
なお、smartdのpidはさっきのログファイルに書いてあるし、あるいはservice smartd statusとやればpidを知ることができる。

$ sudo kill -SIGUSR1 53038
$

そのうえでログファイルを見てみると。
以下のような行が増えているはず。
/dev/ada0のチェックが出来ていますね。

Mar  4 22:35:10 ascomoid smartd[53038]: Signal USR1 - checking devices now rather than in 682 seconds.
Mar  4 22:35:10 ascomoid smartd[53038]: Device: /dev/ada0, SMART Usage Attribute: 190 Airflow_Temperature_Cel changed from 52 to 53
Mar  4 22:35:10 ascomoid smartd[53038]: Device: /dev/ada0, SMART Usage Attribute: 194 Temperature_Celsius changed from 48 to 47

daily status

以下のような行を/etc/periodic.confに追加するとレポートをroot宛てに送ってくれる。
複数ディスクの場合は、スペースで区切り。

下記のようなメールが届く。

SMART status:
 Checking health of /dev/ada0: OK
 Checking health of /dev/ada1: OK
 Checking health of /dev/ada2: OK

以上。