GNU GRUB

歴史

GRUBは当初、エーリヒ・シュテファン・ブーリン(Erich Stefan Boleyn)により開発されており、これはFSFが開発していたGNU Hurdオペレーティングシステムを起動させるための作業の一環であった。1999年、主要貢献者であったゴルドン・マッツィヒカイト（Gordon Matzigkeit）と奥地秀則(Yoshinori K. Okuji)の働きかけによって、GRUBは公式GNUプロジェクトの公開プロジェクトとなり最新のソースコードをホストするanonymous CVSが提供されることとなった。

特徴

GRUBは動的に設定でき、コンピュータのブートタイム中に異なるカーネルや初期RAMディスク(initrd)を選択するといった柔軟な設定変更が可能である。そのような目的を実現するために、GRUBはシンプルかつBashライクなコマンドラインインタフェースを提供しており、ユーザーは通常のブートメニューリストにその場で新たなブートシーケンスを追加することもできる。
GRUBは（起動処理の初期のコードがアセンブリ言語を利用しているのを除き、）移植性が極めて高く、複数の実行可能フォーマットをサポートしており、ディスクのジオメトリ変換に依存していない。GRUBはLogical Block Address(LBA)モードのサポートに加え、ほぼ全ての主要なUNIXファイルシステム、並びにVFAT及びNTFSなどMicrosoft Windowsで使用するファイルシステムもサポートしている。GRUBを利用することで、サポートしている任意のファイルシステム上に存在するファイルの中身をユーザーは見ることができる。
GRUBは様々なユーザーインタフェースを用いて設定することができる。多くのLinuxディストリビューションではGRUBのブートメニューに表示される背景画像のカスタマイズなどを行うグラフィカルな設定ツールを用意している。またGRUBのテキストインタフェースを利用すると、リモート・ターミナルからシリアルポート経由で接続できる。
GRUBはネットワーク経由でのOSイメージのダウンロードも可能で、従ってディスクレスシステムもサポートしている。GRUBはローカルから起動するだけではなく、起動前の自動的なOSイメージの伸長もできる。
GRUBはスクロール可能なOSブート選択画面を表示する。GRUBは設定ファイル"menu.lst"（または"grub.cfg"など）にエントリーを追加することで150またはそれを超えるブート選択を容易に行うことが可能であり、矢印キーでブートするOSを選択する。
GRUBはマルチブートに対応しているが、チェーンロードを利用しマルチブート非対応のOSをもサポートしている。ブートOSの追加と同じく、2、3行のコマンドシーケンスを設定ファイルに書き込む、またはGRUBシェルでその場で適切なコマンドを実行することで、MS-DOS、Windows、Linux、BSD、または、Solarisオペレーティングシステムをいとも簡単に起動させることができる。これらUnix系OSやDOS、Windowsなどを起動するためのチェーンローダがGRUBに組み込まれている。
前述の通り、通常のブートメニューに加え、Bashライクなターミナルコマンドプロンプトが利用でき、ブートプロセスの一部または全部をチェックしたり変更することが可能な豊富なコマンドセットを持っている。これらの手法を活用することで、コンピュータにインストールされているOSの特別な知識が事前になくとも、インストールされているOSを起動する目的でフロッピーディスク、USB、またはCD-ROMデバイスからGRUBを利用し起動することもできる。
GRUBは一般的なUnix系OS上においてインストール可能であり、また特定の実装を用いてDOSやWindowsからのインストールも可能である。

ブートプロセス

コンピュータの電源を入れると、BIOSは設定されたプライマリブートデバイス（大抵はコンピュータのハードディスクである）を探し出し、ディスクの先頭512バイトに位置するマスターブートレコード(MBR)から初期ブートストラッププログラムをロードする。この後制御はこのコードに移る。

GRUB バージョン1 (GRUB Legacy)

