次のページ
前のページ
目次へ
ここでは、大部分の 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 のリファレンス
ブックを手元に置いておこう。
次のページ
前のページ
目次へ
|