この記事について
システムの起動の流れと詳細についてのまとめです。
一般的なLinuxシステムのブートプロセス
①電源入れる
②BIOS起動
③ブートローダ起動
④カーネル起動
⑤init起動
BIOS(Basic I/O System)
最もハードウェアに近い部分のシステム。
物理的なハードウェア(マザーボード)上に書き込まれている。
コンピュータの電源を入れると一番最初に起動するのがBIOS。
BIOSが起動すると、、、
・記憶装置(HDD)などに関して最低限の認識を行う
・起動デバイスの優先順位を決定する
・優先順位に従って各デバイスの先頭セクタにあるMBR(ブートローダが格納されている、ブート用の特殊領域)を読み込み、得られたブートローダに制御を移す。ブートローダが得られない場合は次のデバイスのMBRを読み込む。
起動デバイスの優先順位は、BIOSセットアップ画面で任意の順序に設定変更できる。
※BIOSセットアップ画面はコンピュータの起動時に「DEL」か「F2」などを押すことで呼び出せる。
ちなみに最近のシステムではUEFI(Unified Extetnsible Firmware Interface)への移行が進んでいる。
ブートローダ
Linuxシステムでは「GRUB」が該当する。
MBRに格納されている第一段階部分と、記憶装置内の別の場所に格納されている第二段階部分がある。
MBRには厳しいサイズ制限があるので、このように分かれている。
ブートローダはカーネルと初期RAMディスク(initramfs)の内容をメモリ上に展開し、記憶装置内のカーネルをロードし、カーネルに制御を移す。
第一段階のブートローダはMBRの先頭446バイトの領域にインストールされる。
カーネル
高度にハードウェアを認識・制御し、ルートファイルシステムのマウントなど様々な初期化処理を行う。
カーネルは、ブートローダがメモリ上に展開した初期RAMディスク内のファイルシステムへアクセスするために必要なドライバやスクリプトを利用してルートファイルシステムをマウントする。
カーネルイメージとカーネルのバージョンに対応する初期RAMディスクは「/boot」ディレクトリに格納される。
初期RAMディスクは展開してイメージないのディレクトリ、ファイルを参照することができる。
init
ルートファイルシステムから「init」という特別な最初のプロセスを起動する。
PIDは必ず「1」。
SysVinitと呼ばれる従来のinitプログラムを採用しているシステムでは、「/sbin/init」が起動される。
initプロセスは設定ファイルの「/etc/inittab」の記述に基づいて、自動起動すべきプロセスを立ち上げたり、アプリケーションレベルの初期化を行う。
最近のシステムではinitプログラムとして、初期化処理を高速化した「Upstart」や「systemd」を採用している場合がある。
その場合は「/etc/inittab」ファイルは使用されない。
最後に
なかなか覚えられなかったのですが、自分でまとめることでだいぶ理解が進みますね。
わからないと思うことほど、じっくり時間をかけて理解してこうと思います。