LinuxでInitコマンドを使用する方法

Initはすべてのプロセスの親です。 その主な役割は、 / etc / inittabファイル( inittab (5)を参照)に格納されたスクリプトからプロセスを作成することです。 このファイルには通常、ユーザがログインできる各行にgettyを生成させるエントリがあります 。また、特定のシステムで必要となる自律的なプロセスも制御します。

ランレベル

ランレベルは、選択されたプロセスグループのみを存在させることができるシステムのソフトウェア構成です。 これらのランレベルごとにinitによって生成されるプロセスは、 / etc / inittabファイルで定義されます。 Initは8つのランレベルのいずれかになります。0〜6Sまたはsです。 ランレベルは、特権ユーザーがtelinitを実行することによって変更されます。これは適切なシグナルをinitに送信し、変更するランレベルを通知します。

ランレベル0,1 、および6は予約されています。 ランレベル0はシステムの停止に使用され、ランレベル6はシステムの再起動に使用され、ランレベル1はシステムをシングルユーザーモードにダウンさせるために使用されます。 ランレベルSは、実際には直接使用するつもりはありませんが、ランレベル1に入るときに実行されるスクリプトの詳細です。詳細は、 shutdown (8)とinittab (5)のマンページを参照してください。

ランレベル7-9も有効ですが、実際には文書化されていません。 これは、伝統的なUnixの亜種がそれらを使用していないためです。 好奇心が強い場合は、ランレベルSSは実際に同じです。 内部的には同じランレベルのエイリアスです。

ブート

initがカーネルブートシーケンスの最後のステップとして呼び出された後、 / etc / inittabファイルを探して、 initdefaultタイプのエントリがあるかどうかを調べますinittab (5)を参照)。 initdefaultエントリは、システムの最初のランレベルを決定します。 そのようなエントリがない場合(または/ etc / inittabがまったくない場合)は、ランレベルをシステムコンソールに入力する必要があります。

ランレベルSまたはsはシステムをシングルユーザーモードにし、 / etc / inittabファイルは必要ありません。 シングルユーザモードでは、 / dev / consoleにルートシェルがオープンされています。

シングルユーザモードに入ると、 initはコンソールのioctl (2)状態を/etc/ioctl.saveから読み込みます。 このファイルが存在しない場合、 init9600ボーCLOCAL設定で回線を初期化します。 initがシングルユーザモードを終了すると、コンソールのioctl設定がこのファイルに保存されるので、次のシングルユーザセッションで再利用できます。

初めてマルチユーザモードに入るとき、 initbootbootwaitエントリを実行して、ユーザがログインする前にファイルシステムをマウントできるようにします。その後、ランレベルに一致するすべてのエントリが処理されます。

新しいプロセスを開始するとき、 initは最初にファイル/ etc / initscriptが存在するかどうかをチェックします。 存在する場合は、このスクリプトを使用してプロセスを開始します。

子プロセスが終了するたびにinit/ var / run / utmpおよび/ var / log / wtmpに存在するファクトとその理由を記録します。

ランレベルの変更

指定されたすべてのプロセスを起動した後、 initは子孫プロセスの1つが死ぬのを待つか、powerfailシグナルを出すか、 telinitによってシステムのランレベルを変更するように通知されます。 上記の3つの条件のいずれかが発生すると、 / etc / inittabファイルが再検査されます。 新しいエントリはいつでもこのファイルに追加できます。 しかし、 initは上記の3つの条件の1つが発生するのを待ちます。 瞬間的な応答を提供するために、 telinit Qコマンドまたはqコマンドは、 init起動して/ etc / inittabファイルを再検査することができます。

initがシングルユーザモードでなく、powerfailシグナル(SIGPWR)を受け取った場合、 initはファイル/ etc / powerstatusを読み込みます。 次に、このファイルの内容に基づいてコマンドを開始します。

失敗します)

電源が切れている、UPSは電源を供給しています。 powerwaitpowerfailエントリを実行します。

OK)

電源が復元され、 powerokwaitエントリが実行されます。

L(OW)

電源が落ちていて、UPSのバッテリが少なくなっています。 powerfailnowエントリを実行します。

/ etc / powerstatusが存在しないか、他にFOまたはLの文字が含まれていると、initは文字Fを読み取ったかのように動作します。

SIGPWR/ etc / powerstatusの使用はお勧めしません。 initと対話したい人は、 / dev / initctl制御チャネルを使うべきです。これについては、 sysvinitパッケージのソースコードを参照してください。

initがランレベルの変更を要求されると、新しいランレベルで定義されていないすべてのプロセスに警告信号SIGTERMが送信されます。 その後、 SIGKILL信号を介してこれらのプロセスを強制的に終了させる5秒間待機します。 initは、これらのプロセス(およびそれらの子孫)がinitが最初に作成したのと同じプロセスグループに残っていることを前提としています。 いずれかのプロセスがプロセスグループ所属を変更した場合、これらのシグナルは受信されません。 そのようなプロセスは別々に終了する必要があります。

Telinit

/ sbin / telinit/ sbin / initにリンクされています 。 これは1文字の引数をとり、適切なアクションを実行するためにinitにシグナルを送ります 。 次の引数は、 telinitの指示になります。

0,1,2,3,4,5または6

指定された実行レベルに切り替えるようにinitに指示します。

abc

ランレベルab、またはcを持つ/ etc / inittabファイルのエントリだけを処理するようにinitに指示します

Qまたはq

/ etc / inittabファイルを再検査するようにinitに指示します。

Sまたはs

シングルユーザモードに切り替えるようにinitに指示します。

Uu

自分自身を再実行するようにinitに指示します (状態を保持します)。 / etc / inittabファイルの再検査は行われません。 実行レベルはSs12345の 1つでなければなりません。さもなければ、要求は黙って無視されます。

telinitは、SIGTERMシグナルとSIGKILLシグナルの送信の間にどれくらい待つべきかをinitに伝えることもできます。 デフォルトは5秒ですが、これは-t secオプションで変更できます。

telinitは、適切な特権を持つユーザーだけが呼び出すことができます。

initバイナリは、そのプロセスIDを調べてinittelinitかをチェックします 。 実際のinitのプロセスIDは常に1です。 これにより、 telinitを呼び出す代わりに、代わりにinitをショートカットとして使用することもできます。