ここでは、大部分の 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
ファイルを編集する必要が生じる。
/etc/inittab
は、init のトップレベルの設定ファイルである。
rcN.d
ディレクトリにおいて、N には 1 から 6 までの数字が入るが、それ
らのディレクトリ(の内容)が、起動されるサブシステムを決めている。
init から呼び出されるあるスクリプトの内部で、mount -a
コマンドが
実行される。これは、マウントされるよう定められた全てのファイルシステムをマウ
ントすることを意味する。何がマウントされるべきかは、/etc/fstab
ファイルで定められている。システム起動時になにをどこにマウントするかを変更した
いなら、編集すべきファイルはこれである。fstab
の man ページがあるの
でみてほしい。
システムのデフォルト実行レベルに相当する rcN.d
ディレクトリを
見つけて、そこで ls -l
と打つことでファイルがどこにリンクされ
ているかを理解すること。
システム上で実行している getty
の数を変更すること。
不要なサブシステムをデフォルト実行レベルから取り除くこと。
ほとんどなにもない状態からでもスタートできることを確認すること。
フロッピーディスク上に、lilo
とカーネルを構築し、さらに静的にリンク
されたおもちゃのプログラム("hello world program")を置いて、それが
/sbin/init
から呼び出されるように設定しておくこと。
そのディスクが起動して、プログラムの実行結果が表示されるのを確認すること。
システムが起動するときの画面を注意深く観察し、起きている事柄についてメモを
とること。あるいは、/var/log/messages
にあるシステムログの起動時
からの部分をプリントすること。次に、inittab
ファイルを出発点にして
すべてのスクリプトに目を通し、どのコードが何をしているか理解すること。
また、以下のように書き込むと、出るはずのないスタートアップメッセージを付け
加えることができる。
echo "Hello, I am rc.sysinit"これは
bash
を使ったシェルスクリプトのよい練習にもなる。スクリプトの
いくつかは非常に複雑である。良くできたハンディな bash
のリファレンス
ブックを手元に置いておこう。
inittab
と fstab
ファイルにはマニュアルページがある。
シェル画面で man inittab
とタイプして、それを見ること。init
に関する章はよく書か
れている。
ここで読める。