INIT(8)

名称
init - プロセス制御の初期化を行う

書式
init

解説
init プログラムは、ブートプロセスの最後に起動されます。 init は通常 reboot(8) で説明されている自動リブートシーケンスを実行します。これが成功すると システムはマルチユーザモードになります。 リブートスクリプトの実行に失敗すると、 init はスーパユーザにコンソールのシェルを渡して、シングルユーザモードを開始します。

init プログラムは、ブートプログラムからのパラメータの指示を受けて、 マルチユーザモードに移行せず、一般のデーモンを起動することなく シングルユーザモードのシェルを起動させることができます。 それからシステムはメンテナンスのための静止状態になり、 シングルユーザのシェルを抜ける (^D を入力する) ことでマルチユーザモードになります。 これを行うと、 init はスタートアップコマンドファイルの /etc/rc をファーストブートモード (ディスクチェックを省略する) で実行します。

もし ttys(5) ファイルの ‘console’ のエントリが ``insecure'' にマークされていた場合には、 init はシングルユーザモードのシェルを起動する前に、 スーパユーザのパスワードを要求します。 パスワードチェックは、 ‘console’ が ``secure'' にマークされていればスキップされます。

カーネルは 4 段階のセキュリティレベルで走行します。 どのスーパーユーザプロセスもセキュリティレベルを上げることができますが、 レベルを下げることができるのは init だけです。セキュリティレベルは以下のように定義されます:

-1  常に危険なモード - システムは常にレベル 0 モードで走行します。

0   危険なモード - immutable (変更不可) フラグや append-only (追加のみ) フラグが 変更される可能性があります。全てのデバイスは、そのパーミッションに従って 読み書きされます。

1   安全なモード - system immutable フラグや system append-only フラグを 無効にできません。マウントされたファイルシステムのディスクおよび /dev/mem や /dev/kmem は read-only となります。

2   安全度の高いモード - レベル 1 のモードの効果に加え、ディスクは マウントさていようといまいと、常に read-only となり、新しいディスクは マウントできず、マウント済みのものは read-write から read-only への ダウングレードしかできません。 このレベルは、ファイルシステムをアンマウントして変更を加えることを不可能に します。また、システムがマルチユーザで走行中に newfs(8) を実行することも出来なくなります。 settimeofday(2) システムコールでは、時間を進めることしかできなくなります。 ipf(8) の状態 (カーネル組込みの IP フィルタリング機能) は変更できません。 セキュリティレベルの高いモードからセキュリティの保証されないモード (つまり、シングルユーザモード) へのダウングレードには、常に root のパスワード をコンソール上で入力することが要求されます。これは、そのコンソールが /etc/ttys で 'secure' とマークされているかどうかは関係しません。

通常、シングルユーザモードではレベル 0 で、マルチユーザモードではレベル 1 で、 システムは走ります。マルチユーザモードにおいてレベル 2 でシステムを 走らせたい場合は、 /etc/rc の中で sysctl(8) を使えば設定できます。 マルチユーザモード時にレベル 0 でシステムを走らせたい場合は、 システム管理者はカーネルコンフィギュレーションファイルに options INSECURE を入れてカーネルを構築することで、カーネルの変数 securelevel を -1 に初期化しておかなければなりません。詳細は options(4) と config(8) を参照してください。

マルチユーザモードの場合、 init は ttys(5) ファイルで指示されたターミナルポートのためのプロセスを管理します。 init は、このファイルを読み込み、2 番目のフィールドに指示されたコマンドを 実行します。そのコマンドは通常、 getty(8) で、 これは tty をオープン、初期化し、 login(1) プログラムを実行します。 login(1) プログラムは、ユーザがログインするとシェルを起動します。ユーザが ログアウトするかシェルの異常終了 (シグナル) によりそのシェルが終了すると init プログラムが起こされ、 utmp(5) ファイルからユーザを消し、 wtmp(5) ファイルにログアウトを記録します。この後、 init がその端末用の新しい getty(8) を実行することで、このサイクルがリスタートします。

ラインの状態 (on, off, secure, getty, ウインドウの情報) は、 ttys(5) ファイルを書き換えて、 “kill -HUP 1” でシグナル SIGHUP を init に送ることで、リブートせずに変更できます。 このシグナルを受け取ると init は ttys(5) ファイルを再度読み込みます。 ttys(5) でラインが off にされると、 init は、そのラインに関係するセッションのプロセスに SIGHUP シグナルを送ります。 off であったラインが、 ttys(5) ファイルで on にされると、新規にログインできるように、 init は新しい getty(8) を実行します。ラインの getty やウィンドウフィールドが変更された場合、 その変更は現在のログインセッションが終了するまで有効にはなりません。 (例えば、 init によって新しいプロセスが起動されるまで有効になりません。) ttys(5) 中のあるラインをコメントアウトするか削除した場合は、 init はそのラインに関しては何も実行しません。しかしこの場合、 ttys(5) ファイルと utmp(5) ファイル内の情報が一致しなくなるため、これを試すことはお勧めしません。

init は、 “kill -TERM 1” などで terminate (TERM) シグナルを受けると、マルチユーザモードを終了し、 シングルユーザモードに復帰します。 デッドロックしたプロセスがある場合 (ハードウェアまたはソフトウェアの問題 により起こる)、 init はすべてのプロセスが死ぬまで待たずに (永遠に待つことになるため) 、 30 秒でタイムアウトして警告のメッセージを出力します。

init は、 terminal stop (TSTP) シグナルを受けると (“kill -TSTP 1” )、新しい getty(8) を起動するのをやめ、徐々にシステムを停止可能な状態にすることが出来るように なります。その後、hangup でマルチユーザモードに戻り、terminate でシングルユーザモードに移ります。 この hook は、 reboot(8) と halt(8) で使われています。

init は、死ぬとシステムが自動的にリブートされるので、その役割は非常に重要です。 もし、ブート時に init プログラムを見つけられなければ、システムは ``panic: init died (signal %d, exit %d)'' というメッセージを出力して panic で終了します。

診断

getty repeating too quickly on port %s, sleeping ラインにサービスを提供するプロセスが、起動されるたびに すぐ終了してしまっています。 これは、端末ラインに着信があるかノイズが大きい場合にしばしば起こります。 Init will sleep for 10 seconds, then continue trying to start the process.

some processes would not die; ps axl advised. シャットダウンの際に、ハングしているプロセスがあって殺すことが出来ない 状態にあります。この状態は、通常、デバイスに異常があるときに プロセスがデバイスドライバ内で行き詰まっていることにより起こります。

関連ファイル
/dev/console
    システムのコンソールデバイス
/dev/tty*
    ttys(5) 内にある端末ポート
/var/run/utmp
    現在ログインしているのユーザの情報
/var/log/wtmp
    すべてのログイン・ログアウトの情報
/etc/ttys
    端末の初期化情報が書かれたファイル
/etc/rc
    システム立ち上げ用スクリプト

関連項目
login(1), kill(1), sh(1), options(4), ttys(5), config(8), crash(8), getty(8), halt(8), rc(8), reboot(8), shutdown(8)

歴史
init コマンドは AT&T UNIX から登場しました。

バグ
sysctl(8) を持たないシステムは、セキュリティレベル -1 で動作します。