プログラムinitは、プロセス番号1のプロセスであり、必要な方法でシステムの初期化を実行します。 init は特別な役割を果たします。initはカーネルによって直接起動され、通常はプロセスを強制終了するシグナル9が使えないようにします。他のすべてのプログラムは、initまたは子プロセスのいずれかによって直接起動されます。
initの中心的な設定は、/etc/inittabファイルで行われています。このファイルはランレベルを定義しています(項28.2.1. 「ランレベル」を参照)。 このファイルはまた、各レベルで利用可能なサービスとデーモンを指定しています。/etc/inittabのエントリに応じて、initが複数のスクリプトを実行します。 わかりやすくするために、initスクリプトと呼ばれるこれらのスクリプトはすべて、ディレクトリ/etc/init.dにあります(項28.2.2. 「initスクリプト」を参照)。
システムを起動し、シャットダウンするプロセス全体は、initによって管理されます。 この点から見ると、カーネルは、他のプログラムからの要求に従って、他のすべてのプロセスとCPU時間やハードウェアアクセスを管理するバックグラウンドプロセスと考えることができます。
Linuxでは、ランレベルはシステムの起動方法および稼動中のシステムで使用可能なサービスを定義します。ブート後、システムは/etc/inittabのinitdefault行での定義に従って起動します。通常のランレベルは3または5です。表 28.1. 「ランレベルの種類」を参照してください。別の方法として、ランレベルをブート時に(たとえばブートプロンプトで)指定することもできます。パラメータは、カーネル自体が直接評価するもの以外、initに渡されます。
表 28.1. ランレベルの種類
ランレベル | 説明 |
|---|---|
0 | システム停止 |
S | シングルユーザモード(ブートプロンプトからUSキーボードマッピングで入力された場合) |
1 | シングルユーザモード |
2 | リモートネットワーク(NFSなど)なしのローカルマルチユーザモード |
3 | ネットワークを使用するフルマルチユーザモード |
4 | 未使用 |
5 | ネットワークとXディスプレイマネージャのKDM、GDM、またはXDMを使用するフルマルチユーザモード |
6 | システム再起動 |
![]() | /usrパーティションがNFSマウントされている場合にはランレベル2は避ける |
|---|---|
システムでNFSを介して | |
システムの稼動中にランレベルを変更するには、initの後に、ランレベルに対応する番号を引数として入力します。これができるのは、システム管理者だけです。 次のリストは、ランレベルに関連した最も重要なコマンドの概要です。
システムはシングルユーザモードに入ります。 このモードは、システムメンテナンスや管理タスクで使用します。
(ネットワークを含む)すべての重要なプログラムとサービスが起動します。グラフィック環境はありませんが、一般ユーザは、システムにログインして作業することができます。
グラフィック環境は有効になります。 これはデスクトップ(GNOMEまたはKDE)、またはウィンドウマネージャのいずれかになります。
システムは停止します。
システムは停止した後、再起動します。
ランレベル5は、すべてのSUSE Linux標準インストールにおけるデフォルトのランレベルです。 ユーザはグラフィックインタフェースでログインするように求められます。デフォルトのランレベルは3で、ランレベルを5に切り替えるには、章 35. X Windowシステムで説明するようにX Window Systemを正しく設定している必要があります。その後、init 5を入力して、システムが意図したとおりに動作するかを確認します。 すべてが意図したとおりに動作した場合は、YaSTを使用してデフォルトのランレベルを5に設定します。
ランレベルを変更するときには、一般に2つの操作が行われます。1つは、現在のランレベルの停止スクリプトが起動し、現在のランレベルに必要なプログラムを終了します。次に、新しいランレベルの起動スクリプトが起動します。ここで、ほとんどの場合、プログラムがいくつか起動します。たとえば、ランレベルを3から5に変更する場合、次の操作が行われます。
管理者(root)がinit 5を入力して、initにランレベルを変更することを伝えます。
initはその設定ファイル(/etc/inittab)を調べ、新しいランレベルをパラメータとして使用して/etc/init.d/rcを起動する必要があるかどうか判断します。
ここでrcは、現在のランレベルの停止スクリプトであって、新しいランレベルの起動スクリプトがないものだけをすべて呼び出します。この例では、元のランレベルが3なので、/etc/init.d/rc3.dの中のKで始まるすべてのスクリプトが対象となります。依存性を考慮する必要がありますが、Kの後の数字によって、一定の起動順序を指定します。
最後に、新しいランレベルの起動スクリプトを起動します。この例では/etc/init.d/rc5.dの中のSで始まるスクリプトがそれにあたります。順序に関して、それらを起動したときに適用されたのと同じ手順が、ここでも適用されます。
現在のランレベルと同じランレベルに変更する場合、initは/etc/inittabの変更部分だけをチェックし、適切な手順を開始します。たとえば、別のインタフェースでgettyを起動します。
/etc/init.d内に、2種類のスクリプトがあります。
すべてのスクリプトは、/etc/init.dにあります。ランレベルを変更するスクリプトも同じディレクトリにありますが、サブディレクトリの1つからのシンボリックリンク(/etc/init.d/rc0.dから/etc/init.d/rc6.dへ)経由で呼び出されます。これは単にわかりやすくして、複数のランレベルで使用されている場合にスクリプトが重複するのを防ぐためです。すべてのスクリプトは、起動スクリプトとしても停止スクリプトとしても実行できるので、これらのスクリプトはパラメータstartとstopを認識する必要があります。また、これらのスクリプトはrestart、reload、force-reload、およびstatusのオプションも認識します。これらのオプションについては、表 28.2. 「initスクリプトのオプション」で説明します。initによって直接実行されるスクリプトには、このようなリンクはありません。こうしたスクリプトは、必要なときにランレベルとは無関係に実行されます。
表 28.2. initスクリプトのオプション
オプション | 説明 |
|---|---|
| サービスを起動します。 |
| サービスを停止します。 |
| サービスが実行中の場合は、停止して再起動します。実行中でない場合は、起動します。 |
| サービスの停止や再起動をせずに、設定を再ロードします。 |
| サービスが設定の再ロードをサポートする場合は、それを実行します。サポートしない場合は、 |
| サービスの現在のステータスを表示します。 |
ランレベル固有のサブディレクトリにあるリンクによって、スクリプトを複数のランレベルに関連付けることができます。パッケージのインストールまたはアンインストール時に、プログラムinsservを使用して(またはこのプログラムを呼び出すスクリプト/usr/lib/lsb/install_initdを使用して)、このようなリンクを追加または削除することができます。 詳細は、insserv(8)のmanページを参照してください。
次に、最初または最後に起動するブートスクリプトおよび停止スクリプトの概略を示すとともに、保守スクリプトについて説明します。
boot
initを直接使用してシステムを起動するときに実行されます。選択したランレベルから独立で、一度だけ実行されます。これによってprocとptsファイルシステムがマウントされ、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の仕様と、init、init.d、およびinsservのmanページを参照してください。 加えて、startprocおよびkillprocのmanページも参照してください。
![]() | initスクリプトのエラーはシステムの停止につながる |
|---|---|
initスクリプトに問題があると、コンピュータがハングアップします。このようなスクリプトは最大限の注意を払って編集し、可能であれば、マルチユーザ環境で徹底的にテストします。initスクリプトについては、項28.2.1. 「ランレベル」の情報が役立ちます。 | |
特定のプログラムまたはサービス用にカスタムのinitスクリプトを作成する場合は、テンプレートとしてファイル/etc/init.d/skeletonを使用します。このファイルのコピーを別名で保存し、関連のプログラムやファイル名、パス、その他の詳細を必要に応じて編集します。また場合によっては、initプロシージャで正しいアクションが実行されるように、独自の改良をスクリプトに加える必要があります。
最初に記載されているINIT INFOブロックはスクリプトの必須部分で、次のように編集する必要があります。例 28.1. 「最低限のINIT INFOブロック」を参照してください。
例 28.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/)のスクリプトを起動、停止するために必要なリンクを作成します。このプログラムはまた、必要な番号をこれらのリンクの名前に取り込むことによって、ランレベルごとに正しい起動、停止の順序を管理します。グラフィックツールを使用してリンクを作成する場合は、項28.2.3. 「YaSTでのシステムサービス(ランレベル)の設定」の説明に従って、YaSTのランレベルエディタを使用します。
/etc/init.d/にすでに存在するスクリプトを既存のランレベルスキーマに統合する場合は、まずinsservを使用するか、YaSTのランレベルエディタで対応するサービスを有効にすることにより、ランレベルディレクトリにリンクを作成します。 変更内容は、次回のブート時に適用され、新しいサービスが自動的に起動します。
作成したリンクは手動で設定しないでください。 INFOブロック内に誤りがある場合は、後で他のサービスに対してinsservを実行すると問題が生じます。
++の順に選択すると、利用可能なすべてのサービスの概要と、各サービスの現在のステータス(有効か無効か)が表示されます。モジュールを[]と[]のどちらで使用するかを決定します。ほとんどの場合、デフォルトの[]で十分です。左の列にはサービスの名前が、中央の列にはその現在のステータスが、右の列には簡単な説明が表示されます。ウィンドウの下部には、選択したサービスについての詳細な説明が表示されます。サービスを有効にするには、表でそれを選択し、[]を選択します。同じ手順で、サービスを無効にできます。
サービスの起動または停止時のランレベルを詳細に制御する場合、またはデフォルトのランレベルを変更する場合は、まず[]を選択します。 上部には、現在のデフォルトのランレベル、つまり「initdefault」 (システムのブート時にデフォルトで入るランレベル)が表示されます。 通常、SUSE Linuxシステムのデフォルトのランレベルは5 (ネットワークありフルマルチユーザモードおよびX)です。適切な代替の設定は、ランレベル3 (ネットワークありフルマルチユーザモード)です。
YaSTのダイアログボックスでは、ランレベルのいずれか1つを新しいデフォルトとして選択できます(表 28.1. 「ランレベルの種類」を参照)。また、このウィンドウのテーブルを使用して、個々のサービスやデーモンを有効、無効にできます。テーブルには、利用可能なサービスとデーモンが一覧表示され、現在システム上で有効かどうかと、有効な場合はそのランレベルが表示されます。マウスで行を選択し、ランレベルを表すチェックボックス([]、[]、[]、[]、[]、[]、[]、[])をクリックして、選択しているサービスまたはデーモンが実行されるランレベルを定義します。ランレベル4は、カスタムランレベルを作成できるように、初期設定は未定義です。最後に現在選択しているサービスまたはデーモンの簡単な説明が、テーブルの概要の下に表示されます。
[]をクリックして、サービスを有効化するかどうかを決定します。現在の状態が自動的に確認されなかった場合は、[]を使用して確認することができます。[]をクリックすると、変更をシステムに適用するか、ランレベルエディタの起動前に存在していた設定を復元するかを選択できます。[]を選択すると、設定の変更がディスクに保存されます。
![]() | ランレベルの設定を誤るとシステムに害が及ぶことがある |
|---|---|
ランレベルの設定が誤っていると、システムが使用できなくなることがあります。変更を実際に適用する前に、どういう結果が出るかをよく確認してください。 | |