7.2 initプロセス

initプログラムは、プロセスIDが1のプロセスです。このプロセスは、システムの初期化を担当しています。initは直接カーネルから起動し、プロセスを強制終了するsignal 9で終了することはできません。他のすべてのプログラムは、initまたは子プロセスのいずれかによって直接起動されます。

initの中心的な設定は、/etc/inittabファイルで行われています。このファイルはランレベルを定義しています(セクション 7.2.1, ランレベルを参照)。このファイルはまた、各ランレベルで利用可能ななサービスとデーモンを指定しています。/etc/inittabのエントリに応じて、initが複数のスクリプトを実行します。デフォルトでは、ブート後に最初に開始するスクリプトは、/etc/init.d/bootです。システムの初期設定が完了すると、/etc/init.d/rcスクリプトで、ランレベルがデフォルトのランレベルに変更されます。わかりやすくするために、これらのinitスクリプトと呼ばれるスクリプトはすべて、ディレクトリ/etc/init.dにあります(セクション 7.2.2, initスクリプトを参照)。

システムを起動し、シャットダウンするプロセス全体は、initによって管理されます。この点から見ると、カーネルは、他のプログラムからの要求に従って、他のすべてのプロセスとCPU時間やハードウェアアクセスを管理するバックグラウンドプロセスと考えることができます。

7.2.1 ランレベル

Linuxでは、ランレベルはシステムの起動方法および稼動中のシステムで使用可能なサービスを定義します。ブート後、システムは/etc/inittabinitdefault行での定義に従って起動します。通常のランレベルは3または5です。参照先表 7-1別の方法として、ランレベルをブート時に(たとえばブートプロンプトにランレベル番号を追加する)指定することもできます。パラメータは、カーネル自体が直接評価するもの以外、initに渡されます。ランレベル3にブートするには、ブートプロンプトに単一番号3を追加します。

表 7-1 ランレベルの種類

ランレベル

説明

0

システム停止

Sまたは1

シングルユーザモード

2

リモートネットワーク(NFSなど)なしのローカルマルチユーザモード

3

ネットワークを使用するフルマルチユーザモード

4

[ユーザ定義]。管理者が設定しない限り使用されないランレベル。

5

ネットワークとXディスプレイマネージャのKDM、GDM、またはXDMを使用するフルマルチユーザモード

6

システム再起動

重要: パーティションがNFSマウントされている場合にはランレベル2は避ける

システムでNFSを介して/usrなどのパーティションをマウントする場合は、ランレベル 2を使用しないでください。NFSサービスは、ランレベル2(リモートネットワークのないローカルマルチユーザモード)では使用できないため、プログラムファイルまたはライブラリがない場合、システムは予想しない動作をする可能性があります。

システムの稼動中にランレベルを変更するには、telinitの後に、ランレベルに対応する番号を引数として入力します。これができるのは、システム管理者だけです。次のリストは、ランレベルに関連した最も重要なコマンドの概要です。

telinit 1またはshutdown now

システムはシングルユーザモードに入ります。このモードは、システムメンテナンスや管理タスクで使用します。

telinit 3

(ネットワークを含む)すべての重要なプログラムとサービスが起動します。グラフィック環境はありませんが、一般ユーザは、システムにログインして作業することができます。

telinit 5

グラフィック環境は有効になります。通常、XDM、GDMまたはKDMなどのディスプレイマネージャが起動します。自動ログインが有効な場合、ローカルユーザは事前に選択されているウィンドウマネージャ(GNOME、KDEまたはその他のウィンドウマネージャ)にログインします。

telinit 0またはshutdown -h now

システムは停止します。

telinit 6またはshutdown -r now

システムは停止した後、再起動します。

ランレベル5は、すべてのSUSE Linux Enterprise Server標準インストールにおけるデフォルトのランレベルです。ユーザは、グラフィカルインタフェースでログインするように求められます。デフォルトユーザの場合は自動的にログインされます。デフォルトのランレベルは3で、ランレベルを5に切り替えるには、セクション 12.0, X Windowシステムで説明するようにX Window Systemを正しく設定している必要があります。その後、telinit5を入力して、システムが意図したとおりに動作するかを確認します。すべてが意図したとおりに動作した場合は、YaSTを使用してデフォルトのランレベルを5に設定します。

