GNU GRUB

GNU GRUB  はGNUプロジェクトにて開発されている高機能なブートローダである。 大きく分けてバージョン0.9x系のGRUB Legacyと、1.9x系のGRUB 2の2種類がある。

GRUBはMultiboot Specificationのリファレンス実装でもある。Multiboot Specificationとは、コンピュータにインストールされた複数のオペレーティングシステムを個別に起動する際にOSの選択肢をユーザーに提示したり、または、あるOSのパーティション上に存在する特定のカーネルに関する利用可能な設定を有効化する方法を提供するなどといった、マルチブートに関するクロスプラットフォームなシステムを規定する仕様であるGRUBの原著作者であるエーリヒ・シュテファン・ブーリンが当初"[1]"という形で提案したものに端を発する。}}。同仕様は現在フリーソフトウェア財団  がメンテナンスしている。

もともとGRUBはGrand Unified Bootloaderこの名称は//Grand Unified Theory//すなわち大統一理論という語に対する言葉遊びではないか、これはFSFが開発していたGNU Hurdオペレーティングシステムを起動させるための作業の一環であった。1999年、主要貢献者であったゴルドン・マッツィヒカイトと奥地秀則の働きかけによって、GRUBは公式GNUプロジェクトの公開プロジェクトとなり最新のソースコードをホストするanonymous CVSが提供されることとなった。

1. 特徴
-----

GRUBは動的に設定でき、コンピュータのブートタイム中に異なるカーネルや初期RAMディスク  を選択するといった柔軟な設定変更が可能である。そのような目的を実現するために、GRUBはシンプルかつBashライクなコマンドラインインタフェースを提供しており、ユーザーは通常のブートメニューリストにその場で新たなブートシーケンスを追加することもできる。

GRUBは移植性が極めて高く、複数の実行可能フォーマットをサポートしており、ディスクのジオメトリ変換に依存していない。GRUBはLogical Block Addressモードのサポートに加え、ほぼ全ての主要なUNIXファイルシステム、並びにVFAT及びNTFSなどMicrosoft Windowsで使用するファイルシステムもサポートしている。GRUBを利用することで、サポートしている任意のファイルシステム上に存在するファイルの中身をユーザーは見ることができる。

GRUBは様々なユーザインタフェースを用いて設定することができる。多くのLinuxディストリビューションではGRUBのブートメニューに表示される背景画像のカスタマイズなどを行うグラフィカルな設定ツールを用意している。またGRUBのテキストインタフェースを利用すると、リモート・ターミナルからシリアルポート経由で接続できる。

GRUBはネットワーク経由でのOSイメージのダウンロードも可能で、従ってディスクレスシステムもサポートしている。GRUBはローカルから起動するだけではなく、起動前の自動的なOSイメージの伸長もできる。

GRUBはスクロール可能なOSブート選択画面を表示する。GRUBは設定ファイル"menu.lst"にエントリーを追加することで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からのインストールも可能である。

2. ブートプロセス
----------

//以下の説明はx86システムを対象としている。その他のシステムには当てはまらないかもしれない。//

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

2.1. GRUB バージョン1 
------------------------------

GRUBをインストールしたコンピュータならば、通常GRUBの初期ブートプログラムであるStage 1ローダがMBRにインストールされている。しかし、チェーンロード可能な別のブートローダがMBRにインストールされていても構わない。後者の場合は、パーティションのボリュームブートレコードのような別のブートセクタに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以内に位置するローダであり、何らかの理由でこの領域が利用できない場合は、Stage 1.5ローダのインストールに失敗する。Stage 1.5ローダのイメージはファイルシステム固有のドライバを含んでおり、これを用いてStage 1.5ローダはStage 2ローダをファイルシステム上の任意の場所から発見できるようになり、これを直接ロードできる。この後、Stage 2はデフォルトの設定ファイル、及び必要とされるその他任意のモジュールを読み込む。

2.2. GRUB バージョン2
----------------

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

core.imgファイルを一旦ロードすると、デフォルトの設定ファイル及び必要とされるその他任意のモジュールもロードされる。

2.3. GRUBのロード以降
---------------

GRUBのロードがひとたび完了すると、どのOSを起動するか選択するためのインタフェースが提供される。これは通常、グラフィカルなメニューのかたちをとっていることが多い。そのようなメニューが利用できない場合、またはユーザーが直接制御した場合、GRUBは自身が持つコマンドプロンプトを提供する。これを用いてユーザーはブートパラメータを手動で指定することが可能である。GRUBはユーザーが定義した時間何も操作せず経過すると自動的に特定のカーネルをロードするよう設定できる。

GRUBがOSもしくはカーネルの選択メニューにおいて受け付けるコマンドの内、最も重要なものはおそらく次の2つである。

