2006-08-05

OpenSolarisのバグデータベースとSMART

Bug ID: 4665068 SMART support in IDE driver

記載内容が「SMART support required in IDE driver」ってのもすごいよなあ…

で、なんでこのバグ(?)を見つけたかというと、Solaris/x86+ATAでsmartmontoolsを動かしたいという人がMLで参加表明をして頂いたため、現状でできない理由を説明するためにいろいろ検索していたら出てきた。つーか、2002年から放置プレイかよ orz...

Solaris/x86+ATAでSMART情報を利用できない理由は簡単で、単にカーネルがサポートしていないから。いや、Solaris/SPARCやその他のOSでSMARTが明示的にサポートされているわけでもないんだけど、任意のコマンドをディスクに送る機構が備わっていればそれが代わりになる。

で、そういった任意コマンド送信機能を追加するにはどうすればいいかというと、おそらくataドライバに手を入れるしか手段がない。けどまあこれは理論上可能であるというだけで、自分は実行できる知識がないんだ… と前述の人には伝えておいた。英語が通じてればだけどw

ちなみになんでサポートしてないと言い切れるかというと、DTraceで実行フローをおいかけてみてそれを処理している部分がないことをOpenSolaris(公開)とSolaris8 Source Foundation(非公開)で確認しているから。DTraceを使ってカーネル内の関数呼出しをおいかける方法は以下の通り。

まず、トレース対象となる関数を決める。ここではcmdk(Solaris/x86のATAディスクドライバ)のioctl(9e)関数である、cmdkioctl()とする。
次はこのようなDスクリプトを書く

int traceme;
fbt::cmdkioctl:entry { traceme = 1; }
fbt::cmdkioctl:return { traceme = 0; }
fbt::: /traceme/ { trace("\n"); }

スレッドをまたがっても追い掛けられるようにtraceme変数はグローバル変数にした。ただ、若干ノイズが入る懸念はある。
例えばこれをfoo.dという名前で保存したとすると、rootになってdtrace -Fs foo.dとする。さらに別コンソールから、cmdkデバイス(/dev/rdsk/cXdXpX)をopenし、それに対してioctlを発行するプログラムを実行する。実行例はこんな感じ(空行は除いてある)

# dtrace -Fs foo.d
dtrace: script '/xxx/foo.d' matched 48212 probes
dtrace: buffer size lowered to 2m
CPU FUNCTION
0 -> cmdkioctl
0 -> dadk_ioctl
0 -> ata_disk_ioctl
0 <- ata_disk_ioctl
0 <- dadk_ioctl

で、後は呼ばれた関数をOpenSolaris.orgのソースブラウザで追っ掛ければ良い。

0 件のコメント: