telinit または init コマンド
目的
プロセスの初期化および制御を行います。
構文
{ telinit | init } { 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | h | Q | q | S | s | M | m | N }
説明
init コマンドは、プロセスを初期化し、制御します。その主なロールは、/etc/inittab ファイルから読み込まれた情報に基づいてプロ セスを開始することです。/etc/inittab ファイルは通常、ユーザーがログイン可能な各回線について getty コマンドを実行するよう init コマンドに要求します。init コマンドは、システムから要求された自律プロセスを制御します。
init コマンドのプロセス・ディスパッチ処理の大部分を構成しているプロセスは /usr/sbin/getty です。 /usr/sbin/getty プロセスが個々の端末回線を開始します。一般的に、init コマンドによってディスパッチ される他のプロセスは、デーモンとシェルです。
init コマンドにリンクされている telinit コマンドは、init コマンドのアクションを指示します。 telinit コマンドは、1 文字の引数をとり、適切なアクションを実行するために、kill サブルーチンを使って init コマンドへシグナルを送信します。
telinit コマンドは、システムを特定の実行レベルにします。実行レベルとは、選ばれたプロセス・グループにだけ存在を許可するソフトウェア構成です。システムは、以下に示す実行レベルのうちの 1 つになります。
| 項目 | 説明 |
|---|---|
| 0-9 | システムを実行レベル 0-9 のうちの 1 つに置くよう、init コマンドに指示します。init コマンドが実行レベル 0-9 の変更を要求すると、現在の実行レベルにあるプロセスをすべて抹消してから新規の実行レベルに関連するプロセスを再始動します。 |
| 0-1 | 将来オペレーティング・システムが使用するために予約されています。 |
| 2 | マルチユーザー環境で実行される端末プロセスとデーモンをすべて含めます。マルチユーザー環境では、/etc/inittab ファイルが設定されているので、init コマンドは、システム上の端末ごとにプロセスを生成できます。 また、コンソール・デバイス・ドライバーも、すべての実行レベルで実行するよう設定されているので、システムはコンソールだけをアクティブにしたままで動作できます。 |
| 3-9 | ユーザーの設定に従って定義できます。 |
| S,s,M,m | init コマンドを保守モードに入るよう指示します。システムが別 の実行レベルから保守モードに入ると、システム・コンソールだけが端末として使用されます。 |
以下の引数も同様に、init コマンドに対する指示となります。
| 項目 | 説明 |
|---|---|
| a,b,c,h | /etc/inittab ファイルにあって、実行レベル・フィールドに
a、b、c、または
h を持つレコードだけを処理するよう、init コマンドに指示します。
この 4 つの引数 a、b、c、
および h は真の実行レベルではありません。
それらが実行レベルと異なるのは、init コマンドが、全システムに対して実行レベル a、b、c、または h に入るよう要求できない点です。 init コマンドは、a、b、c、 または h という値が実行レベル・フィールドにある /etc/inittab ファイルを見つけると、プロセスを開始します。 しかし、現在の実行レベルにあるプロセスは抹消しません。すなわち、実行レベル・フィールドに a、b、c、または h を持つプロセスは、現在のシステム実行レベルで既に実行中のプロセスに追加して開始されます。 実際の実行レベルと a、b、c、または h の間のもう 1 つの相違は、a、b、c、または h を設定して開始したプロセスは、init コマンドが実行レベルを変更しても、停止されないという点です。 以下の 3 つの方式によって、a、b、c、または h 処理は停止されます。
|
| Q,q | init コマンドに、/etc/inittab ファイルを再び調べるよう指示します。 |
| N | プロセスを再生成するのを止めるようシグナルを送ります。 |
システム始動時に、ルート・ファイルシステムが事前初期化プロセスでマウントされた後で、以下の一連のイベントが起こります。
- 始動プロセスの最後のステップとして、init コマンドが実行されます。
- init コマンドが、/etc/inittab ファイルを読み取ろうとします。
- /etc/inittab ファイルが存在すれば、init コマンドは /etc/inittab ファイル内に initdefault エントリーを登録しようと試みます。
- initdefault エントリーが存在すれば、init コマンドは指定された実行レベルを初期システム実行レベルとして使用します。
- initdefault エントリーが存在しなければ、init コマンドはユーザーにシステム・コンソール (/dev/console) から実行レベルを入力するよう要求します。
- ユーザーが S、s、M または m 実行レベルを入力すると、init コマンドは保守実行レベルに入ります。 これらの実行レベルだけは、正しくフォーマットされた /etc/inittab ファイルを必要としません。
- /etc/inittab ファイルが存在しなければ、init コマンドはデフォルトでシステムを保守実行レベルにします。
- init コマンドは、60 秒ごとに /etc/inittab ファイルを再読み取りします。前回 init コマンドが読み取った後で /etc/inittab ファイルが変更されていれば、システムの始動時に /etc/inittab ファイル内の新しいコマンドが実行されます。
init コマンドに実行レベルを変更するよう要求すると、init コマンドは /etc/inittab ファイルを読み取り、新規の実行レベルで実行しなければならないプロセスを識別します。次に init コマンドは、新規の実行レベルでは実行してはいけないプロセスをすべて取り消して、新規の実行レベルで実行すべきプロセスを開始します。
これらの実行レベルのそれぞれに対して、init コマンドが実行するプロセスは、/etc/inittab ファイル内に定義されています。実行レベルは、init コマンドにリンクされている telinit コマンドを root ユーザーが実行すると変更されます。このユーザー実行による init コマンドは、システム始動時にシステムが開始した元の init コマンドに適切なシグナルを送ります。 デフォルトの実行レベルは、/etc/inittab ファイル内の initdefault エントリーの実行レベルを修正することにより変更できます。
保守実行レベルでは、コンソール端末 /dev/console が読み取りおよび書き込み用にオープンされています。root のパスワードの入力を求めるプロンプトが表示されます。root のパスワードが正しく入力されると、su コマンドが起動されます。保守実行レベルを終了させるには、以下の 2 つの方法があります。
- シェルが終了していれば、init コマンドは新しい実行レベルを要求します。
または
- init (または telinit) コマンドは、init コマンドにシグナルを送り、システムの実行レベルを強制的に変更させることができます。
システムが始動しようとしているときに、init コマンドが新規の実行レベルを求めるプロンプト表示に明らかに失敗した場合 (initdefault が保守の場合) は、 端末コンソール・デバイス (/dev/console) が物理コンソール以外のデバイスに切り替えられていることが原因である場合があります。このような状況が起こり、ユーザーが /dev/console ではなく物理コンソールでの作業を希望する場合は、物理コンソール・デバイスで DEL (削除) キーを押すことにより、init コマンドを強制的に物理コンソールへ切り替えることもできます。
init コマンドが新規の実行レベルを要求した場合、0 から 9 までの数字のうちの 1 つか、あるいは文字 S、s、M または m のうちのいずれかを入力します。 S、s、M または m を入力すると、init コマンドは保守モードで動作します。 さらに付随する結果として、制御が既に強制的に物理コンソールに切り換えられていれば、/dev/console ファイルも同様にこのデバイスに切り換えられます。 以前に /dev/console ファイルが接続されていたデバイスに対して、 この切り替えが与える影響に関して、init コマンドはメッセージを生成します。
0 から 9 までの実行レベルを入力すると、init コマンドは対応する実行レベルに入ります。init コマンドは、他の入力をすべてリジェクトし、正しい入力を求めるプロンプトを再表示します。init コマンドが保守以外の任意の実行レベルに初めて入った場合、init コマンドは /etc/inittab ファイル内でキーワード boot または bootwait が記述されているエントリーを検索します。init コマンドがこれらのキーワードを見つけると、入った実行レベルがエントリーの実行レベルに対応していれば、それに対応する処理を実行します。例えば、init コマンドはキーワード boot を見付けると、コンピューターをブートします。ファイルシステムの検査およびマウントなどのシステムの特殊な初期化はすべて、ユーザーがシステムに入ることを許可される前に行われます。init コマンドは、/etc/inittab ファイルをスキャンして、そのレベルのプロセスであるすべてのエントリーを探します。次に、/etc/inittab ファイルの通常の処理を再開します。
実行レベル 2 はデフォルトで、マルチユーザー環境で実行されるすべての端末プロセスおよびデーモンを含むよう定義されています。マルチユーザー環境では、/etc/inittab ファイルが設定されているので、init コマンドは、システム上の端末ごとにプロセスを生成できます。
端末プロセスの場合、明示的にファイルの終わりの文字 (EOF) を入力するか、または接続を切断した結果として、シェルが終了します。init コマンドは、そのプロセスが終了したことを示すシグナルを受信すると、その事実と停止原因を /etc/utmp ファイルと /var/adm/wtmp ファイルに記録します。 /var/adm/wtmp ファイルには、開始されたプロセスのヒストリーが保管されます。
/etc/inittab ファイル内の各プロセスを開始するために、init コマンドは子孫のプロセスのうちの 1 つの停止または電源障害シグナル SIGPWR、あるいは init または telinit コマンドによりシステムの実行レベルを変更するようシグナルが送られるまで待機します。これら 3 つの状況の 1 つが発生すると、init コマンドは、/etc/inittab ファイルを再び調べます。/etc/inittab ファイルに新しいエントリーが追加されている場合でも、init コマンドはさらに、3 つの状況のいずれか 1 つが起こるまで待機します。即座に処理させるには、telinit -q コマンドを実行して、/etc/inittab ファイルを再び調べてください。
/etc/inittab ファイル内のある エントリーを連続して実行している (225 秒間に 5 回を超える) 場合、init コマンドはエントリー・コマンド・ストリング内にエラーがあると見なして、エラー・メッセージをコンソールに出力し、エラーをシステム・エラー・ログに記録します。 メッセージを送った後、60 秒間はエントリーが実行されません。エラーが継続して発生する場合、コマンドは 240 秒ごとに 5 回だけエントリーを再入力します。init コマンドは、そのインターバルの間にコマンドが 5 回応答しなくなるか、またはコマンドがユーザーからシグナルを受信するまで、エラーが発生したと見なし続けます。init コマンドは、エラーの最初の発生についてのみ、エラーをログに記録します。
init コマンドが、telinit コマンドから実行レベルを変更するように要求された場合、init コマンドは、現在の実行レベルで未定義のすべてのプロセスに対し、SIGTERM シグナルを送信します。init コマンドは 20 秒たってから、SIGKILL シグナルを使ってこれらのプロセスを停止します。
init コマンドが SIGPWR シグナルを受信し、かつ保守モードでない場合、/etc/inittab ファイルをスキャンして特別な電源障害エントリーを探します。 init コマンドは、これらのエントリーに関連するタスクを起動してから、その他の処理を実行します (実行レベルで許される場合)。このように、システムに電源障害が起こるたびに、init コマンドはクリーンアップおよび記録機能を実行することができます。 これらの電源障害エントリーは、最初に初期化が必要なデバイスを使用してはならない点に注意することが必要です。
環境
init コマンドは、システム上の全プロセスの究極の親元なので、システム上の他のプロセスは init コマンドの環境変数を継承します。 初期化シーケンスの一部として、init コマンドは /etc/environment ファイルを読み取り、そのファイル内のあらゆる割り当てを、その全サブプロセスに渡される環境にコピーします。 init サブプロセスは、ログイン・セッション内からは実行されないので、init から umask 設定を継承しません。これらのプロセスは、umask をどのような値にも設定することができます。 /etc/inittab ファイルから init によって実行されるコマンドは、/etc/security/limits で指定されているデフォルト値ではなく、init の ulimit 値を使用します。その結果、コマンド・ラインから正常に実行されるコマンドを、init によって起動すると、正常に実行されない可能性があります。特定の ulimit 要求を持つコマンドはすべて、要求されたとおりに ulimit 値を設定するための特定のアクションを取り込む必要があります。
セキュリティー
例
ファイル
| 項目 | 説明 |
|---|---|
| /etc/inittab | init コマンドの制御ファイルを指定します。 |
| /etc/utmp | ログイン・ユーザーのレコードを指定します。 |
| /var/adm/wtmp | 永久ログイン・アカウンティング・ファイルを指定します。 |
| /sbin/rc.boot | 事前初期化コマンド・ファイルを指定します。 |
| /etc/rc | 初期化コマンド・ファイルを指定します。 |
| /etc/environment | システム環境変数を指定します。 |
| /dev/console | コンソール・デバイス・ドライバーを指定します。 |