LPIC-1 - 101試験 - 101:システムアーキテクチャ - 101.2 システムのブート

Last Update : September 18 2014 21:34:23

     

a. Linuxの起動

コンピュータが起動して使えるようになるまでは、様々なハードウェア・ソフトウェアが段階的に処理していき、オペレーティングシステムが完全に起動して初めて使えるようになります。ここではPC(x86 アキテクチャ)を例にとってその起動シーケンスを見てみます。PCの起動シーケンスは大きく以下のようになります。

  1. 電源投入
     ↓
  2. BIOS
    POST(Power On Self Test)と呼ばれる、ハードウェアのチェックと初期化を実行します。
    次に起動するためのドライブを探します。起動ドライブとなるのは通常FDD、HDD、 CD-ROMなどです。BIOSは起動ドライブを見つけるとそのデバイスをファーストブートドライブとして起動を試みます。
    ブートドライブが決まったら、ブートドライブのディスクの先頭ブロック(MBR:Master Boot Record)に書き込まれた第1ステージ・ブートローダをメモリにロードします。
    MBRにはパーティションテーブルも書き込まれています。
     ↓
  3. 第1ステージ・ブートローダ
    第1ステージ・ブートローダが /boot パーティションから第2ステージ・ブートローダーをメモリにロードします。
     ↓
  4. 第2ステージ・ブートローダ
    Linuxの代表的なブートローダにはLILOとGRUBがあります。
    ・GRUBの場合:直接、設定ファイル/boot/grub/grub.confを読み込みます。
    ・LILOの場合:MBRの情報を使用してブートオプションを決定します。
    カーネルの選択画面を表示し、選択されたカーネルのカーネルバイナリーファイル[/boot/vmlinuz-バージョン]を/bootディレクトリ内から見つけて、ロードします。
    もし存在すれば、initrdイメージ[/boot/initrd-バージョン.img]をメモリにロードしておく。ここでブートローダーの役目は終わり、ブートプロセスの制御をカーネルに渡します。
     ↓
  5. カーネル
    カーネルは自身の初期化シーケンス(メモリの初期化、CPU、記憶装置など各種ハードウェアをpci情報などから設定します。)を実行し、メモリにロードされている小さなファイルシステムinitrdをマウントします。
     ↓
  6. initrd (カーネルプロセス)
    カーネルはinitrdを利用してルートファイルシステムを読み取り専用でマウントします(一般的にはinitrdを使用しますが、使用しない設定もあります)
    /sbin/initプログラムを実行します。
     ↓
  7. init (カーネルプロセス)
    カーネルは自身の初期化の最終段階で1番目のユーザープロセスであるinit(プロセスIDは1)を生成します。起動時のカーネルオプションの指定により、init以外のプロセス(例えば/bin/bash)を生成することもできます。
    /etc/inittabの設定に従って処理を行います。
     ↓
  8. /etc/inittab (initプロセス)
    initは起動すると/etc/inittabを読みます。/etc/inittabにはシステムのランレベルと、initが起動するプログラムが記述されています。
    /etc/rc.d/rc.sysinitスクリプトを実行します。
     ↓
  9. rcスクリプト (initプロセス)
    initは/etc/inittabに指定されている、rcスクリプト(Run Control Script)である/etc/rc.d/rc.sysinit、/etc/rc.d/rcを実行します。
    システムの初期設定を行います。この段階で、殆どのデバイス・ドライバは、モジュールとしてロードされます。
    rc.sysinitスクリプトの中で、ルートファイルシステムを読み書きできる状態で再度マウントし直します。
    rc.sysinitスクリプトから/etc/rc.d/init.d/functionsスクリプトが実行されます。
    ランレベルに合せてサービスを起動します。
    ランレベル5では、/etc/X11/prefdmスクリプトを実行し、Xウィンドウマネージャを起動します。これで一連の起動シーケンスが完了します。

PCの電源を投入すると、マザーボードのフラッシュROMに書き込まれたBIOS(Basic Input/Output System)というソフトウェアが起動します。このBIOSの初期化プログラムが、PCに接続されている各種デバイスの初期化を行います。この過程を POST(Power On Self Test)といいます。POSTの段階で最初に初期化が行われるのはビデオカードです。
このビデオカードの初期化が終わるとよく目にするBIOSの初期化状況を表示する画面になります。

各種デバイスの初期化が終了すると、BIOSは次の段階に入り、起動するためのドライブを探します。起動ドライブとなるのは通常FDD、HDD、 CD-ROMなどです。BIOSは起動ドライブを見つけるとそのデバイスをファーストブートドライブとして起動を試みます。最初にブートドライブとして何のデバイスが認識されるかはBIOSの設定次第ですが、ここではHDDの起動を中心に見ていきます。HDDの接続については、IDEインターフェイスのHDDでは接続の場所によってブートの優先度が自動的に決まります。(優先度の最も高いのはプライマリのマスタです)こういったブートドライブとなりうるデバイスの中の最も優先順位が高いデバイスを、BIOSはブートドライブとして決定することになります。