OSの起動前に、メニュー上であるOSにカーソルを当てて選択した状態でキーボードの'e'を押下した場合、そのOSの起動パラメータを編集できる。典型的なケースとして、Linuxシステムのカーネル・パラメータの変更の際にこのことを利用する。このように、既に起動済みシステム上でGRUBの設定を変更しない、及びカーネル・パラメータを編集しないケースというのは、突発的な事態、例えばOSがブートに失敗したケースなどを想定しており、そのような事態が起きてもGRUBは対応できる。また、カーネル・パラメータのコマンドラインを利用すると、とりわけ、OS起動前に、あるLKMを無効化する、またはブラックリスト化することが可能となる。特定のLKMが壊れており、このため正常なブート・シーケンスが阻害される場合、おそらくこの機能が必要となる。例としてLinuxカーネルのLKMである"nvidia-current"というものをブラックリスト化する場合、カーネル・パラメータの末尾に"modprobe.blacklist=nvidia-current"のような文字列を追記する必要があるが、予めGRUBの設定ファイルにこの文字列が無かったとしても、キーボードの'e'を押下してパラメータをオン・ザ・フライで変更できるのである。
任意の状態でキーボードの'c'を押下した場合、BashライクなGRUBのコマンドラインを表示する。とはいえこれは通常のLinux上のシェルとは異なる。これはGRUB固有の特定コマンドしか受け付けない。いずれの場合もパラメータの編集が完了したあと、Ctrl+xキーを同時に押下すればOSがこのパラメータを使って起動する。

ブートオプションが選択されると、GRUBは選択したカーネルをメモリにロードし、以後の制御を全てカーネルに委ねる。あるいは、GRUBはチェーンロードを利用し、別のブートローダにブートプロセスの制御を渡すこともできる。これはWindowsのようなマルチブート標準をサポートしない、またはGRUBが直接サポートしていないOSをロードするのに使用される手段である。この場合、他のシステムのブートプログラムはGRUBが保全したまま維持される。そして、カーネルの代わりとして、他システムはあたかもMBRから起動したかのようにロードされる。このことからGRUBは、Microsoftブートメニューと同じく、マルチブート非対応のOSも追加で選択できるブートマネージャであるといえる。既にシステムにWindows OSが存在する場合、「その上に追加で」Linuxディストリビューションをインストールする際には、現代的なLinuxディストリビューションのインストーラは、GRUBがこのような挙動をするよう自動的に設定する場合がある。そして、既にインストール済みのオリジナルOSは一切の変更が加わらず維持され、それは例えば、複数のバージョンのWindowsがインストールされているシステムでも同様である。

3. 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対応の光学ドライブ、フロッピーディスクまたはUSB フラッシュドライブのようなリムーバブルメディアへのインストールも可能である。

4. 開発
-----

もっとも広く使用されているGRUBのバージョンは//GRUB Legacy//と呼ばれる。このバージョンは現在、バグ修正のみを受け付け、新しい機能は追加されないことになっている。GRUB開発者は新しいバージョンのGRUB 2に開発を集中している。このバージョンは、GNU GRUBの既存のコードを整頓し、より強固なものに変え、かつ移植性、機能性を向上させることを含む目標を掲げて全面的な書き変えを行ったものである。GRUB 2の開発は当初PUPAと言う名前のもと始まった[[wikt:en: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 など他のディストリビューションでのサポートも開始されている。

4.1. 派生
-------

公式には開発は完了しているが、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にBSDディスクラベルや自動的な64ビットカーネル選択、そしてZFSからのブートをサポートするための各種改良が加えられている。Syllable OSプロジェクトではAtheOS File Systemからのシステム起動をサポートするため改変版のGRUBを作成している。

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

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

5.1. ユーティリティ
------------

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

6. 対応しているファイルシステム 
--------------------------

GRUB 2では、以下のファイルシステムがサポートされ、GRUBからファイルシステム上のファイルにアクセスできる。

FFS
UFS2
FAT16/32
ext2/ext3/ext4
NTFS
ReiserFS
JFS
XFS
MINIX FS
ZFS
Btrfs

7. 起動トラブルについて
-------------

GRUBは、MBRに収録されるGRUB本体と、パーティション内に収録される設定ファイルなどから構成される。 一般的にこれらの設定ファイル等は、GRUB Legacyのstage1.5/2ローダをインストールしたLinux用パーティション内に保存される。このため、Linuxを削除する目的でLinux用パーティションごと破壊してしまうと、起動できなくなるトラブルに見舞われる。

このほかにもGRUBの起動システムは多種多様な要因によって起動不能となることがある。 BIOSからのHDD認識、ストレージデバイスコントローラーの認識状態、USBストレージ機器の接続状況などから、こういった問題がおきる可能性がある。

こういった問題に、GRUBは処理の段階ごとに停止時の表示から状況を判断できるように設計されている。 またGRUBコンソールやGRUB rescueコンソールが表示される場合は、他の起動ディスクなどを用いること無く、起動可能な状態に復旧できる場合もある。



8. 脚注
-----

8.1. 注釈
-------

8.2. 出典
-------

9. 関連項目
-------

Windows Boot Manager
LILO
coreboot
UEFI

10. 関連リンク
---------

11. 外部リンク
---------

[2]
[3]
[4]
[5] 
[6]
[7]
[8]、Linux Journal - すばらしいチュートリアル。
2008年11月10日開催された、横浜Linuxユーザグループ  第92回カーネル読書会でのプレゼンテーション及びビデオ。GRUB主要開発者、奥地秀則による。GRUBの開発がいわゆるシステムプログラミングであることがよくわかる。
[9]
[10]
[11] - 当講演で使用した資料