Linuxのブートプロセス

一般的な Linux システムでは、BIOS、ブートローダ、カーネル、init の順にブートプロセスが進行します。それぞれの役割と、各段階の内容を簡単に示しておきます。


・BIOS

最もハードウェアに近い部分プログラムであり、コンピュータの電源を入れると、まずこのBIOS が起動する。

  • BIOSはマザーボードのROM上に書き込まれているファームウェア。
  • 仕様上、BIOSはメモリを1MBしか使用できないので、サーバ搭載のデバイス(PCIeやらCPUやらMemoryの動作モードとか)設定は別画面を呼び出す必要がある。
BIOSは下記の順に処理を行っていく。
  1. POST(PowerOnSelfTest)を行う。
  2. MBRを検索する。(BIOS設定の起動デバイスの優先順に応じて検索する順番は変わる。Disk , USB , DVD-ROMとか)
  3. BIOSは各デバイスの第0セクタ(先頭512byte)の末尾2byte(Signeture , 下記表参照)を見て、MBRであるか確認する。
  4. MBR(ディスクの先頭セクタ) に収められているのBootstrap Manager(多くはGRUB)を読み込む。
■MBRの中身
サイズ セクタ内 格納物 内容
 446byte  0 – 445  GRUB Stage1  GRUBの第一ステージ
16byte  446 ~ 461 Partition table 1
ブートフラグ:ブート可能かが記録されてる
開始位置:CHS方式での開始位置
パーティションID:OS,ファイルシステムを表す。83ならlinux
終了位置:CHS方式での終了位置
開始位置:LBA方式での開始位置
セクタ数:LBA方式での総セクタ数
16byte 462 ~ 477 Partition table 2 同上
16byte 478 ~ 493 Partition table 3 同上
16byte 494 ~ 509 Partition table 4 同上
509 ~ 511 Signeture お約束で0xAA55が書き込まれる。ここが違うとパーティションテーブル,MBRが壊れているということになる。

ブートローダ(ブートマネージャ)

いくつか種類が存在するが、LinuxではGRUBが主流。LILOも有名だがややGRUBのほうが優勢らしい。他にもGAGとかブートローダは色々存在する。CentOS6ではGRUBが採用されている。(RHEL7ではGRUB2)
GRUBはMBR に格納されている第一ステージと、別の場所に格納されている第二ステージがある。わざわざ別れている理由は、BIOSがアクセスできるデータ量が非常に少ないこと、MBR のサイズ制限に起因する。
  • まずBIOSによってロードされたGRUB stage1はGRUB stgae1.5(GRUBのメインプログラム)をロードする。(GRUB 1.5はMBRの次のセクタに書き込まれている。)
  • GRUB stage1.5はファイル・システムの解釈を行う。
  • GRUB stage 1.5が完了するとstage 2を読み込む。(ファイルシステムの認識ができるようになるので、以下のようにファイルとして設置されている。)
  • GRUB stage2は/boot/grub/grub.confを探して見つかると、OS一覧を画面に表示させる。背景画像とかを変えるときはここを編集しておけばよい。選択されると該当するKernelとinitramfsをメモリに展開する。

  • どのkernelを使用するか、どんな値をkernelに渡すか(ルートファイルシステムの場所とか)、initramfsは何を使うのかはgurb.confをみればわかる。kernelはvmlinuz-**で、initramfsはinitramfs-**が実体。

  • ルートファイルシステムをマウントするためには多くのデバイスドライバやモジュールが必要になるが、それを最初からカーネルに組み込むとカーネルサイズが大きくなってしまう。(なので、基本はローダブルモジュールとしてカーネル本体とは切り離されていて、必要に応じてロードする)しかし、ルートファイルシステム内にローダブルモジュールを配置すると、そもそもルートファイルシステムをマウントできない状態になってしまう。ややこしいが、
    • ルートファイルシステムをマウントしないといけない。
    • カーネルがルートファイルシステムマウントするには、モジュールをロードしないといけない。(scsi,RAIDを扱うためのモジュールを使えないといけない)
    • カーネルサイズは小さくしたい。なのでモジュールやデバイスドライバをできるだけ組み込みたくない。
    • マウントに必要なモジュールはマウントしようとしているマウントする前のデバイス内にある。
    これらを解消するために、Kernelはルートファイルシステムをマウントするために必要な最低限のモジュールをinitramfs(initrd)を予め組み込んだミニルートファイルシステム的なものをメモリ上に展開する。

・カーネル

Kernelがメモリ上で展開されると、ルートパーティションのマウント、組み込まれているハードウェアの検出、メモリの初期化、システムクロックの設定、IRQの設定など様々な初期化処理を行います。その後、init という特別な最初のプロセスを起動します。(/sbin/initにあるプログラム)なお、カーネル起動中にでる様々なメッセージは起動後にdmesgコマンドで確認することができます。(バッファにまだ残っている場合)

 

・init(Upstart)

最初に起動される特別なプロセスであり、PIDは必ず 1 です。

[root@example ~]# ps aux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root         1  0.0  0.0  19348  1568 ?        Ss   15:24   0:07 /sbin/init

設定ファイル /etc/inittab の記述に基づいて、自動起動するべきプロセスを立ちあげるなど、アプリケーションレベルの初期化を行います。最近のシステムではinitプログラムとして、初期化処理を高速化したUpstartやsystemdを採用している場合があります。その場合は基本的に「/etc/inittab」ファイルは使用されません。ちなみにCentOS6ではUpstartが採用されているようです。

[root@example ~]# cat /etc/inittab

# inittab is only used by upstart for the default runlevel.

#

# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# System initialization is started by /etc/init/rcS.conf

#

# Individual runlevels are started by /etc/init/rc.conf

#

# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf

#

# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,

# with configuration in /etc/sysconfig/init.

#

# For information on how to write upstart event handlers, or how

# upstart works, see init(5), init(8), and initctl(8).

#

# Default runlevel. The runlevels used are:

#   0 – halt (Do NOT set initdefault to this)

#   1 – Single user mode

#   2 – Multiuser, without NFS (The same as 3, if you do not have networking)

#   3 – Full multiuser mode

#   4 – unused

#   5 – X11

#   6 – reboot (Do NOT set initdefault to this)

#

id:3:initdefault:

 

Upstartについてはまた次回…

 

 

Bookmark this on Google Bookmarks
LINEで送る
Pocket