ブートドライブが決定すると、BIOSはそのブートドライブの先頭セクタのロードという段階に移ります。HDDでは先頭セクタのことを MBR(Master Boot Record)といい、MBRは1台のHDDに1つしか存在しません。BIOSはこのMBRをメモリ上にロードし、MBR領域にあるプログラムに制御を移します。このMBR領域にあるプログラムを、一般的にブートストラップローダと呼びます。

ブートストラップローダ

ブートストラップローダは、実行のなかでパーティションテーブルから起動フラグのあるパーティションを探します。パーティションテーブルとは、複数のパーティションに関する情報が保存されているMBR内の1つの領域です。この起動フラグのあるパーティションにブートストラップローダから制御が移行します。そのとき、ブートストラップローダから呼び出されるのが各基本パーティションにあるブートセクタになります。ブートセクタは各基本パーティションの先頭セクタのことを指し、PBR(Partition Boot Record)とも呼ばれます。

PBRに制御が移行すると、そのPBRのプログラムコードが動作することになります。このPBRにあるプログラムコードが IPL(Initial Program Loader)と呼ばれるもので、OSを起動させるためのブートローダの残りの機能を呼び出す機能を持ちます。

  • ※ブートローダの残りの機能はブートローダの2ndステージとも呼ばれます。

MBRやPBRは512バイトと非常に小さな領域しかもっていません。そのなかの一部であるIPLのデータサイズはさらに小さなものになります。この小さなデータサイズにOSを起動させるためのブートローダのプログラムを全て格納することは困難です。そのためIPLはブートローダの一部のプログラムコードを持ち、ブートローダの残りに機能はPBRの後続セクタに置くかたちになっています。IPLから呼び出されたブートローダが後続のOSのファイルを読み込んでいき、最終的にOSが起動していくことになります。

  • ※LinuxのブートローダをMBR領域に格納した場合は、そのMBR領域のプログラムがパーティションのブートローダを起動する形になっています。

b. Linuxのブートローダ

現状ではLinuxのデフォルトのブートローダにはLILO(LInux LOader)とGRUB(GRand Unified Bootloader)が採用されています。LILO、GRUBなどのブートローダの役目はOSの本体である、カーネルをロードすることにあります。この 2つはブートローダという点においては同じ物ですが、それぞれカーネルのロードまでの工程が異なります。

● LILO(LInux LOader)
LILOは古くからLinuxで利用されてきたブートローダです。特徴としてはカーネルの位置情報をLILO自身内部に情報として持ち、その情報からカーネルをロードするというものです。LILOはファイルシステムを認識しないため、カーネルの位置をHDDの物理的な位置情報で判断しています。この物理的な位置情報をブロックリストといいます。
LILOはこのブロックリストを自身の内部に保持しており、ブロックリストを参照してカーネルをロードします。そのためLILOは「ブロックリスト参照型」のブートローダといわれます。

● GRUB(GRand Unified Bootloader)
GRUBは高性能ブートローダでLILOとは異なる仕組みを持ちます。GRUBの特徴の1つにファイルシステムを認識できることがあげられますが、これはLILOとは異なりカーネルの位置をファイルパスで指定することができることを意味しています。このようなタイプを「ファイルシステム認識型」といいます。

こういったLILOやGRUBの動作を経て、カーネルがロードされることになるわけですが、このカーネルがロードされてからがOS自身の起動シーケンスであり、カーネルの制御下でOSとして機能するための様々な処理が行われます。


1.LILOの設定

LILOをブートローダとして利用する場合は、/etc/lilo.confに起動の設定を記述する必要があります。

● /etc/lilo.conf の記述例
prompt timeout=50   <--- LILO の画面のタイムアウト時間(単位:100ms):この場合は5秒 default=linux <--- デフォルトで起動するOS のラベル:下記のラベルと一致させる必要がある boot=/dev/hda3 <--- LILO をインストールするパーティション map=/boot/map  <--- マップファイルの場所 install=/boot/boot.b <--- ブートローダの種類の指定 message=/boot/message <--- ブート時に表示するメッセージ image=/boot/vmlinuz-2.4.27-0vl7     <--- カーネルイメージ   label=linux              <--- ラベル(自由に指定できる)   initrd=/boot/initrd-2.4.27-0vl7.img <--- ブート時に読み込むファイル   read-only   root=/dev/hda6             <--- ルートとしてマウントするパーティション   append=" resume2=swap:/dev/hda5"   <--- カーネルの起動オプション

LILOはハードディスクの物理セクタしか認識しないため、通常はMBR(マスターブートレコード)にインストールする必要があります。
そのため、lilo.confの設定を変更したらMBRを更新するため、 lilo コマンドを実行する必要があります。

# /sbin/lilo

