Upstart の起動、終了のシーケンスや依存関係を可視化するスクリプトを作ってみた

あらすじ

  • depchart.rbの紹介

以下余談

  • Upstartについて
  • depchart.rbへの道のり
  • 今後など

depchart.rb : Upstart Diagram

Upstartの起動・終了のシーケンスや依存関係を可視化するスクリプトです。
必要なものは RubyGraphviz です。

↑ここから depchart.rb を取ってきて、適当なところに置いて、

$ ruby depchart.rb | dot -Tps > a.ps 

↑ように実行すると、PSファイルで↓のような依存関係の図が出来ます。



手元の Ubuntu 10.04 での例 (※"rc-sysinit" -> "runlevel"を追加してあります)

Upstartについて

Upstartはシステムの起動・終了のタスクを管理するプログラムです。同様のものに Sysvinit があります。

以前のLinuxのシステムでは Sysvinit (chkconfigとかinittabとかランレベルとか)が使われていました。 Sysvinit は依存関係をファイル名につけた数字で制御するとか、各ジョブがひとつずつ順番に立ち上がるという仕組みだったので、シンプルで分かりやすい分、起動すべきジョブが多くなってくると依存関係がわかりにくくなったり、起動が遅くなるという問題がありました。

最近のLinuxシステムではUpstartが使われるようになってきました。Upstartでは、イベントやリソースの存在などを見ながら非同期にジョブを起動・終了させます。最近のLinuxの起動を速くするのに Upstart が多少貢献しているようです。これ以上の説明は Wikipedia / Upstart とかが良いかもしれません。

Upstartの記事については2回目(前回内容)なのですが、未だにちゃんと分かった気がしません。ドキュメントが少ない(開発元のWikiが一番まとまってるような感じ)というか、 Upstart 本体の動きはシンプルなので Upstart 自体のドキュメントは足りてるのかもしれません。

たぶん、本当にみんなが必要なのは、各ディストリビューションUpstart の設定の設計や実装のドキュメントなんじゃないかなと思います。

depchart.rbへの道のり

確かに Upstart は効率的なのですが、ジョブの設定が前後の依存関係のみバラバラに書いてあって(それはもちろん設定しやすいという利点ではあるのですが)、最終的に組み上がった全体の形がわかりにくいという問題があります。

例えば、 /etc/init/mysql.conf を見てみると、 net-device-up と local-filesystems が準備できたら起動するというような内容になっています。ここだけを見るととても分かりやすいです。しかしながら全体の起動の流れの中で、どのあたりに位置するのか、また直前のイベント以外に他に関係のある設定はどれか、ということを調べようとすると非常に難しくなります。

この依存関係が graphviz の dot ファイルになったりしないかなと思って探してみたら情報がいくつか見つかりました。

ここでUpstartのドキュメントが無いよというバグとして登録してあって、

ここで依存関係が絵になるべきだよねという要望になっています。
期待して見に行くと、その先の実装例がリンク切れでした。

depchart.py で探すと、それらしいプロジェクトが見つかりました。

動かしてみましたが期待した結果が出てきません。Upstartの仕様自体も最近かなり変わってきているので、そういうことかもしれません。

というか、行ごとに正規表現で見るようになっていて、「start on」のしかも Job のみしか見ていません。これはあまりにも手抜き杉でしょう。

ということでRubyで書き直しました。Upstartの文法が例によってなんだか微妙なオレオレ文法なので、正規表現で頑張ってるうちに怪しい手書きパーサーになりました。もっとコンパイラの勉強が必要です。

ライセンスは今のところRubyです。

手元のUbuntu10.04で動作を軽く確認していますが、BNFなどで文法の定義が見つからなかったので試行錯誤で作ってます。バグがあるかもしれませんし、将来の仕様変更で動かなくなる可能性もあります。

今後など

ソース見れば分かりますが、やっぱり絵が出るだけのやっつけです。
gistで上げても良いかなという程度のコードです。

引数オプションの解析をまじめにやって、例えば興味あるジョブに関係ある線だけ残すとか、dotコマンドも実行してあげて直接絵を作っても良いかなと思います。

Launchpadのプロジェクトに送りつけるというのもあるかなと思います。

将来的に Upstart の標準機能として正式なものが出てくると良いなと思っています。