なぜブートローダの「インストール」が必要なのか

ブートローダ(GRUB 2等)は、単に設定ファイルを置くだけでは動作しません。ファームウェア(BIOS/UEFI)がブートローダを見つけて実行できるよう、起動方式に応じた場所・形式でブートローダ本体を配置する必要があります。この作業を行うのがgrub-installコマンドです。

MBR方式でのインストール

MBR形式のパーティションテーブル(Master Boot Record)は、伝統的なBIOS環境で使われるパーティションテーブル形式です。

MBRはディスク先頭の512バイトの領域で、主に次の情報を格納します。

領域サイズ内容
ブートコード領域446バイトブートローダの起動コード
パーティションテーブル64バイト4個のパーティションエントリ
ブートシグネチャ2バイトMBRが有効であることを示す値(0x55AA)

基本パーティションと拡張パーティション

MBRのパーティションテーブルには、パーティション情報を格納するエントリが4個しかありません。そのため、ディスク上に直接作成できる基本パーティション(Primary Partition)は最大4個です。

Linuxでは、基本パーティションには通常、次のようなデバイスファイル名が割り当てられます。

/dev/sda1
/dev/sda2
/dev/sda3
/dev/sda4

4個を超えるパーティションが必要な場合は、基本パーティションの1つを拡張パーティション(Extended Partition)として作成します。拡張パーティションは、ファイルシステムを直接作成して利用する通常のパーティションではなく、内部に論理パーティション(Logical Partition)を格納するための入れ物です。

論理パーティションの番号は通常、基本パーティションや拡張パーティションの使用数にかかわらず、5番から始まります。

/dev/sda1    基本パーティション
/dev/sda2    基本パーティション
/dev/sda3    拡張パーティション
/dev/sda5    拡張パーティション内の論理パーティション
/dev/sda6    拡張パーティション内の論理パーティション

MBRにおける主な制限は次のとおりです。

  • 基本パーティションは最大4個
  • 拡張パーティションは基本パーティションの1つとして数えられる
  • 拡張パーティションは1つのディスクに通常1個だけ作成する
  • 拡張パーティション内には複数の論理パーティションを作成できる
  • 一般的な512バイトセクタ環境では、扱えるディスク容量は約2TiBまで

構成例を図にすると、次のようになります。

ディスク /dev/sda
├─ /dev/sda1  基本パーティション
├─ /dev/sda2  基本パーティション
└─ /dev/sda3  拡張パーティション
   ├─ /dev/sda5  論理パーティション
   └─ /dev/sda6  論理パーティション

GRUBの配置

GRUB 2のような高機能なブートローダは、MBRの446バイトのブートコード領域だけには収まりません。そのため、MBRには最小限の起動コード(Stage 1に相当する部分)だけを配置します。

十分な連続未使用領域がある場合、GRUB 2の本体に相当するcore.imgは、MBRと最初のパーティションの間にあるMBRギャップ(BIOS Boot領域、embedding areaとも呼ばれる領域)へ配置されます。その後、core.imgが通常/boot/grub以下にあるGRUBのモジュールや設定ファイルを読み込みます。

ディスク先頭
│
├─ MBR
│  ├─ 最小限のGRUB起動コード
│  ├─ パーティションテーブル
│  └─ ブートシグネチャ
│
├─ MBRギャップ
│  └─ GRUB 2のcore.img
│
└─ 最初のパーティション
   └─ /boot/grub など

BIOS/MBR環境でGRUB 2をインストールする場合は、次のように実行します。

grub-install --target=i386-pc /dev/sda

ここで、--target=i386-pcは32ビットOS専用という意味ではなく、BIOS起動用のGRUBをインストールするためのターゲット名です。64ビット版Linuxでも、BIOS方式で起動する場合は通常i386-pcを指定します。

注意

BIOS/MBR環境では、パーティション(/dev/sda1など)ではなく、ディスク全体(/dev/sda)を指定してGRUBをインストールするのが基本です。MBRは各パーティションの先頭ではなく、ディスク全体の先頭に存在するためです。

GPT方式でのインストール

GPT(GUID Partition Table)は、MBRより新しいパーティションテーブル形式で、UEFI環境で一般的に使われますパーティション設計全般(MBR/GPT、ESP等)については「ハードディスクのレイアウト設計」の技術解説記事でも扱っています。[1]。

MBRでは、1台のディスクに作成できる基本パーティションは最大4個に制限され、それ以上必要な場合は拡張パーティションと論理パーティションを使用します。一方、GPTにはこの区別がなく、一般的な構成では1台のディスクに最大128個のパーティションを作成できます。なお、128個という数はGPTの仕様上の絶対的な上限ではなく、標準的なパーティションエントリ領域を使用した場合の一般的な上限です。

GPTでは、ディスクの先頭付近にあるプライマリGPTヘッダーとパーティションエントリに加えて、ディスク末尾にもバックアップGPTヘッダーとパーティションエントリの複製が標準で配置されます。この冗長構成により、片方のパーティションテーブルが破損した場合でも、もう片方を利用して復旧できる可能性があります。