GRUBをインストールしたコンピュータならば、通常GRUBの初期ブートプログラムであるStage 1ローダがMBRにインストールされている。しかし、チェーンロード可能な別のブートローダ（例: MBM）がMBRにインストールされていても構わない。後者の場合は、パーティションのボリュームブートレコード（Volume boot record, VBR、またはパーティションブートレコード、 Partition boot record, PBRとも呼ばれる）のような別のブートセクタにGRUBのStage 1ローダをインストールし、このStage 1ローダをMBR上のブートローダからチェーンブートすればよい。ブートセクタのサイズは限られており、更にStage 1ローダが使用するBIOS割り込みルーチンの制限から、このタイミングでは、ディスクの先頭1024シリンダー以内の固定領域から2、3のディスクセクタを読み込み、GRUBの次のStageローダをロードする程度のことしかできない。
Stage 1ローダは直接Stage 2ローダを読み込めるが、通常はその間に入るStage 1.5ローダを読み込むためセットアップを行う。GRUBのStage 1.5はハードディスクのMBRの直後から最初のパーティション手前までにある先頭30KB以内に位置するローダであり、何らかの理由でこの領域が利用できない場合（例えば、異常なパーティションテーブルが原因でセクタアドレスが読み取れなかったり、特殊なディスクドライバを必要とするケース、またはGPTもしくはLVMなどを利用するシステムの場合など）は、Stage 1.5ローダのインストールに失敗する。Stage 1.5ローダのイメージはファイルシステム固有のドライバを含んでおり、これを用いてStage 1.5ローダはStage 2ローダをファイルシステム上の任意の場所（例えばファイルパスが/boot/grubのディレクトリ）から発見できるようになり、これを直接ロードできる。この後、Stage 2はデフォルトの設定ファイル、及び必要とされるその他任意のモジュールを読み込む。

GRUB バージョン2

構造及び処理のフローはGRUB バージョン1に酷似している。GRUB バージョン1のStage 1ローダに似たboot.imgと呼ばれるコードがMBRまたはPBR(VBR)に保存される。しかしながら、このboot.imgはデフォルトでLBA48アドレッシングを利用しセクタを読み込むことができる。このコードはdiskboot.imgから生成されるcore.imgの最初のセクタをロードし、更に生成されたcore.imgファイルの残りをロードするのに使用される。core.imgファイルは通常GRUB バージョン1のStage 1.5ローダと同じ領域に保存されるためそれと同様の問題をはらんでいる。しかし、Stage 1.5ローダを移動したり、そのインストールに失敗した場合に比べ、GRUB バージョン2のcore.imgを別のファイルシステムに移動したり、まだファイルシステムを作成していない「空のパーティション」（bare partition）へ移動させた場合に生じる問題は少なくなっている。このcore.imgというのは簡単に言うと、GRUB LegacyのStage 2ローダからローディングに必要な主要コードのみを取り出したものであり、GRUBの動作のためMBRやVBRに必須ではあるが、Stage 2ローダよりはるかに小さい。格納サイズが制約されているMBRやVBRへインストールできないというサイズの問題はこれにて解決され、GRUB Legacyで発生する可能性のあった、Stage 2がGRUBから利用不可能になり動作しなくなるという問題の部分的な解決策になっている。
core.imgファイルを一旦ロードすると、デフォルトの設定ファイル及び必要とされるその他任意のモジュールもロードされる。

GRUBのインストール

GRUBの鍵となる特徴は、それがOSと結びつくことなくインストールされることにあるが、初めてのインストールにおいては、Linuxのイメージのコピーが少なくとも1つ必要となる。ただ当該Linuxシステムが1つ存在すれば、ローダをインストールする後述のコマンドを実行し別のパーティションのVBRにインストールできる。または光学ディスクにもGRUBをインストールできるので、以後この光学ディスクを用いれば、Linuxのインストールに関係なくシステムに存在するOSをGRUBから起動できる。もっとも、移植版のGRUBも存在するため、ローダをインストールするコマンドを実行できる環境ならば、別にLinuxでなくともよい。
GRUBはスタンドアローンシステムとして動作することにより、前述の通りチェーンロードを利用し、インストールされた主要なOSすべてを正しくかつ有効にブートできる実質的なミニシステムとなる。
LILOのようなブートローダとは異なり、設定ファイルの変更の度にGRUBをMBRまたはパーティションに再インストールする必要などない。
Linuxにおいては、"grub-install"というシェルコマンドが、Stage 1ローダをMBRまたはパーティションのいずれか一方にインストールするため利用される。GRUBの設定ファイル、（通常は）Stage 2ローダそしてその他のファイルは有効なパーティション上に存在しなければならない。もしこれらのファイルやパーティションが利用できなくなった場合、Stage 1は即座にGRUBシェルコマンドラインインタフェースに落ちてしまう。
GRUBの設定ファイルの名前やディスク上の位置は各システム様々である。例えば、openSUSEとGRUB Legacyを使用するDebian GNU/Linuxでは設定ファイルは/boot/grub/menu.lstに存在する。またFedora、Gentoo Linuxでは、/boot/grub/grub.confに存在する。GRUB 2をインストールしたDebian、Ubuntuでは/boot/grub/grub.cfgである。Fedoraではまた、FHS準拠の為/etc/grub.confから/boot/grub/grub.confへのシンボリックリンクが張られている。また同様の理由で、Debian、Ubuntuではデフォルトの設定ファイルが/etc/default/grubに存在し、ユーザーは通常巨大なgrub.cfgファイルよりも種々の設定値を設定しやすいユーザーフレンドリーなこのファイルを書き換える。書き換えが完了し、update-grubというgrub-installのラッパースクリプトを実行する（または適切なカーネルのインストールに使用されるパッケージから同コマンドが呼び出される）ことで、適切なカーネルとinitrdを指定した/boot/grub/grub.cfgが生成される。
GRUBは何らかの理由でハードディスクがない、またはハードディスクからのブートができなくなったシステムを起動するため、BIOSアクセス可能かつEl Torito(en)対応の光学ドライブ、フロッピーディスクまたはUSB フラッシュドライブのようなリムーバブルメディアへのインストールも可能である。

