MBR(bios)でもESP(uefi)でも起動できるgrub2の設定方法

Linuxを起動する方法はたくさんあります.本エントリでは

  • MBR (Master Boot Record)にインストールした grub2 を使う方法
  • ESP(Efi System Partition)にインストールした grub2 を使う方法

の2つを共存させたディスクを作成する方法についてまとめます

前者は,従来のBIOS経由での起動方法で,古いマザーボードだと必須となる方法です.後者は,EFI経由の起動方法で,最近のマーザーボードで使える"新しくて便利な"方法となります.

具体的な手順について

以下,実例として

  • 新品のSSDを用意
  • 既存のシステムを新品のSSDにコピー
  • OSは debianubuntu や cent OS などでも同じ手順で作業できるはずです)

の場合について手順を詳細に説明します

SSDは64GB で /dev/sdb に繋いであるものとします

なお既存のディスクを MBR/ESP両対応に変換する手順については,後日別エントリに書く予定です.

事前準備

事前知識として

  • MBRを使う場合は,ディスクの先頭に1MB程度の領域を確保しておいて,そこに grub2を入れる事
  • ESPを使う場合は,ディクスのパーティションテーブルを GPT という形式で設定する事
  • ESPは FAT32 または FAT16でフォーマットする事

という条件があります

そこで,予め gptを使うために gdisk, fat でフォーマットするので dosfstools をインストールしておきます

$ sudo apt-get install gdisk dosfstools

grub-efi をインストールしておきます

$ sudo apt-get install grub-efi
gdisk を使ったパーティション設定

gdisk で

sudo /sbin/gdisk /dev/sdb

次のように表示されます

GPT fdisk (gdisk) version 1.0.1

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help):

未初期化のSSDなのでパーティションテーブルがありません


まず expert モードに遷移,sector alignment value を 1に変更します

Command (? for help): x

Expert command (? for help): l

Enter the sector alignment value (1-65536, default = 2048): 1

Expert command (? for help): m

Command (? for help):

各コマンドを説明すると,

  • まず"x"でexpertモードに突入
  • "l"でsector alignment value の変更
  • 値を1 に設定
  • "m"で元のモードに戻る

となります

続いて第一パーティションを作成します.このパーティションMBRgrub が使う領域になります

Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-125045390, default = 34) or {+-}size{KMGTP}:  34
Last sector (34-125045390, default = 125045390) or {+-}size{KMGTP}: 2047
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF02
Changed type of partition to 'BIOS boot partition'

各コマンドを説明すると,

と設定しています.これで "BIOS boot partition" が作成されます

念の為,"p"コマンドでパーティションテーブルを表示させて,状態を確認します

