ブログトップ 記事一覧 ログイン 無料ブログ開設

ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き - このページをアンテナに追加 RSSフィード

2016-06-04

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

|  MBR(bios)でもESP(uefi)でも起動できるgrub2の設定方法を含むブックマーク  MBR(bios)でもESP(uefi)でも起動できるgrub2の設定方法のブックマークコメント

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

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

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

具体的な手順について

以下,実例として

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

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

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

事前準備

事前知識として

  • MBRを使う場合は,ディスクの先頭に1MB程度の領域を確保しておいて,そこに grub2を入れる事
  • ESPを使う場合は,ディクスのパーティションテーブルを GPT という形式で設定する事
  • ESPFAT32 または 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を使うように設定する必要があります

ねこ丸ねこ丸 2017/02/23 14:11 こんちわ 「34セクタから2047セクタ」のところ
40セクタから2047セクタ のほうが良いような気がするんですがいかがでしょうか?

ねこ丸ねこ丸 2017/02/23 14:37 もひとつ 
$ sudo apt-get update
$ sudo apt-get install grub-efi
$ sudo apt-get autoremove
$ sudo apt-get install grub-efi-amd64
$ sudo apt-get install grub-efi-x86_64
$ sudo apt-get install grub-efi-ia32-bin

$ sudo chown -R usr:usr /mnt
$ mkdir -p /mnt/usb
$ mkdir -p /mnt/usb/boot/iso
$ sudo mount /dev/sdb1 /mnt/usb
$ sudo grub-install --target x86_64-efi --efi-directory /mnt/usb --boot-directory=/mnt/usb/boot --removable
$ sudo grub-install --target i386-efi --efi-directory /mnt/usb --boot-directory=/mnt/usb/boot --removable
$ lsblk -f | grep /mnt/usb

pyopyopyopyopyopyo 2017/02/27 17:13 コメントありがとうございます

一つ教えていただきたいのですが
40セクタにするとどんなメリットがあるのでしょうか?

私のこのエントリでは
OSはLinuxで grub2 を使う前提で手順を書いていますが
- gdiskのデフォルトが34
- セクタ34で問題は起きていない
ということで 34を使っています

34で不具合が出る場合をご存知でしたら是非教えてください

ねこ丸ねこ丸 2017/06/06 13:05 遅くなってすみません。
34の不具合はたまに蹴られることがあります。
それとこのエリアをgrubが欲しがるみたいです。
解決策は 場所はどこでも良いみたいで 4MB(AFT縛り)単位 GDISK で ef02 にしてやれば良いようです。
話題を変えて
GPT-DISK の先頭に 100MB-FAT32 後 ntfs を 適当(AFT)にして GDISK r h 1 2 y y n で ハイブリッドにしますと レガシー(MBR)起動で win7-32 をインストールしますと 認識して 入っちゃいました。

pyopyopyopyopyopyo 2017/06/08 23:01 という事であれば
ef02を作成する前提であれば34で問題ないと思います