9.2 GRUBによるブート

GRUB (Grand Unified Bootloader)は、2つのステージで構成されています。stage1は、512バイトで構成され、そのタスクは、ブートローダの第2ステージをロードすることだけです。その後、stage2が読み込まれます。このステージにいは、ブートローダの主要部分が含まれています。

一部の設定では、適切なファイルシステムからステージ2を検出し、ロードする中間ステージの1.5を使用できます。可能であれば、デフォルトでインストール時、またはYaSTを使用したGRUBの初回セットアップ時に、この方法が選択されます。

stage2は、多くのファイルシステムにアクセスできます。現在、Windowsで使用されているExt2、Ext3、ReiserFS、Minix、およびDOS FATファイルシステムがサポートされます。BSDシステムで使用されているJFS、XFS、UFS、およびFFSも、特定の範囲までサポートされます。バージョン0.95以降のには、「El Torito」仕様に準拠するISO 9660標準ファイルシステムを含むCDまたはDVDからブートする機能も用意されています。システムをブートする前にも、はサポートされているBIOSディスクデバイス(BIOSにより検出されるフロッピーディスクまたはハードディスク、CDドライブ、およびDVDドライブ)のファイルシステムにアクセスできます。したがって、GRUBの設定ファイル(menu.lst)を変更しても、ブートマネージャを再インストールする必要はありません。システムをブートすると、はメニューファイルと共にカーネルまたは初期RAMディスク(initrd)の有効なパスとパーティションデータを再読み込みし、これらのファイルを検索します。

GRUBの実際の設定は、以下の3つのファイルに基づきます。

/boot/grub/menu.lst

このファイルには、でブートできるパーティションまたはオペレーティングシステムに関する情報がすべて含まれています。この情報がない場合、GRUBコマンドラインは、どのように処理を続行するかユーザの指示を求めます(詳細については、9.2.1.3項 「ブート手順実行中のメニューエントリの編集」を参照)。

/boot/grub/device.map

このファイルは、デバイス名をGRUBとBIOSの表記法からLinuxデバイス名に変換するために使います。

/etc/grub.conf

このファイルには、シェルでブートローダを正常にインストールするために必要なコマンド、パラメータおよびオプションが含まれています。

GRUBは、さまざまな方法で制御できます。グラフィカルメニュー(スプラッシュ画面)を使用して、既存の設定からブートエントリを選択できます。設定は、ファイルmenu.lstから読み込まれます。

GRUBでは、すべてのブートパラメータをブート前に変更できます。たとえば、メニューファイルを間違って編集した場合は、この方法で訂正できます。また、一種の入力プロンプトからブートコマンドを対話形式で入力することもできます(9.2.1.3項 「ブート手順実行中のメニューエントリの編集」を参照)。には、ブート前にカーネルとinitrdの位置を判別する機能が用意されています。この機能を使用すると、ブートローダ設定にエントリが存在しないインストール済みオペレーティングシステムでもブートできます。

GRUBは実際には2つのバージョンがあります。ブートローダと、/usr/sbin/grubにある通常のLinuxプログラムです。このプログラムをGRUBシェルと呼びます。GRUBシェルは、インストールされたシステムにGRUBのエミュレーションを提供し、GRUBのインストールまたは新規設定の適用前のテストに使用できます。ハードディスクやフロッピーディスクにGRUBをブートローダとしてインストールする機能は、installコマンドとsetupコマンドの形でGRUBに組み込まれています。この機能は、Linuxの読み込み時にGRUBシェル内で使用できます。

9.2.1 GRUBのブートメニュー

ブートメニューを含むグラフィカルスプラッシュ画面は、GRUBの設定ファイル/boot/grub/menu.lstに基づいており、このファイルにはメニューを使用してブートできるパーティションまたはオペレーティングシステムに関する情報がすべて含まれています。

システムをブートするたびに、はファイルシステムからメニューファイルを読み込みます。このため、ファイルを変更するたびにを再インストールする必要がありません。9.3項 「YaSTによるブートローダの設定」で説明しているように、YaSTのブートローダを使用してGRUBの設定を変更します。