開発

もっとも広く使用されているGRUBのバージョンはGRUB Legacyと呼ばれる。このバージョンは現在、バグ修正のみを受け付け、新しい機能は追加されないことになっている。GRUB開発者は新しいバージョンのGRUB 2に開発を集中している。このバージョンは、GNU GRUBの既存のコードを整頓し、より強固なものに変え、かつ移植性、機能性を向上させることを含む目標を掲げて全面的な書き変えを行ったものである。GRUB 2の開発は当初PUPAと言う名前のもと始まった。PUPAプロジェクトは日本の独立行政法人情報処理推進機構の援助を受けており、「平成14年度 未踏ソフトウェア創造事業」に「次世代GRUBブートローダの基本設計と実装」という案件として採択された。PUPAはGRUB バージョン0.9xがGRUB Legacyとリネームされた2002年頃、GRUB 2の開発に統合された。
プロジェクトの目標はいくつかあったが一例を挙げると、PowerPCなど非x86プラットフォーム、ソフトウェアの国際化と地域化、非ASCII文字 、動的なモジュールローディング、メモリ管理、簡易なスクリプト言語、x86プラットフォーム依存コードの特定のモジュールへの移動及び隔離、オブジェクト指向フレームワーク等の各種サポートが含まれている。Ubuntuはそのバージョン9.10からデフォルトのブートローダとして採用しており、Fedora 14、Debian 6.0 (コードネーム: squeeze)など他のディストリビューションでのサポートも開始されている。

派生

公式には開発は完了しているが、GRUB Legacyがエンドユーザーの間にて未だ広く使用されているが故に、いくつかの非公式なプロジェクトがGRUB Legacyのコードを彼ら自身で改善するため、フォークしている。例えば、"setgrubdevice"や"usbshift"などの新しいコマンドを含むSuper Grub DiskやGRUB4DOSなどがある。特にGRUB4DOSはDOS/LINUXからの起動、Windowsブートマネージャ、SYSLINUX、またはLILO経由での起動、並びにMBR/CDからの起動をサポートするユニバーサルブートローダである。またBIOSディスクエミュレーションやATAPI CDROMドライバも組み込まれている。いくつか改良されているコマンドもあり、"find --set-root", "map --hook", そして"cdrom"がそれに当たる。
OpenSolarisではGRUB Legacyにディスクラベルや自動的な64ビットカーネル選択、そして（データ圧縮やマルチブート環境での動作も含む）ZFSからのブートをサポートするための各種改良が加えられている。Syllable OSプロジェクトではAtheOS File Systemからのシステム起動をサポートするため改変版のGRUBを作成している。

GRUBを設定するためのツール

GRUB自身のセットアップのためのモジュールに加え、しばしばいくつかのディストリビューションでは追加のセットアップツールが使用される。例えば、SUSE/openSUSEディストリビューションにおけるYaST2、Fedora/RHELディストリビューションのAnacondaインストーラがそれに該当する。UbuntuなどDebianベースのディストリビューションで使われるStartUp-ManagerはGRUBのグラフィカルな設定エディタである。その他、GRUB 2用のKDE Control Moduleがいくつか存在する。GRLDR ICEというGRUB4DOS向けにgrldrファイルのデフォルト設定を変更するための小さいツールもある。

ユーティリティ

GRUB UtilitiesはGRUB Legacy、GRUB 2及びGRUB4DOS用のマルチプラットフォームユーティリティのコレクションである。