More info...

2007-11-09

DTrace on Leopard

色々と忙しかったので長らくBlogを放置していたのだが、このたびMacOS X 10.5(Leopard)を買ったので少しだけアップデートしよう!

Leopardには華々しい機能がたくさんあるのでそちらに目移りしてしまうけど、日本男児たるものDTraceに注目せずして良いのだろうか。いや、よくない<反語。(もちろんMac UserたるものGUIやその他の新機能をも堪能するべきである。特にSpacesなどは秀逸だと思う。)というわけでLeopardユーザー向けにDTraceを少しだけ解説してみる。

DTraceはDynamic Tracingの略で、システム上の様々な箇所を追跡することが出来る。一種のデバッガなのだが、システム全体を追跡できるのが特徴だ。元々Solaris 10向けにSunが開発したものだが、SunはSolaris 10をCDDLというライセンスでオープンソース化したので、このたびLeopardへと移植されることになった。LeopardでDTraceが使えるようになったのは大変魅力的なことである。個人的に。

さて、DTraceを使う際にはいくつかポイントがある。
  1. もっぱらターミナルからコマンドをたたいて使う。
  2. root権限が必要だ。
  3. DTraceについて詳しく知らなくても活用できる。
もちろん細かいことを言い出すときりがないが、手のつけはじめの時はこんなもんだろう。というわけで各ポイントの詳細を見ていこう。

(1) もっぱらターミナルからコマンドをたたいて使う。


DTraceの構造については以前に紹介したSolarisと同じだ。Leopardでもdtraceという名前のコマンドラインのプログラムがあるので、デフォルトではこのプログラムを介してKernel中のDTraceへアクセスする。dtraceコマンドへ指示をD言語で行うところも同じ。Macを使ってる人の大半はターミナルなどを開いたことがなく、直感的で使いやすいユーザーインターフェースやアプリケーションの数々を満喫していると想像している。そして一部のUNIXerたちだけが、Macのもつもう一つの顔であるUNIXを堪能しているのだろう。DTraceはそんなUNIXerたちの追求心を満たす格好の道具であることは間違いない。

筆者的にはDTraceをGUIで使おうという試みもあるので、MacOSではそのようなプログラムが登場して世の中を驚かせるのではないかと期待している。

(2) root権限が必要だ。


DTraceを使えばカーネルに存在するほぼ全ての情報へアクセスできるし、システムを思いのままに操作することも可能だ。例えば任意のプログラムのメモリ空間を覗き見ることも出来るし、その気になればシステムをクラッシュさせることだって出来る。だから一般ユーザーにはdtraceプログラムの使用が禁止されている。(DTraceを使うことで、rootがますます強力なユーザーになってしまった!)

root権限を得るには、rootユーザーを有効にするのも一つの手だが、面倒なので

shell> sudo -s

と実行することで筆者は対応している。どうせrootユーザーを有効にしてから

shell> su -
するぐらいならこの方法でもあまり変わらない。

rootユーザーを有効にするには、10.4ではNetInfoマネージャーを用いたが、Leopardではディレクトリユーティリティを用いるように変更されているので注意が必要だ。

(3) DTraceについて詳しく知らなくても活用できる。


DTraceに詳しい人なら自分でD言語を使って操作するのもいいだろう。その方が動きがよく分かるし様々なことを実行できる。が、残念ながらMacOS Xはオープンソースではないので変数名や関数名、またはアルゴリズムが使われているかを正確に知る方法はない。従って、dtraceによって完全にKernel内部の動作を追跡ことも出来ないのである。D言語を使ってオリジナルのプログラムを作成しようと考えていた人にとってこれは良くない知らせかもしれないが、幸運にもLeopardには元からいくつかの役立つプログラムがDTraceを用いて実装されている。

例えばアプリケーションの動作を追跡するdapptraceと、プロファイリング(統計データの取得)を実施するdappprofなどがある。プログラムの実行を追跡するexecsnoopやファイルが開かれたことを追跡するfilebyproc.dなどは「不正なプログラムが実行されていないか」ということなどを知りたいときなどに便利だ。(筆者の知るところではこのようにシステム全体を監視して、任意のプログラムの実行やファイルのオープンを追跡するような機能はDTrace意外には見あたらない。Kernelにメスを入れれば実装出来るが開発には手間がかかるし、追跡したくない場合にもオーバーヘッドが発生してしまう。DTraceを使えば比較的軽量なウィルスソフトを実装するということなどもだろう。)また、これらのプログラムにはちゃんとmanページがあるので、使い方についてはそちらを参照して欲しい。

前述のプログラムはどこかで見た名前だと思った人はいないだろうか?そう、これらはDTraceToolkitにも含まれるファイルなのである。詳細は次のページを参照して欲しい。

http://www.opensolaris.org/os/community/dtrace/dtracetoolkit/

DTraceToolkitは元々Solaris上で開発されたDTrace用プログラム群である。Solaris Kernelの内部の変数へアクセスしていたtcpsnoopなどのプログラムはLeopardへ移植されていない(というか出来ない)が、元々便利なプログラムばかりなのでLeopard上でも便利である。他にはどんなプログラムが移植されたかというのは、

shell> /usr/share/examples/DTTk

というディレクトリを見れば分かる。DTraceToolkitから移植された各コマンドについて実行例が解説つきで載っている。これらの解説は非常に分かりやすい。(問題点を挙げるとすれば、すべて英語で書かれていることぐらいだろうか。)

DTraceToolkitに含まれるプログラム群はすべて強力なものばかりなので、それらを使いこなすことで他のMac Userと一歩差がつくのは間違いないだろう。DTraceについて詳しく知らなくても。もちろん、ここからさらに先へ進んで自前のDTraceプログラムを作成したいと思うなら、筆者はそれを止めたりはしない。が、DTraceToolkitにあってLeopardにはないものが多数あるので、それらが今後Leopardへ移植されていくものと期待出来るし、自らがその移植へチャレンジしてみてもいいだろう。

0 件のコメント:

コメントを投稿