GRUB (Grand Unified Bootloader)は、2つのステージで構成されています。 stage1は512バイトから成り、MBR、またはハードディスクパーティションやフロッピーディスクのブートセクタに書き込まれます。その後、stage2が読み込まれます。このステージには、実際のプログラムコードが含まれています。最初のステージのタスクは、ブートローダの第2ステージを読み込むことだけです。
stage2には、ファイルシステムにアクセスする機能があります。現在、Windowsで使用されているExt2、Ext3、ReiserFS、Minix、およびDOS FATファイルシステムがサポートされます。BSDシステムで使用されているJFS、XFS、UFS、およびFFSも、特定の範囲までサポートされます。バージョン0.95以降のGRUBには、「El Torito」仕様に準拠するISO 9660標準ファイルシステムを含むCDまたはDVDからブートする機能も用意されています。システムをブートする前にも、はサポートされているBIOSディスクデバイス(BIOSにより検出されるフロッピーディスクまたはハードディスク、CDドライブ、およびDVDドライブ)のファイルシステムにアクセスできます。 したがって、GRUBの設定ファイル(menu.lst)を変更しても、ブートマネージャを再インストールする必要はありません。システムをブートすると、GRUBはメニューファイルと共にカーネルまたは初期RAMディスク(initrd)の有効なパスとパーティションデータを再読み込みし、これらのファイルを検索します。
GRUBの実際の設定は、以下の3つのファイルに基づきます。
GRUBは、さまざまな方法で制御できます。グラフィカルメニュー(スプラッシュ画面)を使用して、既存の設定からブートエントリを選択できます。設定は、ファイルmenu.lstから読み込まれます。
GRUBでは、すべてのブートパラメータをブート前に変更できます。たとえば、メニューファイルを間違って編集した場合は、この方法で訂正できます。また、一種の入力プロンプトからブートコマンドを対話形式で入力することもできます(項29.3.1.3. 「ブート手順実行中のメニューエントリの編集」を参照)。GRUBには、ブート前にカーネルとinitrdの位置を判別する機能が用意されています。この機能を使用すると、ブートローダ設定にエントリが存在しないインストール済みオペレーティングシステムでもブートできます。
GRUBシェルは、インストール済みシステムのGRUBをエミュレートします。 このシェルを使用すると、GRUBをインストールしたり、適用前に新規設定をテストできます。項29.3.4. 「GRUBシェル」を参照してください。
ブートメニューを含むグラフィカルスプラッシュ画面は、GRUBの設定ファイル/boot/grub/menu.lstに基づいており、このファイルにはメニューを使用してブートできるパーティションまたはオペレーティングシステムに関する情報がすべて含まれています。
システムをブートするたびに、はファイルシステムからメニューファイルを読み込みます。このため、ファイルを変更するたびにを再インストールする必要がありません。 項29.4. 「YaSTによるブートローダの設定」で説明しているように、YaSTのブートローダを使用してGRUBの設定を変更します。
メニューファイルにはコマンドが含まれています。構文はきわめて単純です。各行には、コマンド1つとオプションのパラメータがシェルと同様にスペースで区切って指定されています。これまでの経緯が理由で、一部のコマンドでは最初の引数の前に等号(=)を使用することができます。コメントを記述するには、行頭にシャープ記号(#)を入力します。
メニュー概要の中にあるメニュー項目を識別できるように、各エントリに対してtitle (タイトル)を指定します。キーワードtitleの後に続くテキスト(半角スペースも使用できます)は、メニューの中で、選択可能なオプションとして表示されます。そのメニュー項目が表示された場合、次のtitleまでに記述されているすべてのコマンドが実行されます。
最も簡単な例は、他のオペレーティングシステムのブートローダにリダイレクトすることです。該当するコマンドはchainloaderであり、引数は通常、他のパーティション内にあるブートブロックをGRUBのブロック表記に従って記述したものです。次に例を示します。
chainloader (hd0,3)+1
GRUBでのデバイス名については、項29.3.1.1. 「ハードディスクとパーティションに関する命名規則」を参照してください。先ほどの例では、1台目のハードディスクの4番目のパーティションの最初のブロックを指定しています。
カーネルイメージを指定するには、kernelコマンドを使用します。最初の引数は、パーティションにあるカーネルイメージを表すパスです。他の引数は、コマンドラインでカーネルに渡されます。
ルートパーティションへのアクセスに必要なビルトインドライバがカーネルに用意されていない場合は、initrdファイルへのパスを示す引数だけを指定して、別のGRUBコマンドでinitrdを指定する必要があります。initrdの読み込みアドレスは、読み込まれるカーネルイメージに書き込まれているので、initrdコマンドは、kernelコマンドの直後に記述する必要があります。
rootコマンドは、kernelとinitrdの各ファイルの指定を簡略化します。 rootの唯一の引数は、GRUBデバイス、またはGRUBデバイス上のパーティションです。このデバイスは、すべてのカーネル、initrd、または次のrootコマンドまでデバイスが明示的に指定されていない他のファイルのパスに使用されます。インストール時に生成されるmenu.lstファイル内では、このコマンドは使用されていません。単純に手動で編集する際に使用するものです。
bootコマンドは各メニューエントリの最後に必ず含まれています。そのため、メニューファイルにこのコマンドを記述する必要はありません。ただし、GRUBをブート時に対話形式で使用する場合は、bootコマンドを最後に入力する必要があります。このコマンド自体は、引数を使用しません。単純に、読み込み済みのカーネルイメージ、または指定のチェーンローダをブートします。
すべてのメニューエントリを記述した後、その1つをdefaultエントリとして定義します。デフォルトエントリを指定しなかった場合、最初のエントリ(エントリ0)が使用されます。 デフォルトエントリがブートされるまでのタイムアウトを秒単位で指定することもできます。 通常、timeoutおよびdefaultは、メニューエントリより先に記述します。サンプルファイルについては、項29.3.1.2. 「メニューファイルの例」を参照してください。
でのハードディスクとパーティションの命名規則は、通常のLinuxデバイスの命名規則と異なっています。 GRUBでは、パーティション番号は0から始まります。そのため、(hd0,0)は最初のハードディスクの最初のパーティションとなります。ハードディスクがプライマリマスタとして接続されている一般的なデスクトップマシンでは、対応するLinuxデバイス名は/dev/hda1になります。
可能な4つの基本パーティションに、パーティション番号0~3が割り当てられます。論理パーティション番号は4から始まります。
(hd0,0) 最初のハードディスクの最初の基本パーティショ
(hd0,1) 2番目の基本パーティショ
(hd0,2) 3番目の基本パーティショ
(hd0,3) 4番目の基本パーティション(通常は拡張パーティション)
(hd0,4) 最初の論理パーティショ
(hd0,5) 2番目の論理パーティション
GRUBは、IDE、SCSI、RAIDの各デバイスを区別しません。BIOSまたは他のディスクコントローラで認識されるすべてのハードディスクには、BIOSの中で事前に設定されたブートシーケンスに従って番号が割り当てられます。
には、Linuxデバイス名をBIOSデバイス名に正確にマップする機能がありません。このマッピングはアルゴリズムを使用して生成され、device.mapファイルに保存されるため、必要に応じて編集できます。ファイルdevice.mapについては、項29.3.2. 「device.mapファイル」を参照してください。
のフルパスは、カッコ内のデバイス名と、指定のパーティションにあるファイルシステム内のファイルへのパスで構成されます。このパスはスラッシュで始まります。たとえば、単一IDEハードディスクの最初のパーティションにLinuxを含んでいるシステムでは、ブート可能カーネルを次のように指定できます。
(hd0,0)/boot/vmlinuz
次の例は、GRUBのメニューファイルの構造を示しています。このインストール例では、Linuxのブートパーティションが/dev/hda5、ルートパーティションが/dev/hda7、およびWindowsのインストールファイルが/dev/hda1にあります。
gfxmenu (hd0,4)/message color white/blue black/light-gray default 0 timeout 8 title linux kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=791 initrd (hd0,4)/initrd title windows chainloader(hd0,0)+1 title floppy chainloader(fd0)+1 title failsafe kernel (hd0,4)/vmlinuz.shipped root=/dev/hda7 ide=nodma \ apm=off acpi=off vga=normal nosmp maxcpus=0 3 initrd (hd0,4)/initrd.shipped
最初のブロックは、スプラッシュ画面の設定を定義します。
背景画像messageは、/dev/hda5にあります。
配色は、白(前景色)、青(背景色)、黒(選択項目)、明るい灰色(選択項目の背景色)です。配色はスプラッシュ画面には影響しません。影響を受けるのは、Escキーを押してスプラッシュ画面を終了するとアクセスできるカスタマイズ可能なGRUBメニューだけです。
最初のメニューエントリtitle linuxは、デフォルトでのブート対象です。
ユーザ入力がないまま8秒が経過した場合、GRUBは自動的にデフォルトエントリをブートします。 自動ブートを無効にするには、timeoutの行を削除します。 timeout 0と設定すると、GRUBは待ち時間なしでデフォルトのエントリをブートします。
2番目の(最大)ブロックは、ブート可能な各種オペレーティングシステムを示します。個々のオペレーティングシステムに関するセクションはtitleで始まります。
最初のエントリ(title linux)は、SUSE Linuxをブートする役割を果たします。カーネル(vmlinuz)は、1台目のハードディスクの最初の論理パーティション(ブートパーティション)内に配置されています。ルートパーティションやVGAモードなどのカーネルパーティションは、ここに追加されます。ルートパーティションは、Linuxの命名規則に従って指定されたものです(/dev/hda7)。この情報を読み込むのはLinuxカーネルであり、GRUBは関係しないからです。initrdも、1台目のハードディスクの最初の論理パーティション内に配置されています。
第2のエントリは、Windowsを読み込む役割を果たします。Windowsは、1台目のハードディスク(hd0,0)の最初のパーティションからブートされます。chainloader +1コマンドは、指定されたパーティションの最初のセクタを読み取って実行するようGRUBに指示します。
次のエントリは、BIOS設定を変更することなく、フロッピーディスクからブートすることを可能にします。
ブートオプションfailsafeは、問題のあるシステム上でもLinuxのブートを可能にするカーネルパラメータを選択してLinuxを起動します。
メニューファイルは必要に応じて変更できます。その場合、GRUBは変更後の設定を次回のブート時に使用します。 このファイルを永続的に編集するには、YaSTまたは好みのエディタを使用します。 また、対話形式で一時的に変更するには、GRUBの編集機能を使用します。項29.3.1.3. 「ブート手順実行中のメニューエントリの編集」を参照してください。
のグラフィカルブートメニューでは、ブートするオペレーティングシステムを矢印キーで選択します。Linuxシステムを選択した場合は、ブートプロンプトからブートパラメータを追加入力できます。個々のメニューエントリを直接編集するには、Escキーを押してスプラッシュ画面を終了してからEキーを押します。この方法で加えた変更は、現在のブート手順だけに適用され、永続的に採用されることはありません。
![]() | ブート手順実行中のキーボードレイアウト |
|---|---|
ブート時は、USキーボードレイアウトだけが使用可能です。 | |
編集モードを有効にした後、矢印キーを使用して、設定を編集するメニューエントリを選択します。設定を編集可能にするには、もう一度Eキーを押します。このようにして、不正なパーティションまたはパス指定を、ブートプロセスに悪影響を及ぼす前に編集します。Enterキーを押して編集モードを終了し、メニューに戻ります。次に、Bキーを押してこのエントリをブートします。下部のヘルプテキストに、さらに可能なアクションが表示されます。
変更後のブートオプションを永続的に入力してカーネルに渡すには、ユーザrootでファイルmenu.lstを開き、関連カーネルパラメータをスペースで区切って既存の行に追加します。
title linux kernel (hd0,0)/vmlinuz root=/dev/hda3 additional parameter initrd (hd0,0)/initrd
GRUBは、次回のシステムブート時に新規パラメータを自動的に使用します。 または、この変更をYaSTのブートローダモジュールで行うこともできます。新規パラメータをスペースで区切って既存の行に追加します。
特にカスタムカーネルを開発または使用する場合は、menu.lst内のエントリを変更するか、またはコマンドラインを編集して現在のカーネルとinitrdのファイル名を反映する必要があります。この手順を単純化するには、GRUBのカーネルリストを動的に更新するためにワイルドカードを使用します。その結果、特定のパターンと一致するすべてのカーネルイメージが、ブート可能なイメージのリストに自動的に追加されます。この機能についてはサポートがないので注意してください。
ワイルドカードオプションを有効にするには、menu.lstにさらにメニューエントリを入力します。実用になるように、すべてのカーネルイメージとinitrdイメージには、カーネルをその関連するinitrdに対応させる共通の基本名と識別子が必要です。次のセットアップを考えてみます。
initrd-default initrd-test vmlinuz-default vmlinuz-test
この場合には、1つのGRUB設定で両方のブートイメージを追加できます。メニューエントリlinux-defaultとlinux-testを取得するには、menu.lstに次のエントリが必要です。
title linux-* wildcard (hd0,4)/vmlinuz-* kernel (hd0,4)/vmlinuz-* root=/dev/hda7 vga=791 initrd (hd0,4)/initrd-*
この例では、はワイルドカードに対応するエントリのパーティション(hd0,4)を検索します。 こうしたエントリを使用してGRUBメニューの新しいエントリが生成されます。 先ほどの例では、GRUBは、次のエントリがmenu.lstにあるかのように動作します。
title linux-default
wildcard (hd0,4)/vmlinuz-default
kernel (hd0,4)/vmlinuz-default root=/dev/hda7 vga=791
initrd (hd0,4)/initrd-default
title linux-test
wildcard (hd0,4)/vmlinuz-test
kernel (hd0,4)/vmlinuz-test root=/dev/hda7 vga=791
initrd (hd0,4)/initrd-test
このような設定で、ファイル名が一貫して使用されていない場合や、展開されたファイルのいずれか(initrdイメージなど)が失われている場合には、問題が発生するおそれがあります。
device.mapファイルは、GRUBのデバイス名をLinuxのデバイス名にマップします。 IDEとSCSIの各ハードディスクが混在するシステムでは、GRUBは特殊プロシージャを使用してブートシーケンスの判定を試みる必要があります。これは、GRUBはBIOSのブートシーケンス情報にアクセスできないからです。GRUBはこの分析の結果をファイル/boot/grub/device.mapに保存します。BIOS内でブートシーケンスがIDE、SCSIの順に設定されているシステムの場合、ファイルdevice.mapは次のようになります。
(fd0) /dev/fd0 (hd0) /dev/hda (hd1) /dev/sda
IDE、SCSI、および他のハードディスクのシーケンス(順序)は、さまざまな要因によって異なり、Linuxではマッピングを識別できないため、device.mapファイル内のシーケンスは手動で設定できます。ブート時に問題に直面した場合は、このファイル内のシーケンスがBIOS内のシーケンスに対応しているかどうかをチェックします。さらに、必要に応じてGRUBシェルを使用し、ファイル内のシーケンスを一時的に変更します(項29.3.4. 「GRUBシェル」を参照)。 Linuxシステムのブート後に、YaSTブートローダモジュールまたは好みのエディタを使用して、device.mapファイルを永続的に変更できます。
device.mapを手動で編集した後、次のコマンドを実行してGRUBを再インストールします。このコマンドにより、device.mapファイルが再読み込みされ、grub.confに指定されているコマンドが実行されます。
grub --batch < /etc/grub.conf
menu.lstおよびdevice.mapのほかに重要な第3のGRUB設定ファイルは、/etc/grub.confです。このファイルには、grubコマンドでブートローダを正常にインストールするために必要なパラメータとオプションが含まれています。
root (hd0,4) install /grub/stage1 d (hd0) /grub/stage2 0x8000 (hd0,4)/grub/menu.lst quit
各エントリの意味:
このコマンドは、に対して後続のコマンドを1台目のハードディスクの最初の論理パーティション(ブートファイルの位置)に適用するように指示します。
パラメータ
grubコマンドは、installパラメータを指定して実行する必要があります。 ブートローダのstage1は、1台目のハードディスクのMBR内にインストールする必要があります(/grub/stage1 d (hd0))。 stage2は、メモリアドレス0x8000に読み込む必要があります(/grub/stage2 0x8000)。最後のエントリ((hd0,4)/grub/menu.lst)は、メニューファイルを探す場所をGRUBに伝えます。
GRUBは実際には2つのバージョンがあります。ブートローダと、/usr/sbin/grubにある通常のLinuxプログラムです。 このプログラムをGRUBシェルと呼びます。 ハードディスクやフロッピーディスクにGRUBをブートローダとしてインストールする機能は、installコマンドとsetupコマンドの形でGRUBに組み込まれています。 この機能は、Linuxの読み込み時にGRUBシェル内で使用できます。
ただし、setupコマンドとinstallコマンドは、Linux起動前のブート手順でも使用できます。これにより、障害が発生してブートできなくなったシステムを容易に修復できます。これは、ブートローダの設定ファイルの誤りをパラメータの手動入力により回避できるからです。ブート手順の中でパラメータを手動で入力する方法は、ネイティブシステムを損傷せずに新規設定をテストする際にも役立ちます。単に、menu.lstの場合と同様の構文を使用して、実験的な設定ファイルを入力します。次に、既存の設定ファイルは変更せずに、このエントリの機能をテストします。たとえば、新規カーネルをテストするには、kernelコマンドと新規カーネルへのパスを入力します。ブートプロシージャが失敗した場合、次回のブート時にはオリジナルのmenu.lstを引き続き使用できます。同様に、訂正後のパラメータを入力することで、menu.lstファイルの誤りに関係なくコマンドラインインタフェースを使用してシステムをブートすることもできます。稼働中のシステムでは、menu.lstに正しいパラメータを入力して、システムを永続的にブート可能にすることができます。
GRUBデバイスからLinuxデバイスへのマッピングが関係するのは、GRUBシェルを(項29.3.2. 「device.mapファイル」の説明に従ってgrubを入力して) Linuxプログラムとして実行する場合だけです。この目的で、このプログラムはdevice.mapファイルを読み取ります。詳細については、項29.3.2. 「device.mapファイル」を参照してください。
オペレーティングシステムのブート前でも、GRUBはファイルシステムへのアクセスを可能にします。rootパーミッションを持たないユーザは、システムのブート後、アクセス権のないLinuxシステム上のファイルにアクセスできます。この種のアクセスを阻止したり、ユーザによる特定のオペレーティングシステムのブートを防止するために、ブートパスワードを設定できます。
![]() | ブートパスワードとスプラッシュ画面 |
|---|---|
にブートパスワードを使用する場合、通常のスプラッシュ画面は表示されません。 | |
ユーザrootとして、次の手順に従ってブートパスワードを設定します。
rootプロンプトで、grubと入力します。
GRUBシェル内でパスワードを暗号化します。
grub> md5crypt Password: **** Encrypted: $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
暗号化後の文字列を、menu.lstファイルのグローバルセクションに貼り付けます。
gfxmenu (hd0,4)/message color white/blue black/light-gray default 0 timeout 8 password --md5 $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
これで、ブートプロンプトからGRUBコマンドを実行するには、先にPキーを押してパスワードを入力する操作が必要になります。しかし、ユーザはブートメニューから引き続き任意のオペレーティングシステムをブートすることができます。
ブートメニューから1つまたは複数のオペレーティングシステムをブートする操作を禁止するには、menu.lst内で、パスワードを入力しなければブートできないようにする必要のある各セクションにエントリlockを追加します。次に例を示します。
title linux kernel (hd0,4)/vmlinuz root=/dev/hda7 vga=791 initrd (hd0,4)/initrd lock
システムをリブートしてブートメニューからLinuxエントリを選択すると、次のエラーメッセージが表示されます。
Error 32: Must be authenticated
Enterキーを押してメニューを表示します。次に、Pキーを押してパスワードプロンプトを表示します。パスワードを入力してEnterキーを押すと、選択したオペレーティングシステム(この場合はLinux)がブートします。