【概略一例】
ブートローダは、起動対象デバイスを起動する為の読み込みを行うプログラムであり、代表的なのはBIOSとOSの橋渡しとなるカーネルローダですが、BIOSの機能とは別にブータブルBD/CD/DVD/USB機器などの起動選択もできますし、当然のことながら起動することで意味をなすものであれば、これらに限定することもなく他のブートローダを呼び出すこともでき、ブートローダを呼ぶブートローダを連鎖的な読み込みであることから特にチェーンローダと呼ぶこともあります。
もちろん同じOSのバージョン違い、同じバージョンで異なる起動引数を与える、異なるOSのカーネルを起動する、Windowsのように通常起動、セーフモード、コマンドプロンプトのみ起動といったようにマルチブートできるようにすることもできます。
こうしたブートローダは、MBR/Master Boot RecordやPBR/Partition Boot Recordにセットアップされます。
CPUから呼ばれるBIOSがPOST後、検索して見つかったブートデバイスが、HDDである場合、(パーティションの外側であり)デバイスの第1セクタにあるMBRをロード、メインメモリ上にそれをコピーし、コピーされたMBRが自身の持つパーティションテーブルから各パーティションの第1セクタであるPBRをチェック、例えば、パーティション(及びPBR)が1つの場合、当該OSのカーネルを起動、複数(マルチブート環境で)ある場合で且つ既定のメニューの起動timeout値を敢えて0にしていなければ、複数から選択可能なブートメニューを表示します。
MBRは、BIOSの読み込み保証値の最大値である制約上、実質、先頭から1セクタ=512バイトにあるデータのことであり、その内の先頭446バイトがプログラム、続く64バイトがパーティションテーブル、最後にブートデバイスであることを示す"0xAA55"という2バイトのブートデバイスシグネチャから構成されることになっています。
PBRにもブートデバイスシグニチャの付加が事実上、要求されるものの、BIOSから直接呼ばれるわけではない為、BIOSの512バイトの制約は、受ける必要はないはずですが、「Windowsが広く普及、プリインストールされているのが一般的である」という状況でなければ、特にPBRにセットアップするブートローダ自身をMBRに書くことも当然のごとくあること(PC-UNIXやLinuxでは一般にインストール時にMBRにインストールするか否かを選択可能)である為、何れにも対応する為には実質512バイトの制約の中で納めることになります。
PC/AT互換機では、1つのHDDに設定可能なパーティション数は、最大で基本パーティション3つ、拡張パーティション1つの計4つで、拡張パーティションにより共有データ領域確保、任意の数の論理ドライブやHDD増設などに利用することが可能となっています。
446バイトというと半角英数字446文字分ということであり、日本で言えば400字詰め原稿用紙1枚ちょっとで自身の人生を詳細に記せと言われても生後数日じゃ文章書けないし、書けるようになる年ごろでも「生まれて今に至る」ではさっぱりわからないわけですが、かと言って多くを語るには難しいのと同様、せいぜい4つに限られたPBRの位置を覚えておいてロードするだけで精いっぱいといった領域です。
しかし、うまいことを考えたもので、こうした限られた領域に書かれた小さなプログラムが次へ次へと徐々に大きなプログラムを読み込むことで最終的にカーネルをロードすることができ、少なくともPCにおいてはカーネルを読み込めれば、ファイルシステム及びファイルパスを認識できる為、一通りのことができる状態となり、ログインプロンプトやログイン画面が表示されたり、デスクトップ画面が表示されたりしてユーザーがOSを利用することができる状態になります。
MBRやPBRにセットされるブートローダは、種類によって異なるものの、限られた容量の中でステージ1、ステージ1.5、ステージ2...といった具合に処理を分けてカーネルの起動につなげるのが一般的です。
Linuxでは、ブートローダで選択されたkernel(カーネル)とinitrd(/initial ram disk/イニシャルラムディスク/初期化・起動RAMディスク)が読み込まれ、initrdをルートパーティションとしてマウント、initrdにある必要なモジュールを読み込むためのlinuxrcというスクリプトを実行、そのモジュールをカーネルが読み込むことでディスク及びファイルシステムにアクセス可能となり、その時点でディスクの実際のルートパーティションをマウント、カーネルモジュールが利用可能となったところで各種機器を含めた初期化、initプロセスの起動、デフォルトの/sbin/initがプロセスとして起動する場合、/etc/inittabに書かれた通りにブートスクリプトを起動、/etc/rc.sysinit起動、カーネル起動引数や既定のランレベルに応じたディレクトリ内のSで始まり、2ケタの数字が続くファイルを数値順に実行することでネットワークの設定をし、各種サーバを起動、それが終わると仮想端末、CUIコンソール、モデムといったシリアルデバイス経由の端末(tty)でloginプログラムの起動を行うgetty/mingetty(最小限の機能に絞ったgetty)が複数(6個など/etc/inittabに記述された数だけ)実行され、その数だけ端末が起動するようになっており、[Alt]+[F1]~[F6]で端末を切り替えることが出来るようになっています。
WindowsプリインストールマシンにWindowsを削除してPC-UNIXやLinuxに入れ替えた後でやっぱり元に戻したくなってフォーマットし直してWindowsを再インストールといった場合、または、マルチブート目的でパーティションを設定し、PC-UNIXやLinuxを入れた後でプリインストールWindows以外のOSを削除することになった場合にプリインストールされているWindowsが起動しなくなってしまうという状態に陥る可能性があるので要注意です。
これは、いずれも、MBRを書き換えた場合に起こり得ることであり、事前にMBRをバックアップしておいたり、そもそもインストール時にMBRを書き換えない(PBRにインストールする)方法にしたりすると良いでしょう。
# dd if=/dev/hda of=~/mbr bs=512 count=1
#
バックアップは、PC-UNIXやLinuxならファイルやディレクトリだけでなくファイルシステムごとコピーするddコマンドを使って例えばroot権限で「ブートデバイスがハードディスクで/dev/hdaである場合、先頭の512バイトを1ブロック分、ホームディレクトリのファイルmbrにコピー」などとし、更に当該HDDが起動すらしない状態に備えて別途FDやUSBフラッシュメモリなど外部メディアにもコピーしておくとよいでしょう。
# dd if=~/mbr of=/dev/hda bs=446 count=1
#
バックアップからコピーする場合は、ifの右辺にコピー元、ofの右辺にコピー先を設定することを踏まえ、(パーティション設定する際に既に446バイトめから64バイト分パーティションテーブルが書かれているので?)コピーするbs(ブロックサイズ)値は、先頭のプログラム部分446バイトで良いでしょう。
何れもパスの指定を間違えると危険なので要注意、くれぐれもディスクを間違えたりしないように慎重に実行しましょう。
MS-DOSでは先のddコマンドと同様の機能を持つrawrite.exe、Windows9x/MEではfdisk /mbrによる修復、NTではディスクアドミニストレータ、コマンドプロンプトでは...etc.といったようにWindowsにおけるMBRのコピーや修復についてはOSバージョン(、ファイルシステムの違い、)やイメージファイルか否か、PEを使うか否かなど機能が充実しているのか混乱させているのか斬新で先進的なバージョンアップを繰り返すうちに複雑になってしまったのか。。。というわけで省略。
Windowsプリインストールマシンでは、Cドライブ直下に置かれるautoexec.bat、boot.ini、config.sysや各種起動用ファイルを使って起動しますから、古いPC・マシンにおけるCDブートやUSBブートなどBIOS未対応のデバイスのブートといったことが目的であれば、これら起動ファイルにブートローダをかませれば、MBRを書き換えることなくブートローダのメニューを表示させることもできます。
ブートローダには、LILO/GRUB/GRUB2/GRUB4DOSやSYSLINUX、NTLDRなどの他、SYSLINUXのコンポーネントでCD-ROMなどで使われるISO 9660ファイルシステムからLinuxカーネルをブートする為のISOLINUX、PXE/Preboot Execution Environmentを使用したネットワークブートを行うPXELINUX、ext2やext3、ext4、btrfsといったファイルシステムからのブートに対応するEXTLINUX、MS-DOSなどの古いOSを起動するMEMDISKなどもあります。