GPTディスクのおもな構造は、次のとおりです。

  1. 保護MBR(Protective MBR)
  2. プライマリGPTヘッダー
  3. プライマリ・パーティションエントリ
  4. 各パーティションの領域
  5. バックアップ・パーティションエントリ
  6. バックアップGPTヘッダー

保護MBRは、GPTに対応していない古いツールがディスクを未使用と誤認し、上書きすることを防ぐために配置されます。

GPTでは保護MBRの直後にGPTヘッダーとパーティションエントリが配置されるため、BIOS版GRUB 2は、MBR方式のようにMBR直後の未使用領域への埋め込みを利用しません。GPTをBIOSで起動する場合は、BIOS bootパーティションを使用します。

GPT+BIOSの組み合わせ:BIOS bootパーティション

GPTでパーティション分割されたディスクを、UEFIではなく従来のBIOSファームウェアで起動したい場合、GRUB 2の本体コードを格納するための領域が必要です。この目的で用意するのが、BIOS bootパーティションです。

BIOS bootパーティションは、GPTでBIOS boot用のパーティション種別に設定された、ファイルシステムを持たない小さな専用パーティションです。partedなどでは、通常、bios_grubフラグを設定します。サイズは1MiB程度が一般的で、GRUB 2の本体コードを格納するために使用されます。

環境の組み合わせブートローダーの格納先
BIOS+MBRMBR+MBRギャップ
BIOS+GPT保護MBRの起動コード+BIOS bootパーティション
UEFI+GPTEFIシステムパーティション(ESP、通常はFAT32)
UEFI+MBREFIシステムパーティション(ESP、通常はFAT32)

UEFI環境でのインストール

UEFI環境では、GRUB 2は実行可能な.efiファイルとして、EFIシステムパーティション(ESP)に配置されます。ESPにはFAT形式のファイルシステムが使用され、通常はFAT32でフォーマットされます。

grub-installの実行時には、対象プラットフォームとESPのマウント先を指定します。たとえば、64ビットUEFI環境では、次のように実行します。

grub-install --target=x86_64-efi --efi-directory=/boot/efi
  • --target=x86_64-efi:64ビットUEFI向けのGRUBを指定
  • --efi-directory=/boot/efi:ESPのマウント先を指定

UEFI環境では、BIOS環境と異なり、インストール先としてディスクデバイスではなくESPのマウントポイントを指定する点が重要です。

UEFIファームウェアは通常、NVRAMに登録されたブートエントリを基に、ESP内のブートローダーの.efiファイルを読み込んで実行します。UEFIモードでgrub-installを実行すると、通常はこのブートエントリも登録されます。そのため、BIOS環境のように、MBRギャップへGRUB 2の本体コードを埋め込む仕組みは不要です。

GPTの主な特徴

  • UEFI環境で一般的に使用される
  • 従来のMBR方式における約2TiBの容量制限を超える大容量ディスクを扱える
  • 基本パーティション、拡張パーティション、論理パーティションという区別がない
  • 一般的な構成では、1台のディスクに最大128個のパーティションを作成できる
  • ディスク先頭のプライマリGPTとディスク末尾のバックアップGPTを持つ
  • GPTヘッダーとパーティションエントリが冗長化されており、破損時に復旧できる可能性がある
  • GPT非対応ツールによる誤操作を防ぐため、ディスク先頭に保護MBRを持つ
  • BIOSから起動する場合はBIOS bootパーティションが必要
  • UEFIから起動する場合はEFIシステムパーティション(ESP)を使用する

grub-installの主なオプション

オプション効果
--target=プラットフォームインストール対象のプラットフォームを指定する(i386-pc=BIOS、x86_64-efi=64ビットUEFI)
--boot-directory=ディレクトリGRUBの各種イメージファイルをディレクトリ/grubに格納するための親ディレクトリを指定する(既定は/bootで、格納先は/boot/grub)
--efi-directory=ディレクトリESPのマウント先を指定する(UEFI環境のみ)
--removableリムーバブルメディア(USBメモリ等)向けの既定のパス(/EFI/BOOT/BOOTX64.EFI等)にインストールする(UEFI環境のみ)。通常はNVRAMのブートエントリを登録しない。

バックアップ用のブートオプションを用意する

出題範囲では、「代替のブート場所とバックアップ用のブートオプションの提供」も求められています。例えば、BIOS環境ではシステムディスクとは別のディスクのブート領域にもブートローダをインストールしておく、UEFI環境では別のディスク上のESPにもブートローダを配置しておく、あるいはリムーバブルメディア(USBメモリ等)にブート可能な環境を用意しておくことで、システムディスクのブートローダが破損した場合でも、代替の手段からシステムを起動・修復できるようにする、という考え方です。


補足

  1. パーティション設計全般(MBR/GPT、ESP等)については「ハードディスクのレイアウト設計」の技術解説記事でも扱っています。 ↩