GRUB

出典: フリー百科事典『ウィキペディア(Wikipedia)』
2014年7月28日 (月) 02:59時点におけるSamplepassname (トーク)による版 (起動トラブルについて)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

テンプレート:Infobox

GNU GRUB(GRand Unified Bootloader)はGNUにて開発されている高機能なブートローダである。グラブまたはジーラブと読む。 大きく分けてバージョン0.9x系のGRUB Legacyと、1.9x系のGRUB 2の2種類がある。

GRUBはテンプレート:仮リンクリファレンス実装である。Multiboot Specification(マルチブート仕様)とは、コンピュータにインストールされた複数のオペレーティングシステムを個別に起動する際にOSの選択肢をユーザーに提示したり、または、あるOSのパーティション上に存在する特定のカーネルに関する利用可能な設定を有効化する方法を提供するなどといった、マルチブートに関するクロスプラットフォームなシステムを規定する仕様である[注釈 1]。同仕様は現在FSFが策定中である。

もともとGRUBはGrand Unified Bootloader(この名称はGrand Unified Theoryすなわち大統一理論という語に対する言葉遊びではないか[1]ともいわれているが定かではない)という名前でGNUとは無関係のプロジェクトにて開発されていたが、GNUは開発中のカーネルGNU HurdをブートするためGRUBを利用していた。のちに主要貢献者の助言もあり、GNU公式のプロジェクトとなった。現在ではGNUオペレーティングシステムのカーネルであるGNU Hurdだけではなく、主にLinuxFreeBSDなどのUnix系OSや、Solaris x86(10 1/06 release以降[2])でも利用されている。

歴史

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

ファイル:GNU GRUB components.svg
boot.img has the exact size of 446 Bytes and is written to the MBR (sector 0). core.img is written to the empty sectors between the MBR and the first partition, if available (for legacy reasons the first partition starts at sector 63 instead of sector 1, but this is not mandatory). The /boot/grub-directory can be located on an distinct partition, or on the /-partition.

特徴

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

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

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

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

GRUBはスクロール可能なOSブート選択画面を表示する。GRUBは設定ファイル"menu.lst"(または"grub.cfg"など)にエントリーを追加することで150またはそれを超えるブート選択を容易に行うことが可能であり、矢印キーでブートするOSを選択する。

GRUBはマルチブートに対応しているが、テンプレート:仮リンクを利用しマルチブート非対応のOSをもサポートしている。ブートOSの追加と同じく、2、3行のコマンドシーケンスを設定ファイルに書き込む、またはGRUBシェルでその場で適切なコマンドを実行することで、DOS、Windows、Linux、BSD、または、Solarisオペレーティングシステムをいとも簡単に起動させることができる。これらUnix系OSやDOS、Windowsなどを起動するためのチェーンローダがGRUBに組み込まれている。

前述の通り、通常のブートメニューに加え、Bashライクなターミナルコマンドプロンプトが利用でき、ブートプロセスの一部または全部をチェックしたり変更することが可能な豊富なコマンドセットを持っている。これらの手法を活用することで、コンピュータにインストールされているOSの特別な知識が事前になくとも、インストールされているOSを起動する目的でフロッピーディスクUSB、またはCD-ROMデバイスからGRUBを利用し起動することもできる。

GRUBは一般的なUnix系OS上においてインストール可能であり、また特定の実装を用いてDOSやWindowsからのインストールも可能である。

LILOとの違い

Linuxのブートローダとして古くから使われてきたLILOと違い、主に以下のような特徴がある。

  • Bashライクなコマンドラインによる操作
  • ブートセクタに直接アクセスするテンプレート:仮リンク(chainload)機能
  • LBAのサポート
  • 設定情報をブートレコードから分離した汎用性の高い設計
  • 高い相互運用性
    • LILOも他のOSを起動できるが、基本はLinuxのブートのために使用される。しかし、GRUBは様々なOSのカーネルやファイルシステムに対応している。

