7.3. ブートスクリプトはどのようにして動くのか

Linux では SysVinit という特別なブート機能があり ランレベル (run-levels) という考え方に基づいています。 ランレベルの扱いはシステムによって異なりますので、ある Linux において動作しているからといって LFS においても全く同じように動くわけではありません。 LFS では独自の方法でこれを取り入れることにします。 ただし標準として受け入れられるような方法を取ります。

SysVinit (これ以降は 「init」 と表現します) はランレベルという仕組みにより動作します。 ランレベルには7つのレベル (0 から 6) があります。 (実際にはランレベルはそれ以上あるのですが、特殊な場合であって普通は利用されません。 詳しくは init(8) を参照してください。) 各レベルは、コンピュータの起動時における処理動作に対応づいており、デフォルトのランレベルは 3 となっています。 ランレベルの詳細を以下に説明します。

0: コンピュータの停止
1: シングルユーザーモード
2: マルチユーザーモード、ネットワークなし
3: マルチユーザーモード、ネットワークあり
4: 将来の拡張用として予約されています。 3 と同じものとして扱われます。
5: 4 と同様。通常 (X の xdm や KDE の kdm のような) GUI ログインに用いられます。
6: コンピュータの再起動

ランレベルを変更するには init <runlevel> を実行します。 <runlevel> はランレベルを示す数字です。 例えばコンピュータを再起動するには init 6 コマンドを実行します。 これは reboot コマンドのエイリアスとなっています。 同様に init 0halt のエイリアスです。

/etc/rc.d ディレクトリの配下には複数のサブディレクトリがあります。 そのディレクトリ名は rc?.d のようになっています。 (? はランレベルの数字を表します。) また rcsysinit.d というサブディレクトリもあります。 それらサブディレクトリ内には数多くのシンボリックリンクがあります。 シンボリックリンクの先頭一文字には KS が用いられ、続いて二桁の数値文字がつけられています。 K はサービスの停止 (kill)、S はサービスの起動 (start) を意味します。 二桁の数字はスクリプトの起動順を定めるもので、00 から 99 までが割振られ、小さな数字から順に実行されます。 init コマンドによってランレベルが変更される時は、そのランレベルに応じて必要なサービスが起動するか停止することになります。

スクリプトファイルは /etc/rc.d/init.d ディレクトリにあります。 実際の処理はここにあるファイルが用いられます。 これらに対してはシンボリックリンクが用意されています。 サービスの起動と停止を行うシンボリックリンクは /etc/rc.d/init.d ディレクトリにあるスクリプトを指し示しています。 このようにしているのは、各スクリプトが startstoprestartreloadstatus といった様々なパラメータにより呼び出されるためです。 K の名前を持つシンボリックリンクが起動されるということは stop パラメータをつけて該当するスクリプトが実行されるということです。 同様に S の名前を持つシンボリックリンクが起動されるということは start パラメータをつけて呼び出されるということになります。

上の説明には例外があります。 rc0.d ディレクトリと rc6.d ディレクトリにある、S で始まるシンボリックリンクはサービスを何も起動させません。 stop パラメータが与えられ、何らかのサービスを停止します。 ユーザーがシステムを再起動したり停止したりする際には、サービスを起動させる必要はないわけで、システムを停止するだけで済むからです。

スクリプトに対するパラメータは以下のとおりです。

start

サービスを起動します。

stop

サービスを停止します。

restart

サービスをいったん停止し再起動します。

reload

サービスの設定ファイルを更新します。 設定ファイルが変更されたものの、サービスの再起動は必要ではない場合に利用します。

status

サービスがどの PID 値で動いているかを表示します。

ブート機能を動作させる方法は自由に取り決めて設定して構いません。 このシステムはつまるところあなた自身のシステムだからです。 上に示したファイル類はブート機能を定めた一例に過ぎません。