GRUB(Grand Unified Bootloader)は、2つのステージから成り立っています。stage1は512バイトで構成され、そのタスクは、ブートローダのstage2をロードすることだけです。その後、stage2が読み込まれます。このステージにいは、ブートローダの主要部分が含まれています。
一部の設定では、適切なファイルシステムからステージ2を検出し、ロードする中間ステージの1.5を使用できます。可能であれば、デフォルトでインストール時、またはYaSTを使用したGRUBの初回セットアップ時に、こ
stage2は、多くのファイルシステムにアクセスできます。現在、Windowsで使用されているExt2、Ext3、ReiserFS、Minix、およびDOS FATファイルシステムがサポートされます。BSDシステムで使用されているXFS、UFS、およびFFSも、特定の範囲までサポートされます。バージョン 0.95以降のGRUBには、El Torito
仕様に準拠するISO 9660標準ファイルシステムを含むCDまたはDVDからブートする機能も用意されています。システムをブートする前にも、GRUBはサポートされているBIOSディスクデバイス(BIOSにより検出されるフロッピーディスクまたはハードディスク、CDドライブ、およびDVDドライブ)のファイルシステムにアクセスできます。したがって、GRUBの設定ファイル(menu.lst)を変更しても、ブートマネージャを新たにインストールする必要はありません。システムをブートすると、GRUBはメニューファイルと共にカーネルまたは初期RAMディスク(initrd)の有効なパスとパーティションデータを再読み込みし、これらのファイルを検索します。
GRUBの実際の設定は、以下の3つのファイルに基づきます。
このファイルには、GRUBでブートできるパーティションまたはオペレーティングシステムに関する情報がすべて含まれています。この情報がない場合、GRUBコマンドラインは、どのように処理を続行するかユーザの指示を求めます(詳細については、「ブート手順実行中のメニューエントリの編集」を参照してください)。
このファイルは、デバイス名をGRUBとBIOSの表記法からLinuxデバイス名に変換するために使います。
このファイルには、GRUBシェルでブートローダを正常にインストールするために必要なコマンド、パラメータおよびオプションが含まれています。
GRUBは、さまざまな方法で制御できます。グラフィカルメニュー(スプラッシュ画面)を使用して、既存の設定からブートエントリを選択できます。設定は、ファイルmenu.lstから読み込まれます。
GRUBでは、すべてのブートパラメータをブート前に変更できます。たとえば、メニューファイルを間違って編集した場合は、この方法で訂正できます。また、一種の入力プロンプトからブートコマンドを対話形式で入力することもできます(「ブート手順実行中のメニューエントリの編集」を参照してください)。GRUBには、ブート前にカーネルとinitrdの位置を判別する機能が用意されています。この機能を使用すると、ブートローダ設定にエントリが存在しないインストール済みオペレーティングシステムでもブートできます。
GRUBは、2種類のバージョンで存在します。ブートローダとして、または/usr/sbin/grub中のLinuxプログラムとしてです。このプログラムをGRUBシェルと呼びます。GRUBシェルは、インストールされたシステムにGRUBのエミュレーションを提供し、GRUBのインストールまたは新規設定の適用前のテストに使用できます。ハードディスクやフロッピーディスクにGRUBをブートローダとしてインストールする機能は、installコマンドとsetupコマンドの形でGRUBに組み込まれています。この機能は、Linuxの読み込み時にGRUBシェル内で使用できます。
device.mapファイルは、GRUBおよびBIOSのデバイス名をLinuxのデバイス名にマップします。IDEとSCSIの各ハードディスクが混在するシステムでは、GRUBは特殊プロシージャを使用してブートシーケンスの判定を試みる必要があります。これは、GRUBはBIOSのブートシーケンス情報にアクセスできない場合があるためです。GRUBはこの分析の結果をファイル/boot/grub/device.mapに保存します。BIOS内でブートシーケンスがIDE、SCSIの順に設定されているシステムの場合、ファイルdevice.mapは次のようになります。
(fd0) /dev/fd0 (hd0) /dev/sda (hd1) /dev/sdb
IDE、SCSI、および他のハードディスクのシーケンス(順序)は、さまざまな要因によって異なり、Linuxではマッピングを識別できないため、device.mapファイル内のシーケンスは手動で設定できます。ブート時に問題に直面した場合、このファイル内のシーケンスが、BIOS内のシーケンスに対応しているかどうかチェックします。さらに、必要に応じてGRUBは、前者を一時的に変更するように指示します。Linuxシステムのブート後に、YaSTブートローダモジュールまたは好みのエディタを使用して、device.mapファイルを永続的に変更できます。
メモ: ハードディスクの最大数
GRUBは、ハードディスクのアドレス指定にBIOSサービスを使用します。これには、ソフトウェア割り込みInt13hが使用されます。Int13hは最大8ディスクしか操作できないので、9ディスク以上存在する場合でも(マルチパスシステムではよくある事例)、GRUBは、Int13hが操作するディスクからしかブートできません。したがって、インストール時に作成されたdevice.mapファイルは、Int13hで操作された最大8つのディスクしか含みません。
device.mapを手動で編集した後、次のコマンドを実行してGRUBを再インストールします。このコマンドにより、device.mapファイルが再読み込みされ、grub.confに指定されているコマンドが実行されます。
grub --batch < /etc/grub.conf
menu.lstおよびdevice.mapの次に重要な第3のGRUB設定ファイルは、/etc/grub.confです。このファイルには、GRUBシェルでブートローダを正常にインストールするために必要なコマンド、パラメータおよびオプションが含まれています。
setup --stage2=/boot/grub/stage2 --force-lba (hd0,1) (hd0,1) quit
このコマンドは、同じパーティションに存在するブートイメージを使用して、最初のハードディスク(hd0,1)の第2パーティションにブートローダを自動的にインストールするようにGRUBに指示します。マウントされたファイルシステムからstage2イメージをインストールするには、--stage2=/boot/grub/stage2パラメータが必要です。一部のBIOSは、LBAサポート実装に欠陥があります。これを無視する解決策として、--force-lbaを使用します。
オペレーティングシステムのブート前でも、GRUBはファイルシステムへのアクセスを可能にします。rootパーミッションを持たないユーザは、システムのブート後、アクセス権のないLinuxシステム上のファイルにアクセスできます。この種のアクセスを阻止したり、ユーザによる特定のオペレーティングシステムのブートを防止するために、ブートパスワードを設定できます。
重要: ブートパスワードとスプラッシュ画面
GRUBにブートパスワードを使用する場合、通常のスプラッシュ画面は表示されません。
ユーザrootとして、次の手順に従ってブートパスワードを設定します。
rootプロンプトで、grub-md5-cryptを使ってパスワードを暗号化します。
# grub-md5-crypt Password: **** Retype 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/sda7 vga=791 initrd (hd0,4)/initrd lock
システムをリブートしてブートメニューからLinuxエントリを選択すると、次のエラーメッセージが表示されます。
Error 32: Must be authenticated
<Enter>キーを押してメニューを表示します。次に、<P>キーを押してパスワードプロンプトを表示します。パスワードを入力して<Enter>キーを押すと、選択したオペレーティングシステム(この場合はLinux)がブートします。