このような特徴から、GRUBは多くのLinuxディストリビューションやBSD、SolarisというようなOSのデフォルトのブートローダに採用され、Unix系OSに加えDOS、Microsoft Windowsもブートできる。

ブートプロセス

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

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

GRUB バージョン1 (GRUB Legacy)

GRUBをインストールしたコンピュータならば、通常GRUBの初期ブートプログラムであるStage 1ローダがMBRにインストールされている。しかし、チェーンロード可能な別のブートローダ(例: NTLDR)がMBRにインストールされていても構わない。後者の場合は、パーティションのテンプレート:仮リンク(Volume boot record, VBR、またはパーティションブートレコード、 Partition boot record, PBRとも呼ばれる)のような別のブートセクタにGRUBのStage 1ローダをインストールし、このStage 1ローダをMBR上のブートローダからチェーンブートすればよい。ブートセクタのサイズは限られており、更にStage 1ローダが使用するBIOS割り込みルーチンの制限から、このタイミングでは、ディスクの先頭テンプレート:仮リンク以内の固定領域から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から利用不可能になり動作しなくなるという問題の部分的な解決策になっている。[7]

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

GRUBのロード以降

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

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

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

いずれの場合もパラメータの編集が完了したあと、Ctrl+xキーを同時に押下すればOSがこのパラメータを使って起動する[11]

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

GRUBのインストール

GRUBの鍵となる特徴は、それがOSと結びつくことなくインストールされることにあるが、初めてのインストールにおいては、Linuxのイメージのコピーが少なくとも1つ必要となる。ただ当該Linuxシステムが1つ存在すれば、ローダをインストールする後述のコマンドを実行し別のパーティションのVBRにインストールできる。または光学ディスクにもGRUBをインストールできる[12]ので、以後この光学ディスクを用いれば、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に存在する。またFedoraGentoo 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が生成される[13]

GRUBは何らかの理由でハードディスクがない、またはハードディスクからのブートができなくなったシステムを起動するため、BIOSアクセス可能かつEl Torito(en)対応の光学ドライブ[12]フロッピーディスクまたはUSB フラッシュドライブのようなリムーバブルメディアへのインストールも可能である。

開発

もっとも広く使用されているGRUBのバージョンはGRUB Legacyと呼ばれる。このバージョンは現在、バグ修正のみを受け付け、新しい機能は追加されないことになっている。GRUB開発者は新しいバージョンのGRUB 2に開発を集中している[14]。このバージョンは、GNU GRUBの既存のコードを整頓し、より強固なものに変え、かつ移植性、機能性を向上させることを含む目標を掲げて全面的な書き変えを行ったものである。GRUB 2の開発は当初PUPA[15]と言う名前のもと始まった[注釈 2]。PUPAプロジェクトは日本の独立行政法人情報処理推進機構の援助を受けており、「平成14年度 未踏ソフトウェア創造事業[16]に「次世代GRUBブートローダの基本設計と実装」という案件として採択された[17][18]。PUPAはGRUB バージョン0.9xがGRUB Legacyとリネームされた2002年頃、GRUB 2の開発に統合された。

プロジェクトの目標はいくつかあったが一例を挙げると、PowerPCなど非x86プラットフォーム、ソフトウェアの国際化と地域化[19]、非ASCII文字[19] 、動的なモジュールローディング、メモリ管理、簡易なスクリプト言語、x86プラットフォーム依存コードの特定のモジュールへの移動及び隔離、オブジェクト指向フレームワーク等の各種サポートが含まれている。Ubuntuはそのバージョン9.10からデフォルトのブートローダとして採用しており[20]、Fedora 14、Debian 6.0 (コードネーム: squeeze)など他のディストリビューションでのサポートも開始されている。

派生

