INIT(8)

名前
init, telinit - プロセス制御の初期化

書式
/sbin/init [ -t sec ] [ 0123456SsQq ]
/sbin/telinit [ -t sec ] [ 0123456sSQqabc ]

説明

  Init
Init は全てのプロセスの生みの親である。 その主な役割は、/etc/inittab(inittab(5)参照) ファイル中に記述されたスクリプトによってプロセスを作り出す事にある。 通常このファイルには、initに各コンソール接続ライン上にgettyを 生成させ、ユーザのログインを可能にするためのエントリーが記されている。 また、特殊なシステムに必要な自律性のプロセスの制御も行う。

run level とは、 指定したプロセス群のみが存在する様にするための、 システムに対するソフトウエア的な設定の一つである。 それぞれのランレベルでinitが作り出すプロセスは /etc/inittabファイルで定められている。 Init は、0–6及びSまたはsの、 8つのrun levelのうちの一つを取ることが出来る。 run levelは特権ユーザが/sbin/telinitを実行することによって 変更される。 その際/sbin/telinitはinitに適切なシグナルを送る事により、 どのランレベルに変更すべきかを指示する。

カーネルブートの最後のステップとしてinitが起動されると、 initは/etc/inittabファイルを検索し、 initdefaultというエントリーが存在するかを調べる (inittab(5)参照)。 initdefault はシステムが最初に取るべきランレベルを定めている。 /etc/inittabファイル中にそのようなエントリーがない場合、 又は/etc/inittabファイル自体が存在しない場合は、 システムコンソールからrun levelを入力しなくてはならない。

Run levelをSまたはsにするとシステムは シングルユーザモードに入る。 この場合は/etc/inittabファイルは必要としない。 シングルユーザモードでは、/dev/consoleで/bin/shが起動される。

シングルユーザモードに入る際、initは、 /etc/ioctl.saveからコンソールのioctl(2)状態を読み込む。 このファイルが存在しない場合は、initはコンソール接続ラインを 9600 baudでCLOCALの状態(訳注:ローカルに直接接続されている状態) に初期化する。 シングルユーザモードを抜ける際には、 次回のシングルユーザモードセッションでも同じ設定を用いる事が出来る様に、 コンソールのioctl状態を/etc/ioctl.saveファイルに保存する。

最初にマルチユーザモードに入る際は、initは、 ユーザがログイン可能になる前にファイルシステムをマウントする為に、 まずboot及びbootwaitエントリーを実行する。 そして、run levelに適合する全てのエントリーを処理する。

新たなプロセスを起動する際には、Initは、/etc/initscriptファイルが 存在するかを調べ、 存在する場合はそのスクリプトを用いてプロセスを起動する。

/var/run/utmp及び/var/log/wtmpファイルが存在する場合は、 initは子プロセスが終了する毎に、その旨を終了した理由とともに 上記ファイルに記録する。

Init は、指示された全てのプロセスを生成し終えた後は、 その子孫のプロセスが死ぬか、powerfailシグナルが発せられるか、 /sbin/telinitからrun levelを変更せよとのシグナルが送られて 来るまで待機している。 上記3条件のいずれかが起きた場合は、/etc/inittabファイルを再度調べる。 いつでもこのファイルに新たなエントリーを追加することが出来る。 しかし、上の3つの条件のどれかが起きるまではinitは待機の状態を続ける。 新たなエントリーに即座に反応させるには、 Q若しくはqコマンドを用いてinitを目覚めさせ、 /etc/inittabファイルを再度調べさせればよい。

Initは、シングルユーザモードにない時にpowerfailシグナルを受け取ると、 特別なpowerfailエントリーを実行する。

Init は、run levelを変更するよう要請を受けると、 先ず新たなrun levelでは定義されていない全てのプロセスに対して 警告シグナルSIGTERMを送る。 その後5秒間待機してから killシグナルSIGKILLを送り、それらのプロセスを強制的に終了させる。 init は、それら全てのプロセス(及びそれらの子孫)は 自分がそれらのプロセスのために作り出したプロセスグループに 今なお属している、と仮定していることに注意。 あるプロセスがそのプロセスグループ属性を変えてしまった場合は、 上記のシグナルは受け取らない。 従って、そのようなプロセスは別途終了させる必要がある。

  telinit
/sbin/telinitは/sbin/initにリンクされている。 /sbin/telinitは一文字の引数を受け取り、 initに適切な動作を行なわせるためのシグナルを送る。 以下に示すような引数を用いて /sbin/telinitに指示を与えることが出来る:

