コンピュータを起動する際、コンソール画面にスクロールされる多くのメッセージには、実行されている多くの自動初期化と自動設定に関する情報が表示されます。この段階の挙動を少し変えたいと思うことがあるかもしれません。これは起動処理をよく理解する必要があることを意味しています。これがこの節の目的です。
最初に BIOS がコンピュータを制御し、ディスクを検出し、Master Boot Record を読み込み、ブートローダを実行します。以降、ブートローダが引き継ぎ、ディスクからカーネルを見つけ、カーネルを読み込んで実行します。そして、カーネルが初期化され、root ファイルシステムを含むパーティションの検索とマウントを開始し、最後に最初のプログラム - init
- を実行します。実際には、「root パーティション」と init
は RAM の中にだけ存在する仮想ファイルシステム (そのためこの名前は「initramfs」、以前は「初期化 RAM ディスク」という意味で「initrd」と呼ばれていました) 上に置かれていることが多いです。このファイルシステムは、多くの場合ハードドライブのファイルかネットワークから、ブートローダによってメモリに読み込まれます。このファイルシステムには、カーネルが「真の」root ファイルシステムを読み込むために必要な最低限の要素が含まれています: ハードドライブやそれなしではシステムが起動できないその他のデバイスのドライバモジュール、より頻繁にあるのが、RAID アレイを組み立て、暗号化パーティションを開き、LVM ボリュームを有効化するなどの初期化スクリプトとモジュールです。一度 root パーティションがマウントされたら、initramfs は制御を真の init に渡し、マシンは標準的な起動プロセスに戻ります。
「真の init」は現在 sysv-rc (「System V」) によって提供されています。この節ではこの init システムに付いて説明します。
init は、
/etc/inittab
ファイルの指示に従って、複数のプロセスを起動します。実行される最初のプログラム (
sysinit 段階に相当します) は
/etc/init.d/rcS
で、これは
/etc/rcS.d/
ディレクトリに含まれるすべてのプログラムを起動するスクリプトです。
これらのスクリプトは特に以下の点を担当します:
この段階の後、init
が引き継ぎ、デフォルトランレベル (通常ランレベル 2) で有効化されたプログラムを起動します。init
は /etc/init.d/rc 2
を実行します。これは /etc/rc2.d/
置かれて、「S」で始まる名前の全てのサービスを開始するスクリプトです。「S」の後に続く 2 桁の数字は、歴史的言って、起動するサービスの順番を定義するために使われていました。しかし今やデフォルトの起動システムは insserv
を使って、スクリプト同士の依存関係に従った起動順を自動的に決定します。このため、各起動スクリプトはサービスを起動または終了させる時に満足しなければいけない条件を宣言します (例えば、あるサービスは他のサービスの前または後に起動しなければいけないなど); そして、init
は条件を満足するようにサービスを起動します。このため、スクリプトの静的な番号付けはもはや考慮されません (しかしスクリプトの名前は必ず「S」で始まり、その後ろに 2 桁の番号を付け、依存関係に使われる実際のスクリプトの名前を続けなければいけません)。一般に、基本システム (ログ記録を担当する rsyslog
やポート割り当てを担当する portmap
) が最初に起動され、その後に標準的なサービスとグラフィカルインターフェイス (gdm
) が起動されます。
この依存関係に基づく起動システムのお陰で、自動的な起動順の再定義が可能になります。これは手作業でやるにはちょっと退屈な作業で、人的ミスの危険性があります。なぜなら、起動順は宣言された依存関係に従って定義されるからです。別の利益として、他のサービスに依存しないサービスは並列して開始できるという点があります。この事により、起動プロセスを加速する事ができます。
init
は幾つかのランレベルを区別します。そうすることで、telinit new-level
コマンドを使ってあるランレベルから別のランレベルに切り替える事ができます。即座に init
は新しいランレベルで /etc/init.d/rc
を再実行します。このスクリプトは欠けているサービスを開始し、もはや不要なサービスを停止します。これを行うために、init
は /etc/rcX.d
の内容を参照します (ここで X は新しいランレベルです)。(「Start」の)「S」で始まるスクリプトは開始されるサービスです; (「Kill」の)「K」で始まるスクリプトは停止されるサービスです。このスクリプトは前のランレベルですでに起動されているサービスは開始しません。
デフォルトで、Debian は 4 つのランレベルを使います:
レベル 0 はコンピュータの電源を切る祭に一時的に使われるだけです。このため「K」スクリプトしか含まれません。
シングルユーザモードとしても知られるレベル 1 はシステムの機能抑制モードに相当します; このモードでは基本的なサービスだけが提供され、一般ユーザにマシンを使わせないメンテナンス作業を対象としています。
レベル 2 は通常動作用のモードで、ネットワークサービス、グラフィカルインターフェイス、ユーザログイン等の機能を使うことが出来ます。
レベル 6 はレベル 0 と似ていますが、再起動前のシャットダウン段階中に使われる点が異なります。
他のレベル、特に 3 から 5 まで、も存在します。デフォルトでこれらのランレベルはレベル 2 と同じ様に動作しますが、管理者はこれを変えて (ランレベルに対応する /etc/rcX.d
ディレクトリにスクリプトを追加したりおよび削除したりすることで) 特定の要求に順応させる事が可能です。
様々な /etc/rcX.d
ディレクトリに含まれる全てのスクリプトは /etc/init.d/
に格納されたスクリプトの実体を指すシンボリックリンク - パッケージのインストール時に update-rc.d
プログラムによって作られます - に過ぎません。管理者は、調整したパラメータを与えて update-rc.d
を再実行して、各ランレベルで利用可能なサービスを微調整する事が可能です。update-rc.d
の構文は update-rc.d(1) マニュアルページに詳しく説明されています。サービスを無効化する目的で、(remove
パラメータを付けて) 全てのシンボリックリンクを削除するのは悪い方法であるという点に注意してください。その代わりに、単純に希望するランレベルでそのサービスを起動しないよう設定するべきです (一方で、万が一、前のランレベルでそのサービスが実行されている場合に備えて、そのランレベルでもサービスを停止するために必要なシンボリックリンクを確保しておくべきです)。update-rc.d
は複雑なインターフェイスを持っているため、(rcconf パッケージの提供する) rcconf
を使いたいと思うかもしれません。rcconf
はよりユーザにとって使い勝手の良いインターフェイスを提供します。
最後に、init
は様々な仮想コンソール (getty
) 用の制御プログラムを開始します。この制御プログラムがプロンプトを表示し、ユーザ名の入力を待ち、セッションを開始するために login user
を実行します。