一般的なLinuxシステムでは、BIOS、ブートローダ、カーネル、initの順にブートプロセスが進行します。
・BIOS(Basic I/O System)
最もハードウェアに近い部分を司るシステムで、物理的なハードウェア(マザーボード)上に書き込まれています。
コンピュータの電源を入れると、まずBIOSが起動し、記憶装置(HDD)等に関して最低限の認識をして起動デバイスの優先順位を決定します。その後、優先順位に従って各デバイスの先頭セクタにあるMBR(ブート用の特殊領域。ブートローダが格納されている)を読み込み、得られたブートローダに制御を移します。ブートローダが得られない場合は次のデバイスのMBRを読み込みます。
起動デバイスの優先順位は、BIOSセットアップ画面で任意の順序に設定変更できます。BIOSセットアップ画面はコンピュータの起動時に特定のキー(DEL、F2など)を押すことで呼び出せます。
最近のシステムではUEFI(Unified Extensible Firmware Interface)への移行が進んでいます。
・ブートローダ
LinuxシステムではGRUBが該当します。
MBRに格納されている第一段階部分と、記憶装置内の別の場所に格納されている第二段階部分があります。
このように分かれている理由は、MBRには厳しいサイズ制限があるためです。
ブートローダは記憶装置内のカーネルをロードし、カーネルに制御を移す役割を果たします。
第一段階のブートローダはMBRの先頭446バイトの領域にインストールされます。
・カーネル
カーネルは起動されると、高度にハードウェアを認識・制御し、ルートファイルシステムのマウントなど様々な初期化処理を行います。
ブートローダはカーネルと初期RAMディスク(initramfs)の内容をメモリ上に展開し、カーネルはメモリ上に展開された初期RAMディスク内の、ファイルシステムへアクセスするために必要なドライバやスクリプトを使用してルートファイルシステムをマウントします。その後、initという特別な最初のプロセスをルートファイルシステムから起動します。
カーネルイメージと、カーネルのバージョンに対応する初期RAMディスクは「/boot」ディレクトリに格納されます。初期RAMディスクは展開してイメージ内のディレクトリ、ファイルを参照することができます。
・init
最初に起動されるプロセスで、PID(プロセス ID)は必ず1です。「SysVinit」と呼ばれる従来のinitプログラムを採用しているシステムでは、「/sbin/init」が起動されます。
initプロセスは設定ファイル「/etc/inittab」の記述に基づいて、自動起動するべきプロセスを立ちあげるなど、アプリケーションレベルの初期化を行います。
以降、initプロセスは全てのプロセスの先祖(直接・間接的な呼び出し元)として存在し続けます。
なお、最近のシステムではinitプログラムとして、初期化処理を高速化したUpstartやsystemdを採用している場合があります。その場合は基本的に「/etc/inittab」ファイルは使用されません。
「/etc/inittab」を設定ファイルとして使用する従来のinitプログラムは「SysVinit」と呼ばれるものです。
Upstartやsystemdは、従来のSysVinitと比べてシステム起動時の初期化作業が高速化されています。
Upstartは「/etc/event.d/rc-default」ファイルの「telinit 2」の部分を編集することでデフォルトのランレベルを設定できます。
ただし、UpstartはSysVinitと互換性があるため、「/etc/inittab」ファイルを新規に作成し、先述のSysVinitの場合と同じように記述することでデフォルトのランレベルを設定することもできます。その場合、「/etc/inittab」ファイルのランレベルが優先されます。
systemdでは、「/lib/systemd/system/runlevel[0-6].target」ファイル([0-6]部分はランレベルを指定)のシンボリックリンクを「/etc/systemd/system/default.target」として作成することでデフォルトのランレベルを設定できます。