Shinji Inotsume
|
ハードディスクドライブの S.M.A.R.T. 機能を利用する
|
Shinji Inotsume
07/08/2015 4:40 AM
post114077
|
ハードディスクドライブの S.M.A.R.T. 機能を利用する
QNX Neutrino ではハードディスクドライブの SMART 機能の利用に関して以下のようになっています。
QNX 6.5.0 SP1 まで: devb-eide のオプションで SMART のモニターをイネーブルするのみ
QNX 6.6.0 : devb-eide/devb-ahci のオプションで SMART のモニターをイネーブルにして、
起動時に HDD の SMART で問題が見つかれば、そのメッセージを システムログに残す
(Utilities Reference の devb-eide/devb-ahci 項を参照の事)
上記の通り、QNX Neutrino ではハードディスクドライブの SMART 情報を読み出す手段をデフォルトでは
持っていません。 このため QNX Neutrino で SMART 情報を読み出す場合には、その機能をユーザーが
作成する必要がありました。
Linux や BSD 系の OS にはオープンソースの smartmontools が代表的なツールとして利用されており、
最新(2015 年 7 月現在)の smartmontools 6.4 では QNX Neutrino でも動作するようになっています。
ここでは、smartmontools 6.4 を QNX Neutrino 6.5.0 SP1 セルフホスト環境でビルドする方法と
QNX Neutrino で SMART 情報にアクセスする際のプログラミング・インターフェースについて記載します。
1) smartmontools 6.4 を QNX Neutrino 6.5.0 SP1 セルフホスト環境でビルドする
smartmontools 6.4 のソースコードは以下のサイトから入手できます。
https://www.smartmontools.org/wiki/Download
このページで Install from the source tarball 項の Download the latest source tarball from -> here.
が下記のページにリンクされており、ここから各バージョンのソースコードがダウンロードできます。
http://sourceforge.net/projects/smartmontools/files/
smartmontools-6.4.tar.gz がダウンロードできたら、解凍して smartmontools-6.4 ディレクトリにて
configure を実行して QNX SDP 6.5.0 SP1 の環境で make が実行できるようにします。
ここでひとつ問題があり、QNX 6.5.0 SP1 の rm コマンドが POSIX 仕様に完全に準拠していない
ために configure の途中でエラーとなってしまいます。 そこで、POSIX 仕様に完全に準拠した
QNX 6.6.0 の rm バイナリを一時的に使用することで回避します。
/bin/rm のバックアップを取り、添付の rm.660 を /bin/rm にコピーして configure を実行して下さい。
configure 実行後は元の rm を /bin に戻しておく事をお勧めします。
configure が終了したら make を実行すると、smartctl および smartd バイナリがビルドされます。
それぞれの使用方法は smartctl -h および smartd -h で参照可能です。
* QNX 6.6.0 ではセルフホスト環境がないため、QNX 6.5.0 SP1 でビルドしたバイナリを
使用するしかありません。(他に方法がないか考え中です・・・)
2) QNX Neutrino で SMART 情報にアクセスする際のプログラミング・インターフェース
アプリケーションからハードディスクドライブの SMART 情報にアクセスするには、devb-eide および
devb-ahci が用意しているコマンド・パススルー・インターフェースを使用します。
具体的には、devb-eide/devb-ahci が作成したデバイス /dev/hd0 等を open() して得られた fd に
対して devctl()/devctlv() を実行して ATA コマンド(SMART コマンド)をドライブに送ります。
例:
fd = open("/dev/hd0", O_RDONLY);
devctl(fd, DCMD_CAM_PASS_THRU, ...);
サンプルコードとしては、smartmontools に含まれる、os_qnxnto.cpp と os_qnxnto.h を参照すると、
どのようにプログラミングすればよいか分かると思います。
|
|
|