公式には開発は完了しているが、GRUB Legacyがエンドユーザーの間にて未だ広く使用されているが故に、いくつかの非公式なプロジェクトがGRUB Legacyのコードを彼ら自身で改善するため、フォークしている。例えば、"setgrubdevice"や"usbshift"などの新しいコマンドを含むSuper Grub Disk[21]GRUB4DOSなどがある。特にGRUB4DOSはDOS/LINUXからの起動、Windowsブートマネージャ、SYSLINUX、またはLILO経由での起動、並びにMBR/CDからの起動をサポートするユニバーサルブートローダである。またBIOSディスクエミュレーションやATAPI CDROMドライバも組み込まれている[22]。いくつか改良されているコマンドもあり、"find --set-root", "map --hook", そして"cdrom"がそれに当たる[23]

OpenSolarisではGRUB Legacyにテンプレート:仮リンクや自動的な64ビットカーネル選択、そして(データ圧縮やマルチブート環境での動作も含む)ZFSからのブートをサポートするための各種改良が加えられている[24][25]Syllable OSプロジェクトではテンプレート:仮リンクからのシステム起動をサポートするため改変版のGRUBを作成している[26]

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

ファイル:StartUp-Manager.png
テンプレート:仮リンク、GRUBを設定する際に使用されるプログラム

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

ユーティリティ

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

対応しているファイルシステム (GRUB 2)

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

起動トラブルについて

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

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

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

GRUB停止(待機)時表示
表示例 呼称 発生状況
grub> GRUBコンソール 起動やkernel設定等に関わる一時的変更を行なうために、手動でGRUBコンソールを呼び出した場合
GRUB2の設定ファイル等のパーティションが読み込んだのち、grub.cfgが読み込めなかった場合
error:invalid extent
grub rescue >
GRUB rescueコンソール GRUB2のgrub.cfgを読み込んだ上で何らかのトラブルが生じた場合
error: no such partition.
grub rescue>
GRUB rescueコンソール GRUB2の設定ファイルが保存されているパーティションが見つからない場合

脚注

テンプレート:脚注ヘルプ

注釈

テンプレート:Reflist

出典

テンプレート:Reflist

関連項目

テンプレート:Sister

関連リンク

外部リンク

テンプレート:Portal

テンプレート:GNU テンプレート:FLOSS-stub


引用エラー: 「注釈」という名前のグループの <ref> タグがありますが、対応する <references group="注釈"/> タグが見つからない、または閉じる </ref> タグがありません
  1. テンプレート:Cite web
  2. テンプレート:Cite webテンプレート:リンク切れ
  3. テンプレート:Cite web
  4. 4.0 4.1 テンプレート:Cite web
  5. 次はその一例であり、x86アーキテクチャ用コードである。 テンプレート:Cite web
  6. テンプレート:Cite web奥地自身もGRUBの開発に利用していた。
  7. 8.0 8.1 テンプレート:Cite web
  8. Arch Linuxの例。"7 Blacklisting"を参照。 テンプレート:Cite web
  9. テンプレート:Cite web
  10. テンプレート:Cite web
  11. 12.0 12.1 テンプレート:Cite web
  12. テンプレート:Cite web
  13. テンプレート:Wayback
  14. テンプレート:Cite web
  15. テンプレート:Cite web
  16. テンプレート:Cite web担当PM新部裕
  17. テンプレート:Cite web
  18. 19.0 19.1 テンプレート:Cite web従来のLILOやGRUB Legacyでは実現できていない。
  19. GRUB 2 by default, Ubuntu 9.10 Technical Overview, Ubuntu テンプレート:リンク切れ
  20. テンプレート:Cite web
  21. テンプレート:Cite web
  22. テンプレート:Cite web
  23. テンプレート:Cite webModifying Solaris Boot Behavior on x86 Based Systems (Task Map) - System Administration Guide: Basic Administration
  24. テンプレート:Cite web(System Administration Guide: Basic Administration) - Sun Microsystems
  25. テンプレート:Cite web
  26. テンプレート:Cite web
  27. テンプレート:Cite web
  28. テンプレート:Cite web
  29. 30.0 30.1 引用エラー: 無効な <ref> タグです。 「mailing-list」という名前の引用句に対するテキストが指定されていません