liloコマンドは、ブートセクタの更新とマップファイルの作成をおこないます。マップファイルには、ブート可能なカーネルの名前とその場所が記述されています。

● lilo コマンド構文
  lilo [オプション]

● lilo コマンドオプション(一部)
 -C 設定ファイル設定ファイルを指定する(デフォルトは/etc/lilo.conf)
 -m ファイル名デフォルトのマップファイルの代わりに指定されたファイルを使用する
 -q現在のマップファイルの内容を表示する
 -R パラメータ次回起動時に適用されるコマンドラインパラメータ
 -r ディレクトリ名操作を行う前に、ディレクトリ名を chroot でルートディレクトリに変更する。 新しいルートディレクトリは /dev ディレクトリを含まなければならず、 /boot ディレクトリが必要な場合もある。 さらに /etc/lilo.conf ファイルが必要な場合もある。
シェルスクリプト mkbootdisk でブート可能なフロッピーを作成するときに使われる。
 -s ファイル名lilo がブートセクターを上書きするとき、以前の内容を保存するのにデフォルトでは /boot/boot.NNNN を使用する。 NNNN が何になるかはデバイスに依存する。 このオプションは、その代わりにブートセクタを保存するファイル名を指定する (または、-u オプションと共に指定し、ブートセクタを復旧するファイル名を 指定する)。
 -T オプションシステム情報を表示する。 そのうちいくつかはシステム BIOS からの情報である。 これは問題のあるシステムを LILO 診断フロッピーで起動するよりも便利である。 オプションは以下のうちひとつである。
・help - 使用可能な診断のリストを表示する。
・ChRul - CHANGE-RULES で指定されているパーティション タイプを表示する。
・EBDA - 拡張 BIOS データエリア情報の一覧を表示する。
・geom=<drive> BIOS ドライブのドライブジオメトリを表示する。
例: geom=0x80
・geom - 全てのドライブのドライブジオメトリの一覧を表示する。
・table=<drive> プライマリパーティションテーブルを表示する。
例: table=/dev/sda
・video - ブートローダが使用可能なグラフィックモードを表示する。
 -tテストのみ実行する。ブートセクターやマップファイルは書換えない。 これを -v と共に指定すると、 lilo が何を行うかを確認できる。
 -u保存されたブートセクタをコピーして LILO をアンインストールする。
 -VLILOのバージョンを表示する
 -v詳細情報を表示する。vを複数書くことで詳細レベルがあがる

LILOがブートローダとして起動すると、LILOプロンプトが表示されます。このプロンプトにカーネルの種類、OSの選択、カーネルパラメータを入力することができます。

●LILOプロンプトでのオプション
 init=ファイル名初期プログラムを指定する
 root=デバイス名ルートファイルシステムを指定する
 singleシングルユーザモードで起動する
 ro読み取り専用でマウントする
 mem=数字m物理メモリを数字MBに指定する
 ランレベル指定したランレベルで起動する(1とsingleは同じ)


2.GRUBの設定

GRUBの設定を参照


c.ブート時のメッセージ

1.サーバー起動時のメッセージを表示する [ dmesg ] [ Ctrl +s,Ctrl + q ]

起動時にコンソール上に表示されるメッセージは、流れるのが早すぎて全てをじっくり見ることは不可能です。これらのメッセージは、サーバーが立ち上がってから、 dmesg コマンドを使用する事で後でじっくり閲覧する事ができるようになります。但し、dmesg で表示されるメッセージは、起動時に表示されたものそっくりそのままではありません。
dmesgコマンドは、カーネルのリングバッファの内容を表示するためのコマンドで、システム起動時のメッセージや稼働中のカーネル情報などを得ることができます。
また、/var/log/dmesg ファイルや /var/log/messages 、 /var/log/boot.log を参照することで、同じような情報を得ることが可能です。

$ dmesg | more

起動時にリアルタイムで確認するには、コンソール上のキーボード操作で確認する事ができます。まず、コンソール上の画面をストップさせるには、Ctrl + s、再開するには、Ctrl + qをタイプします。なお、上にスクロールする際には、Shift + PageUp 、下にスクロールさせるには、Shift + PageDown でできます。



z. 出題範囲概要

●説明 システムのブート手順を説明する。
●主要な知識範囲
ブートローダに一般的なコマンドを与え、ブート時にカーネルにオプションを指定する
BIOSからブート完了までのブート手順について理解していることを示す
ログファイルからブート時のイベントを確認する
●重要なファイル、用語、ユーティリティ
/var/log/messages, dmesg, BIOS, ブートローダ, カーネル, init



  [ 例題 ] 
  1. 101:101.2 問01  dmesgコマンド
  2. 101:101.2 問02  起動中に出力されたエラーメッセージを確認
  3. 101:101.2 問03  OSの起動
  4. 101:101.2 問04  カーネルメッセージ
  5. 101:101.2 問05  カーネルメッセージの確認
  6. 101:101.2 問06  ブート手順


     

www.it-shikaku.jp