Command (? for help): p
Disk /dev/sdb: 125045424 sectors, 59.6 GiB
Logical sector size: 512 bytes
Disk identifier (GUID):XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 125045390
Partitions will be aligned on 1-sector boundaries
Total free space is 125043343 sectors (59.6 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              34            2047   1007.0 KiB  EF02  BIOS boot partition


Command (? for help):

34セクタから2047セクタに EF02 で BIOS boot parttion が作成されていることが確認できます

うまく行ったら sector alignment value を 2048 に戻します

Command (? for help): x

Expert command (? for help): l
Enter the sector alignment value (1-65536, default = 2048): 2048

Expert command (? for help): m

Command (? for help):
  • "x"でexportモードに突入
  • "l"でsector alignment value の変更
  • 値を 2048 に設定
  • "m"で元のモードに戻る

となります

次に EFI System パーティションを作成します

Command (? for help): n
Partition number (2-128, default 2): 2
First sector (2048-125045390, default = 2048) or {+-}size{KMGTP}: 2048
Last sector (2048-125045390, default = 125045390) or {+-}size{KMGTP}: 256M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to 'EFI System'

と設定します.これで "EFI System" パーティションが作成されました

続けて Linux 用のパーティションを作成します.今回はディスクの残りの領域をすべて "/" パーティションに割り当てることにします

Command (? for help): n
Partition number (3-128, default 3): 
First sector (524289-125045390, default = 526336) or {+-}size{KMGTP}: 
Last sector (526336-125045390, default = 125045390) or {+-}size{KMGTP}: 
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

となっています

最後に "p" でパーティション情報を表示させます

Command (? for help): p
Disk /dev/sdb: 125045424 sectors, 59.6 GiB
Logical sector size: 512 bytes
Disk identifier (GUID):XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 125045390
Partitions will be aligned on 2048-sector boundaries
Total free space is 2047 sectors (1023.5 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              34            2047   1007.0 KiB  EF02  BIOS boot partition
   2            2048          524288   255.0 MiB   EF00  EFI System
   3          526336       125045390   59.4 GiB    8300  Linux filesystem

問題なければ "w" でパーティション情報をディスクに書き込みます

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdb.

問題なければ "Y" を押します."Y"を押すまではディスクには何も書き込まれないので,不安だったら
Ctrk-C とか "N" を押せば変更はキャンセルできます


パーティションのフォーマット


再度パーティションを確認します

$ sudo /sbin/gdisk  -l /dev/sdb
Number  Start (sector)    End (sector)  Size       Code  Name
   1              34            2047   1007.0 KiB  EF02  BIOS boot partition
   2            2048          526335   256.0 MiB   EF00  EFI System
   3          526336       125045390   59.4 GiB    8300  Linux filesystem

第1パーティションのフォーマットは不要です.grubが直接セクタを書き換えるためです

第2パーティション /dev/sdb2 は vfat 32 でフォーマットします.これはEFIのルールです

$ sudo /sbin/mkfs.vfat -F32 /dev/sdb2 

第3パーティション /dev/sdb3 は ext4 でフォーマットしました

$ sudo /sbin/mkfs.ext4  /dev/sdb3

第三パーティションはディスクラベルも指定しておきます.ラベルは"ROOT"にします

$ sudo /sbin/e2label /dev/sdb3 ROOT

今時のLinuxはUUIDでパーティションを特定しますが,私は必ずラベルを設定するようにしています.
なぜなら,サーバ障害時などの緊急時には最悪SSDを取り外して,別のLinux BOXに繋いでマウントという手段を取ることがあり,その際はラベルを指定しておくと作業が円滑におこなえるためです.

システムのコピー

長いので別エントリにしています.linux環境を複製する方法 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き - こちらをご覧ください

grubのインストール

新しいディスク上を /mnt にマウントして,そこに chroot した環境で作業します

$ sudo mount /dev/sdb3 /mnt
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /proc /mnt/proc
$ sudo chroot /mnt
MBR用grub2のインストール

従来のBIOSブートで使用するブートローダとして grub2 をインストールします

# /usr/sbin/grub-install --target=i386-pc /dev/sdb

エラーが出る場合は以下の点を確認します

  • "BIOS boot partition"が正しく作成出来ているか?

パーティションテーブルの内容を再度チェックしましょう

  • "multiple partition labels" というエラーが出る場合

以下のエラーが出る場合は

grub-install: warning: Attempting to install GRUB to a disk with multiple partition labels.  This is not supported yet..
# dd if=/dev/zero of=/dev/sdb seek=1 count=2047

を実行してブートセクタから第一パーテションまでを一度消去します.あとは再度

# /usr/sbin/grub-install --target=i386-pc /dev/sdb

を実行すればOK

EFI用grub2のインストール

まず"EFI System"パーティションを /boot/efi にマウントします

# mkdir -p /boot/efi
# mount /dev/sdb2 /boot/efi

続けてgrub2をインストール

# /usr/sbin/grub-install --target=x86_64-efi /dev/sdb

LinuxEFIで起動していない場合は,ここで

efibootmgr: EFI variables are not supported on this system.
efibootmgr: EFI variables are not supported on this system.

という警告がでます

この警告が出る場合は再起動時にマザーボードBIOS/EFIの設定画面に行き,ブートローダーとしてgrubを使うように設定する必要があります