メニューファイルにはコマンドが含まれています。構文はきわめて単純です。各行には、コマンド1つとオプションのパラメータがシェルと同様にスペースで区切って指定されています。これまでの経緯が理由で、一部のコマンドでは最初の引数の前に等号(=)を使用することができます。コメントを記述するには、行頭にシャープ記号(#)を入力します。

メニュー概要の中にあるメニュー項目を識別できるように、各エントリに対してtitle (タイトル)を設定します。キーワードtitleの後に続くテキスト(半角スペースも使用できます)は、メニューの中で、選択可能なオプションとして表示されます。そのメニュー項目が表示された場合、次のtitleまでに記述されているすべてのコマンドが実行されます。

最も簡単な例は、他のオペレーティングシステムのブートローダにリダイレクトすることです。該当するコマンドはchainloaderであり、引数は通常、他のパーティション内にあるブートブロックをのブロック表記に従って記述したものです。次に例を示します。

chainloader (hd0,3)+1

GRUBでのデバイス名については、9.2.1.1項 「ハードディスクとパーティションに関する命名規則」を参照してください。この例では、1台目のハードディスクの4番目のパーティションの最初のブロックを指定しています。

カーネルイメージを指定するには、kernelコマンドを使用します。最初の引数は、パーティションにあるカーネルイメージを表すパスです。他の引数は、そのコマンドラインでカーネルに渡されます。

ルートパーティションへのアクセスに必要なビルトインドライバがカーネルに用意されていない場合、または高度なhotplug機能のある新しいLinuxシステムが使用されていない場合は、initrdファイルへのパスを示す引数だけを指定して、別のGRUBコマンドでinitrdを指定する必要があります。initrdの読み込みアドレスは、読み込まれるカーネルイメージに書き込まれているので、initrdコマンドは、kernelコマンドの直後に記述する必要があります。

rootコマンドは、kernelとinitrdの各ファイルの指定を簡略化します。root の引数は、デバイスまたはパーティションだけです。このデバイスは、すべてのカーネル、initrd、または次のrootコマンドまでデバイスが明示的に指定されていない他のファイルのパスに使用されます。

bootコマンドは各メニューエントリの最後に必ず含まれています。そのため、メニューファイルにこのコマンドを記述する必要はありません。ただし、をブート時に対話形式で使用する場合は、bootコマンドを最後に入力する必要があります。このコマンド自体は、引数を使用しません。単純に、読み込み済みのカーネルイメージ、または指定のチェーンローダをブートします。

すべてのメニューエントリを記述した後、その1つをdefaultエントリとして定義します。デフォルトエントリを指定しなかった場合、最初のエントリ(エントリ0)が使用されます。デフォルトエントリがブートされるまでのタイムアウトを秒単位で指定することもできます。通常、timeout および default は、メニューエントリより先に記述します。サンプルファイルについては、9.2.1.2項 「メニューファイルの例」を参照してください。

9.2.1.1 ハードディスクとパーティションに関する命名規則

でのハードディスクとパーティションの命名規則は、通常のLinuxデバイスの命名規則と異なっています。GRUBでは、パーティション番号は0から始まります。これは、(hd0,0) は最初のハードディスクの最初のパーティションになります。ハードディスクがプライマリマスタとして接続されている一般的なデスクトップマシンでは、対応するLinuxデバイス名は/dev/hda1になります。

可能な4つの基本パーティションに、パーティション番号03が割り当てられます。論理パーティション番号は4から始まります。

(hd0,0)   最初のハードディスクの最初の基本パーティション
(hd0,1)   2番目の基本パーティション
(hd0,2)   3番目の基本パーティション
(hd0,3)   4番目の基本パーティション(通常は拡張パーティション) 
(hd0,4)   最初の論理パーティション
(hd0,5)   2番目の論理パーティション
    

GRUBは、BIOSデバイスに依存するため、IDE、SATA、SCSIおよびハードウェアRAIDデバイス間を区別しません。BIOSまたは他のディスクコントローラで認識されるすべてのハードディスクには、BIOSの中で事前に設定されたブートシーケンスに従って番号が割り当てられます。

一般に、GRUBには、Linuxデバイス名をBIOSデバイス名に正確にマップする機能がありません。このマッピングはアルゴリズムを使用して生成され、device.map ファイルに保存されるため、必要に応じて編集できます。ファイルdevice.mapについては、9.2.2項 「device.mapファイル」を参照してください。

のフルパスは、カッコ内のデバイス名と、指定のパーティションにあるファイルシステム内のファイルへのパスで構成されます。このパスはスラッシュで始まります。たとえば、単一IDEハードディスクの最初のパーティションにLinuxを含んでいるシステムでは、ブート可能カーネルを次のように指定できます。

(hd0,0)/boot/vmlinuz

9.2.1.2 メニューファイルの例

次の例は、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
    

最初のブロックは、スプラッシュ画面の設定を定義します。

gfxmenu (hd0,4)/message

背景画像messageは、/dev/hda5にあります。

color white/blue black/light-gray

配色は、白(前景色)、青(背景色)、黒(選択項目)、明るい灰色(選択項目の背景色)です。配色はスプラッシュ画面には影響しません。影響を受けるのは、Escキーを押してスプラッシュ画面を終了するとアクセスできるカスタマイズ可能なメニューだけです。

default 0

最初のメニューエントリtitle linuxは、デフォルトでのブート対象です。

timeout 8

ユーザ入力がないまま8秒が経過した場合、GRUBは自動的にデフォルトエントリをブートします。自動ブートを無効にするには、timeoutの行を削除します。timeout 0と設定すると、GRUBは待ち時間なしでデフォルトのエントリをブートします。

2番目の(最大)ブロックは、ブート可能な各種オペレーティングシステムを示します。個々のオペレーティングシステムに関するセクションはtitleで始まります。

  • 最初のエントリ(title linux)は、SUSE Linuxをブートする役割を果たします。カーネル(vmlinuz)は、1台目のハードディスクの最初の論理パーティション(ブートパーティション)内に配置されています。ルートパーティションやVGAモードなどのカーネルパーティションは、ここに追加されます。ルートパーティションは、Linuxの命名規則に従って指定されたものです(/dev/hda7)。この情報を読み込むのはLinuxカーネルであり、は関係しないからです。initrdも、1台目のハードディスクの最初の論理パーティション内に配置されています。

  • 第2のエントリは、Windowsを読み込む役割を果たします。Windowsは、1台目のハードディスク(hd0,0)の最初のパーティションからブートされます。chainloader +1コマンドは、指定されたパーティションの最初のセクタを読み取って実行するように指示します。

  • 次のエントリは、BIOS設定を変更することなく、フロッピーディスクからブートすることを可能にします。

  • ブートオプションfailsafeは、問題のあるシステム上でもLinuxのブートを可能にするカーネルパラメータを選択してLinuxを起動します。

メニューファイルは必要に応じて変更できます。その場合、GRUBは変更後の設定を次回のブート時に使用します。このファイルを永続的に編集するには、YaSTまたは好みのエディタを使用します。また、対話形式で一時的に変更するには、GRUBの編集機能を使用します。9.2.1.3項 「ブート手順実行中のメニューエントリの編集」を参照してください。

9.2.1.3 ブート手順実行中のメニューエントリの編集

グラフィカルブートメニューでは、ブートするオペレーティングシステムを矢印キーで選択します。Linuxシステムを選択した場合は、ブートプロンプトからブートパラメータを追加入力できます。個々のメニューエントリを直接編集するには、Escキーを押してスプラッシュ画面を終了し、GRUBテキストベースメニューを表示してからEキーを押します。この方法で加えた変更は、現在のブートだけに適用され、永続的に採用されることはありません。

[Important]ブート手順実行中のキーボードレイアウト

ブート時は、USキーボードレイアウトだけが使用可能です。

メニューエントリの編集により、障害が発生してブートできなくなったシステムを容易に修復できます。 これは、ブートローダの設定ファイルの誤りをパラメータの手動入力により回避できるからです。ブート手順の中でパラメータを手動で入力する方法は、ネイティブシステムを損傷せずに新規設定をテストする際にも役立ちます。

編集モードを有効にした後、矢印キーを使用して、設定を編集するメニューエントリを選択します。設定を編集可能にするには、もう一度Eキーを押します。このようにして、不正なパーティションまたはパス指定を、ブートプロセスに悪影響を及ぼす前に編集します。Enterキーを押して編集モードを終了し、メニューに戻ります。次に、Bキーを押してこのエントリをブートします。下部のヘルプテキストに、さらに可能なアクションが表示されます。

変更後のブートオプションを永続的に入力してカーネルに渡すには、ユーザのrootでファイルmenu.lstを開き、関連カーネルパラメータをスペースで区切って既存の行に追加します。

title linux
   kernel (hd0,0)/vmlinuz root=/dev/hda3 additional parameter
   initrd (hd0,0)/initrd
    

GRUBは、次回のシステムブート時に新規パラメータを自動的に使用します。または、この変更をYaSTのブートローダモジュールで行うこともできます。新規パラメータをスペースで区切って既存の行に追加します。

9.2.2 device.mapファイル

device.mapファイルは、GRUBおよびBIOSのデバイス名をLinuxのデバイス名にマップします。IDEとSCSIの各ハードディスクが混在するシステムでは、GRUBは特殊プロシージャを使用してブートシーケンスの判定を試みる必要があります。これは、GRUBはBIOSのブートシーケンス情報にアクセスできない場合があるためです。はこの分析の結果をファイル/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は、前者を一時的に変更するように指示します。Linuxシステムのブート後に、YaSTブートローダモジュールまたは好みのエディタを使用して、device.mapファイルを永続的に変更できます。

[Important]SATAディスク

コントローラによっては、SATAディスクはIDE (/dev/hdx)か、SCSI (/dev/sdx)のいずれのデバイスとして認識されます。

device.mapを手動で編集した後、次のコマンドを実行してGRUBを再インストールします。このコマンドにより、device.mapファイルが再読み込みされ、grub.confに指定されているコマンドが実行されます。

grub --batch < /etc/grub.conf

9.2.3 /etc/grub.confファイル

menu.lstおよびdevice.mapの次に重要な第3の設定ファイルは、/etc/grub.confです。このファイルには、シェルでブートローダを正常にインストールするために必要なコマンド、パラメータおよびオプションが含まれています。

root (hd0,4)
   install /grub/stage1 (hd0,3) /grub/stage2 0x8000 (hd0,4)/grub/menu.lst
   quit
   

各エントリの意味:

root (hd0,4)

このコマンドは、に対して後続のコマンドを1台目のハードディスクの最初の論理パーティション(ブートファイルの位置)に適用するように指示します。

installパラメータ

grubコマンドは、installパラメータを指定して実行する必要があります。ブートローダのstage1は、拡張されたパーティションコンテナ(/grub/stage1 (hd0,3))内にインストールする必要があります。stage2 は、メモリアドレス 0x8000 にロードする必要があります (/grub/stage2 0x8000)。最後のエントリ((hd0,4)/grub/menu.lst)は、メニューファイルを探す場所をに伝えます。

9.2.4 ブートパスワードの設定

オペレーティングシステムのブート前でも、GRUBはファイルシステムへのアクセスを可能にします。rootパーミッションを持たないユーザは、システムのブート後、アクセス権のないLinuxシステム上のファイルにアクセスできます。この種のアクセスを阻止したり、ユーザによる特定のオペレーティングシステムのブートを防止するために、ブートパスワードを設定できます。

[Important]ブートパスワードとスプラッシュ画面

にブートパスワードを使用する場合、通常のスプラッシュ画面は表示されません。

ユーザrootとして、次の手順に従ってブートパスワードを設定します。

  1. rootプロンプトで、grubと入力します。

  2. GRUBシェル内でパスワードを暗号化します。

    grub> md5crypt
    Password: ****
    Encrypted: $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
  3. 暗号化後の文字列を、menu.lstファイルのグローバルセクションに貼り付けます。

    gfxmenu (hd0,4)/message
    color white/blue black/light-gray
    default 0
    timeout 8
    password --md5 $1$lS2dv/$JOYcdxIn7CJk9xShzzJVw/
         

    これで、ブートプロンプトからコマンドを実行するには、先にPキーを押してパスワードを入力する操作が必要になります。しかし、ユーザはブートメニューから引き続き任意のオペレーティングシステムをブートすることができます。

  4. ブートメニューから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)がブートします。