8.2 initプロセス

プログラムinitは、プロセスID 1のプロセスであり、必要な方法でシステムの初期化を実行します。init は特別な役割を果たします。 initはカーネルによって直接起動され、通常はプロセスを強制終了するシグナル9が使えないようにします。 他のすべてのプログラムは、initまたは子プロセスのいずれかによって直接起動されます。

initの中心的な設定は、/etc/inittabファイルで行われています。このファイルはランレベルを定義しています(8.2.1項 「ランレベル」を参照)。 このファイルはまた、各レベルで利用可能なサービスとデーモンを指定しています。 /etc/inittabのエントリに応じて、initが複数のスクリプトを実行します。 わかりやすくするために、initスクリプトと呼ばれるこれらのスクリプトはすべて、ディレクトリ/etc/init.dにあります(8.2.2項 「initスクリプト」を参照)。

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

8.2.1 ランレベル

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

表 8.1 ランレベルの種類

ランレベル

説明

0

システム停止

S

シングルユーザモード(ブートプロンプトからUSキーボードマッピングで入力された場合)

1

シングルユーザモード

2

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

3

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

4

未使用

5

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

6

システム再起動

[Important]パーティションが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標準インストールにおけるデフォルトのランレベルです。 ユーザは、グラフィカルインタフェースでログインするように求められます。デフォルトユーザの場合は自動的にログインされます。 デフォルトのランレベルは3で、ランレベルを5に切り替えるには、第14章 X Windowシステムで説明するようにX Window Systemを正しく設定している必要があります。 その後、telinit 5 を入力して、システムが意図したとおりに動作するかを確認します。 すべてが意図したとおりに動作した場合は、YaSTを使用してデフォルトのランレベルを5に設定します。

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

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

  2. initはその設定ファイル(/etc/inittab)を調べ、新しいランレベルをパラメータとして使用して/etc/init.d/rcを起動する必要があるかどうか判断します。

  3. ここでrcは、現在のランレベルの停止スクリプトであって、新しいランレベルの起動スクリプトがないものだけをすべて呼び出します。 この例では、元のランレベルが3なので、/etc/init.d/rc3.dの中のKで始まるすべてのスクリプトが対象となります。 依存性を考慮する必要がありますが、Kの後の数字によって、一定の起動順序を指定します。

  4. 最後に、新しいランレベルの起動スクリプトを起動します。 この例では/etc/init.d/rc5.dの中のSで始まるスクリプトがそれにあたります。 順序に関して、それらを起動したときに適用されたのと同じ手順が、ここでも適用されます。

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

8.2.2 initスクリプト

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

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

これは、ブートプロセスの実行中、または即座のシステムシャットダウンを行ったとき(電源障害またはユーザがCtrl-Alt-Delを押した場合)にのみ適用されます。 こうしたスクリプトの実行は、/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のオプションも認識します。 これらのオプションについては、表 8.2. 「initスクリプトのオプション」で説明します。 initによって直接実行されるスクリプトには、このようなリンクはありません。 こうしたスクリプトは、必要なときにランレベルとは無関係に実行されます。

表 8.2 initスクリプトのオプション

オプション

説明

start

サービスを起動します。

stop

サービスを停止します。

restart

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

reload

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

force-reload

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

status

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

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

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

boot

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

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

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

boot.local

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

boot.setup

このスクリプトは、シングルユーザモードから他のランレベルへの移行時に実行され、キーボードレイアウトや仮想コンソールの初期化に関する基本的な設定を行います。

halt

このスクリプトは、ランレベル 0 または 6 への移行時のみ実行され、halt または reboot として機能します。 システムがシャットダウンするかリブートするかは、haltの呼び出され方に依存します。

rc

このスクリプトは、現在のランレベルの適切な停止スクリプトと、新しく選択したランレベルの起動スクリプトを呼び出します。

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

[Warning]initスクリプトのエラーはシステムの停止につながる

initスクリプトに問題があると、コンピュータがハングアップします。 このようなスクリプトは最大限の注意を払って編集し、可能であれば、マルチユーザ環境で徹底的にテストします。 initスクリプトについては、8.2.1項 「ランレベル」の情報が役立ちます。

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

最初に記載されているINIT INFOブロックはスクリプトの必須部分で、次のように編集する必要があります。 例 8.1. 「最低限のINIT INFOブロック」を参照してください。

例 8.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:の2行に、 サービス自体が起動または停止する前に、それぞれ起動または停止する必要があるすべてのサービスを指定します。 この情報は後で、ランレベルディレクトリに表示するスクリプト名に対し、番号を生成するために使用します。 Default-Start: およびDefault-Stop:の後に、サービスが自動的に起動または停止する際のランレベルを指定します。 最後に、Description:の下に、対象のサービスについての簡単な説明を記載します。

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

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

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

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

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

図 8.1 システムサービス(ランレベル)

システムサービス(ランレベル)

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

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

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

[Warning]ランレベルの設定を誤るとシステムに害が及ぶことがある

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