0,1,2,3,4,5又は6
    指定されたランレベルに変更する様に/sbin/initに命令する。

a,b,c
    /etc/inittab中のrun levela、bまたはcを 含むエントリーだけを実行するよう/sbin/initに命令する。

Q 又は q
    /etc/inittabファイルを走査し直すように/sbin/initに命令する。

S 又は s
    シングルユーザモードへと変更するよう/sbin/initに命令する。

/sbin/telinitはinitに、プロセスにTERMシグナルを送ってから KILLシグナルを送る迄の時間を指示することもできる; ディフォルトでは 5 秒に設定されているが、-t secオプションを用いて 変更することが出来る。

/sbin/telinitは適切な特権を持ったユーザのみが実行することが出来る。

ランレベル
ランレベル0, 1及び6は予約されている。 ランレベル0はシステムを停止するために、ランレベル6はリブートするために 用いられ、ランレベル1はシステムをシングルユーザモードにするのに用いられる。 ランレベルSは直接用いるためのものではなく、 ランレベル1になった時に実行されるスクリプトのために存在する。 この詳細は、shutdown(8)及びinittab(5)の manpageを参照のこと。

文書には書かれてはいないが、ランレベル7-9を使用することも出来る。 文書に書かれていないのは、「伝統的な」Unixの変種は ランレベル7-9を使用していないからである。 驚くかも知れないが、 ランレベルS及びsに関しても同じである。 これらは内部的には同一のランレベルのエイリアスなのである - これら文書に記述されていないランレベルは作者がsysvinitを書いた時に使っていた システムから引き継いだものである。

ファイル
/etc/inittab
/etc/initscript
/dev/console
/etc/ioctl.save
/var/run/utmp
/var/log/wtmp
/dev/initctl

環境変数
Initは子プロセスのために以下のような環境変数を設定する:

PATH
    ディフォルトでは/bin:/usr/bin:

INIT_VERSION
    名前の通り。 あるスクリプトがinitにより直接実行されたのかどうかを見分ける際に有用。

RUNLEVEL
    システムの現在のランレベル。

PREVLEVEL
    直前のランレベル(ランレベルを変更した際に有用)。

ブートフラッグ
ブートモニター(例えば LILO)からinitに様々なフラッグを渡すことが出来る。 Initは以下のようなフラッグを受け付ける:

S, single
    シングルユーザモードにブートする。 このモードでは/etc/inittabを参照する。 また、ブート時のrcスクリプトはシングルユーザモードのシェルが 起動される前に実行される。

1-5 ブート時に入るべきランレベル。

-b, emergency
    他の起動用スクリプトは実行せず直接シングルユーザシェルへとブートする。

準拠
InitはSystem Vのinitと互換である。 Init は /etc/init.d及び/etc/rc{runlevel}.dディレクトリ中のスクリプト と密な連係の下に一緒に実行される。 使用しているシステムがこのディレクトリ構造をとっているなら、 /etc/init.dディレクトリ中にREADMEがあり、 スクリプトがどのように動作するか説明されているはずである。

警告
Init は、 生成したプロセス及びその子孫が、 それらのために作ったプロセスグループに現在も 属したままでいる、と仮定している。 プロセスグループが元々のものと変わっている場合は、 init はそのプロセスをkill出来ないので、 異なる二つのプロセスが同一の端末ラインから入力を読み込む等といった現象が 起きてしまう可能性がある。

返り値
/sbin/init は、あるエントリーが2分間に10回以上繰り返して 再生成されるのを発見すると、 コマンド文字列に誤りがあると仮定してシステムコンソールにエラーメッセージを 表示し、5 分以上経過するかシグナルを受け取るまでそれ以上そのエントリーを 再生成する事を拒否する。 こうすることによって、/etc/inittab中に綴り間違いが有る場合 や、そのエントリーで使用するプログラムが削除されている場合に、 システム資源を使い尽くしてしまうことを防いでいる。

著者
Miquel van Smoorenburg (miquels@cistron.nl), マニュアルページの最初の版は Michael Haardt (u31b3hs@pool.informatik.rwth-aachen.de) による。

関連項目
getty(1), login(1), sh(1), who(1), shutdown(1), kill(2), inittab(5), initscript(5), utmp(5)

翻訳者
古高和禎 <furutaka@Flux.tokai.jaeri.go.jp>