EN JA
INIT(8)
INIT(8) FreeBSD System Manager's Manual INIT(8)

名称

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

書式

init

init [ 0 | 1 | 6 | c | q]

解説

init ユーティリティは、ブート処理の最後に起動されます。 init は、通常、 rc(8) で説明されている自動リブートシーケンスを実行します。それが成功すると、システムは、マルチユーザモードになります。リブートスクリプトの実行に失敗すると、 init は、スーパユーザが使うシェルを起動してシングルユーザモードを開始させます。 init ユーティリティは、ブートプログラムからのパラメータの指示を受けて、マルチユーザモードに移行せず、一般のデーモンを起動することなくシングルユーザモードのシェルを起動させることができます。その場合、システムは、メンテナンスのためのモードになり、シェルを抜ける (^D を入力する) ことでシングルユーザモードからマルチユーザモードになります。これによって、 init は、 /etc/rc をファストブートモード (ディスクチェック省略) で実行します。

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

システムセキュリティレベル ( security(7) 参照) が最初に 0 であるなら、 init は、変更しないままとします。そうでなければ、 init は、最初にレベル 1 に上げます。レベルは、減らすことはできませんので、その後の操作においてはレベルは、最低 1 であり、これは、シングルユーザモードに戻る場合においても成立ちます。マルチユーザで実行している間に 1 より高いレベルで実行したいなら、例えば、スタートアップスクリプト rc(8) によって、 kern.securelevel 変数に必要なセキュリティレベルを設定するために sysctl(8) を使用して、マルチユーザになる前にそれを設定することができます。

init が jail 中で実行される場合、“ホストシステム”のセキュリティレベルは、影響しません。 jail をサポートするためにカーネル中に設定される情報の一部には、jail 毎のセキュリティレベルがあります。これにより、ホストシステムよりも高いセキュリティレベルで jail 内を実行することが可能となります。 jail に関する更なる詳細は、 jail(8) を参照してください。

マルチユーザモードの場合、 init は、 ttys(5) ファイルで指示された端末ポートのためのプロセスを管理します。 init ユーティリティは、このファイルを読み込み、 2 番目のフィールドに指示されたコマンドを実行します。ただし、1 番目のフィールドが /dev 中のデバイスを参照し、そのデバイスが設定されていない場合は、例外です。 1 番目のフィールドは、コマンドへ渡される最後の引数になります。そのコマンドは、通常、 getty(8) で、 getty は、tty をオープン、初期化し、 login(1) プログラムを実行します。 login プログラムは、有効なユーザがログインするとき、シェルを起動します。このシェルが死ぬ (die) とき、ユーザがログアウトするか、または (シグナルが) 起こって異常終了のいずれかのために、サイクルは、ラインのための新しい getty を実行することによってに再開されます。

init ユーティリティは、任意のデーモンを走行させ続けるためにも使用可能であり、デーモンが死んだ場合には、自動的に再開します。この場合、 ttys(5) ファイルの 1 番目のフィールドは、設定されたデバイスノードへのパスを参照してはならず、デーモンに対する最後のコマンドライン引数として渡されます。これは、 AT&T System V UNIX /etc/inittab にある機能と同様です。

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

kill -TERM 1”などによって terminate シグナル ( TERM) を受けると、 init ユーティリティは、マルチユーザモードを終了し、シングルユーザモードに復帰します。ハードウェアまたはソフトウェアの問題でデッドロックしたプロセスがある場合、 init は、すべてのプロセスの終了を待たず (これは、無限に終らないかも知れません)、 30 秒間でタイムアウトして警告のメッセージを出力します。

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

interrupt シグナル ( INT)、すなわち“ kill -INT 1”、を送ると、 init ユーティリティは、すべてのプロセスを (デッドロックプロセスを待たずに) 終了させ、リブートを実行します。この操作は、マシンがハングした時に、カーネルの中から、あるいは、X から、システムを安全にシャットダウンするのに便利です。

init ユーティリティは、同様に、ユーザ定義シグナル 1 ( USR1) を送られた場合は、マシンを停止し、ユーザ定義シグナル 2 ( USR2) を送られた場合は、マシンを停止してから電源を切ります (ハードウェアが許す場合)。

マシンをシャットダウンする時、 init は、 /etc/rc.shutdown スクリプトを実行しようとします。このスクリプトは、 innd (インターネットニュースサーバ) のような特定のプログラムを綺麗に終了させるために使用可能です。このスクリプトが 120 秒以内に終了しないなら、 init は、それを終了します。タイムアウトは、 sysctl(8) 変数 kern.init_shutdown_timeout を通して設定することができます。

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

2 番目の書式行のようにユーザプロセスとして実行する場合、 init は、 AT&T System V UNIX の動作をエミュレートします。すなわち、スーパユーザがコマンドラインで ランレベル を指定可能であり、 init は、オリジナルの (PID 1) init に次のようなシグナルを送ります:

ランレベル シグナル 動作
0 SIGUSR2 停止して電源切断
1 SIGTERM シングルユーザモードへ移行
6 SIGINT マシンを再起動
c SIGTSTP 更なるログインを抑止
q SIGHUP ファイル ttys(5) を再スキャン

関連ファイル

/dev/console
システムのコンソールデバイス
/dev/tty*
ttys(5) 内にある端末ポート
/etc/ttys
端末の初期化情報が書かれたファイル
/etc/rc
システム立ち上げ用スクリプト
/etc/rc.shutdown
システムシャットダウン用スクリプト
/var/log/init.log
rc(8) のログは、システムコンソールデバイスが利用可能でないなら、出力します。

診断

getty repeating too quickly on port %s, sleeping.
ラインにサービスを提供するプロセスが、起動されるたびにすぐ終了してしまう。これは、端末ラインに着信があるかノイズが大きい場合にしばしば起こります。
init は、30 秒間スリープし、その後、プロセスを開始させようとし続けます。
some processes would not die; ps axl advised.
シャットダウンの際、ハングしていて終了させられないプロセスがあります。この状態は、通常、デバイスに異常があるときにデバイスドライバで貼り付いてしまうことにより起こります。

歴史

init ユーティリティは、 Version 6 AT&T UNIX で登場しました。

警告

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

ブートシーケンスにおいて、セキュリティレベルを 1 より高く設定するのがあまりにも早すぎると、 fsck(8) が一貫性のないファイルシステムを補修することを妨げてしまう可能性があります。セキュリティレベル設定を行う場所として適切なところは、全てのマルチユーザ立ち上げ処理が完了した後である、 /etc/rc の末尾です。

March 14, 2012 FreeBSD