警告: /etc/inittab内のエラーのためシステムブートが失敗することがある

/etc/inittabが破損した場合、システムが正しく起動しないことがあります。そのため、/etc/inittabを編集する場合は細心の注意を払ってください。また、コンピュータを再起動する前には、常にtelinitqコマンドを使って、initに/etc/inittabを再読み込みさせるようにしてください。

ランレベルを変更するときには、一般に2つの操作が行われます。1つは、現在のランレベルの停止スクリプトが起動し、現在のランレベルに必要なプログラムを終了します。次に、新しいランレベルの起動スクリプトが起動します。ここで、ほとんどの場合、プログラムがいくつか起動します。たとえば、ランレベルを3から5に変更する場合、次の操作が行われます。

  1. 管理者(root)がtelinit 5を入力して、initにランレベルを変更することを伝えます。

  2. initは現在のランレベル(runlevel)を調べ、新しいランレベルをパラメータとして/etc/init.d/rcを起動する必要があるかどうか判断します。

  3. ここでrcは、現在のランレベルの停止スクリプトであって、新しいランレベルの起動スクリプトがないものを呼び出します。この例では、元のランレベルが3なので、/etc/init.d/rc 3.dの中のKで始まるすべてのスクリプトが対象となります。Kの次の番号は、stopパラメータを使ってスクリプトを実行する順番を示します(検討する必要がある依存関係が存在するため)。

  4. 最後に、新しいランレベルの起動スクリプトを起動します。この例では/etc/init.d/rc5.dの中のSで始まるスクリプトがそれにあたります。この場合も、Sの次の番号が、スクリプトの実行順序を表します。

現在のランレベルと同じランレベルに変更する場合、initは/etc/inittabの変更部分だけをチェックし、適切な手順を開始します。たとえば、別のインタフェースでgettyを起動します。telinit qコマンドを使用しても同じ操作を実行できます。

7.2.2 initスクリプト

/etc/init.d内に、2種類のスクリプトがあります。

initによって直接実行されるスクリプト

これは、ブートプロセスの実行中、または即座のシステムシャットダウンを行ったとき(電源障害またはユーザがCtrl+Alt+Delキーを押した場合)にのみ適用されます。IBM System zシステムの場合、ブートプロセスの実行中または即座のシステムシャットダウンを行ったとき(電源障害またはシグナルによる停止)にのみ適用されます。こうしたスクリプトの実行は、/etc/inittabで定義されます。

initによって間接的に実行されるスクリプト

これらは、ランレベルの変更時に実行され、関連スクリプトの正しい順序を保証するマスタスクリプト/etc/init.d/rcを常に呼び出します。

すべてのスクリプトは、/etc/init.dにあります。ブート時に実行されるスクリプトは、/etc/init.d/boot.dからのシンボリックリンク経由で呼び出されます。ランレベルを変更するスクリプトもサブディレクトリの1つからのシンボリックリンク(/etc/init.d/rc0.dから/etc/init.d/rc6.dへ)経由で呼び出されます。これは単にわかりやすくして、複数のランレベルで使用されている場合にスクリプトが重複するのを防ぐためです。すべてのスクリプトは、起動スクリプトとしても停止スクリプトとしても実行できるので、これらのスクリプトはパラメータのstartstopを認識する必要があります。また、これらのスクリプトはrestartreloadforce-reload、およびstatusのオプションも認識します。これらのオプションについては、表 7-2で説明します。initによって直接実行されるスクリプトには、このようなリンクはありません。こうしたスクリプトは、必要なときにランレベルとは無関係に実行されます。

表 7-2 initスクリプトのオプション

オプション

説明

起動

サービスを起動します。

中止

サービスを停止します。

restart

サービスが実行中の場合は、停止して再起動します。実行中でない場合は、起動します。

reload

サービスの停止や再起動をせずに、設定を再ロードします。

force-reload

サービスが設定の再ロードをサポートする場合は、それを実行します。サポートしない場合は、restartが指定された場合と同じ操作を行います。

ステータス

サービスの現在のステータスを表示します。

ランレベル固有のサブディレクトリにあるリンクによって、スクリプトを複数のランレベルに関連付けることができます。パッケージのインストールまたはアンインストール時に、プログラムinsservを使用して(またはこのプログラムを呼び出す/usr/lib/lsb/install_initdスクリプトを使用して)、このようなリンクを追加または削除することができます。詳細は、insserv(8)のmanページを参照してください。

