次のページ 前のページ 目次へ

6. Init

ここでは、大部分の Linux システムで使用されている "System V" スタイルの init についてだけ話す。違うスタイルも存在する。実際、好きなプログラ ムを /sbin/init として置いておけば、カーネルはロードが終わった時に それを実行する。

全てのプログラムを的確に走らせるのが init の仕事である。ファイル システムに問題がないか確認し、それをマウントする。デーモン(daemons)プロセスを 起動することで、システムメッセージをログに記録し、ネットワークを監視し、ウェ ブページを提供し、マウスからの信号を受け取ったりする。また、仮想端末上にログ インプロンプトを出力する getty プロセスの起動も行う。

実行レベル(run-level)の変更については非常に複雑なはなしがあるが、大部分は飛ば して、システムの起動についてだけ説明しようと思う。

init は、/etc/inittab というファイルを読み込む。このファイ ルが init に仕事の内容を伝える。一般的には、伝えられる最初の仕事は 初期化スクリプトを走らせることである。このスクリプトを実行する(あるいは解釈 する)プログラムが、bash であり、これは、コマンドプロンプトを出力する プログラムと同一のものだ。Debian のシステムでは、初期化スクリプトは /etc/init.d/rcS であり、Red Hat では /etc/rc.d/rc.sysinit である。この過程で、ファイルシステムの検証とマウント、日時の設定、スワップス ペースの稼働、ホスト名の設定などが行われる。

次にもうひとつのスクリプトが呼び出されて、デフォルトの実行レベルにシステムを移 行させる。これは一連のサブシステムが起動されるという意味である。これに関して は、ディレクトリのセットが存在する。例えば Red Hatでは、 /etc/rc.d/rc0.d, /etc/rc.d/rc1.d, ..., /etc/rc.d/rc6.d といったものがあり、Debian では、 /etc/rc0.d, /etc/rc1.d, ..., /etc/rc6.d となっている。これらのディレクトリは、実行レベルに対応していて、Debian の システムで実行レベル 3 に移行しようとするなら、そのスクリプトは /etc/rc3.d にある 'S'(start のこと) で始まる全てのスクリプト群 を実行する。実際には、これらのスクリプト群は、通常 init.d と呼ばれる 別のディレクトリにあるスクリプトへの単なるリンクである。

これらの実行レベルに関するスクリプトは、init から呼び出され、ディレ クトリ内にある頭文字が S のスクリプトを探す。(例えば)最初に見つけたのが、S10syslog であるとしよう。付けられた数字は実行レベルスクリプトにどういう 順番で実行していくかを伝える。このケースでは、S00 ... S09 で始まるス クリプトがないので、S10syslog が最初に実行される。ただ、 S10syslog は実際には /etc/init.d/syslog へのリンクにすぎ ず、システムのログ記録プログラム(system logger)を開始したり停止したりしている のは後者のスクリプトである。 リンク(名)が S で始まるので、実行レベルスクリプトは syslog スクリプトを 'start' のパラメータを付けて実行すべきことを知る。それ に対応する 'K'(kill のこと)で始まるリンクも存在し、それによって実行 レベルの変更時に何をどういう順番で終了させるかが指定される。

デフォルトで起動するサブシステムを変更するには、rcN.d ディレクトリ にあるそうしたリンクを設定し直さなければならない。ここで N とは、 inittab で設定した実行レベルのことである。

init が最後に行う重要な仕事は、getty をいくつか起動すること である。彼らは、"何度でも生き返る(respawned)" 設定になっている。つまり、もし 止まっても init がまたそれらを再起動させるのである。 大部分のディストリビューションは 6 個の仮想端末を用意する。メモリを節約するた めにその数を少なくしたいかもしれないし、たくさん走らせておいて必要なときにす ばやく使うため、その数を増やしたいかもしれない。また、文字端末かモデムでの通 信用に getty をひとつだけ実行したいのかもしれない。そうした場合は、 inittab ファイルを編集する必要が生じる。

6.1 設定

/etc/inittab は、init のトップレベルの設定ファイルである。

rcN.d ディレクトリにおいて、N には 1 から 6 までの数字が入るが、それ らのディレクトリ(の内容)が、起動されるサブシステムを決めている。

init から呼び出されるあるスクリプトの内部で、mount -a コマンドが 実行される。これは、マウントされるよう定められた全てのファイルシステムをマウ ントすることを意味する。何がマウントされるべきかは、/etc/fstab ファイルで定められている。システム起動時になにをどこにマウントするかを変更した いなら、編集すべきファイルはこれである。fstab の man ページがあるの でみてほしい。

6.2 演習

システムのデフォルト実行レベルに相当する rcN.d ディレクトリを 見つけて、そこで ls -l と打つことでファイルがどこにリンクされ ているかを理解すること。

システム上で実行している getty の数を変更すること。

不要なサブシステムをデフォルト実行レベルから取り除くこと。

ほとんどなにもない状態からでもスタートできることを確認すること。

フロッピーディスク上に、lilo とカーネルを構築し、さらに静的にリンク されたおもちゃのプログラム("hello world program")を置いて、それが /sbin/init から呼び出されるように設定しておくこと。 そのディスクが起動して、プログラムの実行結果が表示されるのを確認すること。

システムが起動するときの画面を注意深く観察し、起きている事柄についてメモを とること。あるいは、/var/log/messages にあるシステムログの起動時 からの部分をプリントすること。次に、inittab ファイルを出発点にして すべてのスクリプトに目を通し、どのコードが何をしているか理解すること。 また、以下のように書き込むと、出るはずのないスタートアップメッセージを付け 加えることができる。

        echo "Hello, I am rc.sysinit"
これは bash を使ったシェルスクリプトのよい練習にもなる。スクリプトの いくつかは非常に複雑である。良くできたハンディな bash のリファレンス ブックを手元に置いておこう。

6.3 参考文献等


次のページ 前のページ 目次へ