これらの設定は、YaSTモジュールにより変更されることもあります。コマンドラインからステータスを確認するには、chkconfigツールを使います。このツールの詳細は、chkconfig(8)マニュアルページを参照してください。

次に、最初または最後に起動するブートスクリプトおよび停止スクリプトの概略を示すとともに、保守スクリプトについて説明します。

boot

initを直接使用してシステムを起動するときに実行されます。選択したランレベルから独立で、一度だけ実行されます。これによって /proc ファイルシステムと/dev/ptsファイルシステムがマウントされ、blogd(ブートログ出力デーモン)が有効化されます。システムがアップデートまたはインストール後初めてブートされる場合、初期システム設定が起動します。

blogdデーモンは、bootおよびrcによって最初に起動されるサービスです。また、これらのスクリプトにより開始されたアクション(サブスクリプトの実行、たとえばブロック特殊ファイルを利用可能にする)が完了すると停止します。blogdは、/varが読み書き可能でマウントされている場合にのみ、画面出力をログファイル/var/log/boot.msgに出力します。そうでない場合は、/varが利用できるようになるまで、blogdがすべての画面データをバッファします。blogdについての詳細は、blogd(8)のmanページを参照してください。

bootスクリプトはまた、/etc/init.d/boot.dの中のSで始まる名前のスクリプトをすべて起動します。そこで、ファイルシステムがチェックされ、必要に応じてループデバイスが設定されます。加えて、システム時間が設定されます。ファイルシステムの自動チェックや修復中にエラーが発生した場合、システム管理者はルートパスワードを入力して介入することができます。最後に実行されるスクリプトは、boot.localです。

boot.local

ブート時、ランレベルへの移行前に実行する追加のコマンドを入力します。これは、DOSシステムのAUTOEXEC.BATに相当します。

halt

このスクリプトは、ランレベル  0 または 6 への移行時のみ実行され、halt またはrebootとして機能します。システムがシャットダウンするかリブートするかは、haltの呼び出され方に依存します。シャットダウン時に特別なコマンドが必要な場合は、それらのコマンドをhalt.localスクリプトに追加してください。

rc

このスクリプトは、現在のランレベルの適切な停止スクリプトと、新しく選択したランレベルの起動スクリプトを呼び出します。Like the /etc/init.d/bootスクリプトと同様、このスクリプトは、目的のランレベルをパラメータとして使用して、/etc/inittabから呼び出します。

独自のスクリプトを作成して、先に説明したスキーマに容易に組み込むことができます。カスタムスクリプトの形式、名前付け、および構成方法は、LSBの仕様と、initinit.dchkconfig、およびinsservのマニュアルページを参照してください。加えて、startprocおよびkillprocのマニュアルページも参照してください。

警告: initスクリプトのエラーはシステムの停止につながる

initスクリプトに問題があると、コンピュータがハングアップします。このようなスクリプトは最大限の注意を払って編集し、可能であれば、マルチユーザ環境で徹底的にテストします。initスクリプトに関する他の情報は、セクション 7.2.1, ランレベルを参照してください。

特定のプログラムまたはサービス用にカスタムのinitスクリプトを作成する場合は、テンプレートとしてファイル/etc/init.d/skeletonを使用します。このファイルのコピーを別名で保存し、関連のプログラムやファイル名、パス、その他の詳細を必要に応じて編集します。また場合によっては、initプロシージャで正しいアクションが実行されるように、独自の改良をスクリプトに加える必要があります。

最初に記載されているINIT INFOブロックはスクリプトの必須部分で、次のように編集する必要があります。詳細については、例 7-1を参照してください。

例 7-1 最低限のINIT INFOブロック

### BEGIN INIT INFO
# Provides:          FOO
# Required-Start:    $syslog $remote_fs
# Required-Stop:     $syslog $remote_fs
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Description:       Start FOO to allow XY and provide YZ
### END INIT INFO

INFOブロックの最初の行では、Provides:の後に、このinitスクリプトで制御するプログラムまたはサービスの名前を指定します。Required-Start:」および「Required-Stop:」行には、このサービスを開始/停止する前に開始/停止する必要があるすべてのサービスを指定します。この情報は後で、ランレベルディレクトリに表示するスクリプト名に対し、番号を生成するために使用します。Default-Start:およびDefault-Stop:の後に、サービスが自動的に起動または停止する際のランレベルを指定します。最後に、Description:の下に、対象のサービスについての簡単な説明を記載します。

ランレベルディレクトリ(/etc/init.d/rc?.d/)から/etc/init.d/内の対応するスクリプトへのリンクを作成するには、コマンドinsserv <新しいスクリプト名>を入力します。insservプログラムは、INIT INFOヘッダを評価して、ランレベルディレクトリ(/etc/init.d/rc?.d/)のスクリプトを起動、停止するために必要なリンクを作成します。このプログラムはまた、必要な番号をこれらのリンクの名前に取り込むことによって、ランレベルごとに正しい起動、停止の順序を管理します。グラフィックツールを使用してリンクを作成する場合は、セクション 7.2.3, YaSTでのシステムサービス(ランレベル)の設定;の説明に従って、YaSTのランレベルエディタを使用します。

/etc/init.d/にすでに存在するスクリプトを既存のランレベルスキーマに統合する場合は、はじめにinsservを使用するか、YaSTのランレベルエディタで対応するサービスを有効にすることにより、ランレベルディレクトリにリンクを作成します。変更内容は、次回のブート時に適用され、新しいサービスが自動的に起動します。

作成したリンクは手動で設定しないでください。INFOブロック内に誤りがある場合は、後で他のサービスに対してinsservを実行すると問題が生じます。手動で追加されたサービスは、このスクリプトに対するinsservの次回実行時に削除されます。

7.2.3 YaSTでのシステムサービス(ランレベル)の設定;

[YaST] > [システム] > [システムサービス(ランレベル)]の順に選択して、このYaST moduleを起動すると、利用可能なすべてのサービスの概要と、各サービスの現在のステータス(有効か無効か)が表示されます。モジュールを[単純モード][エキスパートモード]のどちらで使用するかを決定します。ほとんどの場合、デフォルトの[単純モード]で十分です。左の列にはサービスの名前が、中央の列にはその現在のステータスが、右の列には簡単な説明が表示されます。ウィンドウの下部には、選択したサービスについての詳細な説明が表示されます。サービスを有効にするには、表でそれを選択し、[有効にする]を選択します。同じ手順で、サービスを無効にできます。

サービスの起動または停止時のランレベルを詳細に制御する場合、またはデフォルトのランレベルを変更する場合は、最初に[エキスパートモード]を選択します。上部には、現在のデフォルトのランレベル、つまりinitdefault (システムのブート時にデフォルトで入るランレベル)が表示されます。通常、SUSE Linux Enterprise Serverシステムのデフォルトのランレベルは、5(ネットワークありフルマルチユーザモードおよびX)です。適切な代替の設定は、ランレベル3 (ネットワークありフルマルチユーザモード)です。

YaSTのダイアログボックスでは、ランレベルのいずれか1つを新しいデフォルトとして選択できます(表 7-1を参照)。また、このウィンドウのテーブルを使用して、個々のサービスやデーモンを有効、無効にできます。テーブルには、利用可能なサービスとデーモンが一覧表示され、現在システム上で有効かどうかと、有効な場合はそのランレベルが表示されます。マウスで行を選択し、ランレベルを表すチェックボックス([B][0][1][2][3][5][6][S])をクリックして、選択しているサービスまたはデーモンが実行されるランレベルを定義します。ランレベル4は、カスタムランレベルを作成できるように未定義になっています。最後に現在選択しているサービスまたはデーモンの簡単な説明が、テーブルの概要の下に表示されます。

警告: ランレベルの設定を誤るとシステムに害が及ぶことがある

ランレベルの設定が誤っていると、システムを使用できなくなることがあります。変更を実際に適用する前に、どういう結果が出るかをよく確認してください。

図 7-1 システムサービス(ランレベル)

[スタート/中止/更新]をクリックして、サービスを有効化するかどうかを決定します。現在の状態が自動的に確認されなかった場合は、[状態を更新]を使用して確認することができます。[設定/リセット]をクリックすると、変更をシステムに適用するか、ランレベルエディタの起動前に存在していた設定を復元するかを選択できます。[完了]を選択すると、設定の変更がディスクに保存されます。