GRUB 2

テキストベースのブートローダですが、

現在 Linux では主流のブートローダとなりつつあります。


GRUB 2 がなぜ使われるのか?

GRUB 2 が使われる理由は下記です。

  • BIOS はもちろん UEFI にも対応済みで、最新パソコンでも起動できる。
    GRUB1・GRUB4DOS は UEFI 非対応のため、GRUB2 必須
  • GRUB メニューの自動生成が可能で、
    カーネルを更新してファイル名が変わっても、GRUB へ自動反映できる
  • マルチブートの場合、他のパーティションにある OS を自動検出する
    これも GRUB 更新時に自動検出し、リスト追加される。
  • これらによって、利用者は通常 GRUB の設定に一切触れる事なく
    GRUB を起動し、OS の一覧を表示させ、使用する事ができる。
  • 多くの Linux で採用され、自然に使われる状態になっている。
  • GNU 開発で定評がある。GRUB1 からの継承として。

特に UEFI 環境では GRUB 2 での起動が重宝するでしょう。

 

UEFI は syslinux も対応していますが、

syslinux とは別のパーティションにあるカーネルの起動が行えません。

ただし、ライブ起動では 1 パーティション構成の場合が多く、

syslinux が採用されている事があります。


GRUB の自動生成を手動で実行する

Linux にインストールされている GRUB 2 では

多くの場合、他の Linux を自動検出します。

これはカーネルや GRUB の更新時に行われますが、

下のコマンドで手動で実行する事も可能です。例えばこのように行います。

  • Debian・Ubuntu
    sudo update-grub
  • Red Hat・Fedora (BIOS)
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  • Red Hat・Fedora (UEFI)
    sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

これには例外があり、検出しない Linux が存在します。

その場合チェインロードを用いて

2つのブートローダーを経由する必要があるかもしれません。

 

Arch Linux 系では os-prober lsb-release をインストールする事で

他の OS を検出したり、検出されたりするようにできます。

 

# pacman -S os-prober lsb-release

# grub-mkconfig -o /boot/grub/grub.cfg

 

逆に検出したくない場合、root 権限で  /etc/default/grub を開き、

次の1行を追加します。

 

GRUB_DISABLE_OS_PROBER="true"

 

その後 update-grub を行って下さい。
この方法はマルチブートしている環境では、数が多いほど
GRUB の作業時間が少なくなり、効果が大きいです。


GRUB がリストを生成する順序

多くの Linux では次の順で GRUB のリストを生成します。

生成を実行している OS は先頭に持っていきます。

それ以降は次の順で生成されます。(先頭の OS は除かれます)

  • sda1→sda10→sda11…sda19→sda2→sda3→……
  • sdb1→sdb10→sdb11…sdb19→sdb2→sdb3→……
  • sdc1……

次の場合は生成されません。

  • Frugal 起動の OS

これらは手動で追加を行う必要があります。

 

Fedora は古いバージョンでバージョンアップを伴うアップグレードを行う際、

fedup が GRUB の項目を追加するため、
Fedora の GRUB を MBR 起動にする必要がありました。

(または fedora-update など他の手段でアップグレードを行う事もできました)

Fedora 22→23 からは dnf-plugin-system-upgrade に変更され、

これは通常の Fedora 起動でアップグレード作業を行います。

そのため、Fedora の GRUB を MBR 起動にする必要がなくなっています。


手動でリストを追加する例

/etc/grub.d の custom を含むファイル名を編集します。(例えば 40_custom )

編集後、「GRUB の自動生成を手動で実行する」の手順を
GRUB を生成させている OS から必ず行って下さい。

 

なお、grub.cfg を直接編集しないで下さい。
grub.cfg はカーネルの更新などで自動更新されるため、

その際に上書きされ、削除されてしまいます。

 

パーティションの指定は (hd0,3)→sda3、(hd1,1)→sdb1 となります。

GRUB 1・GRUB4DOS と後ろの番号が異なり、
Linux のパーティション番号と同じ値になります。(1 からはじまります)

 

他のディスクを起動

sdb = (hd1)。単に (hd1) へチェインロードします。

 

menuentry "disk sdb" {

    set root=(hd1)

    chainloader +1

}

 

再起動

menuentry "Reboot" {

    reboot

}

 

電源を切る

menuentry "Power OFF" {

    halt

}


前回起動した項目を次回起動時に選択した状態にする

/etc/default/grub を次のように変更・追加します。

 

GRUB_DEFAULT=saved 

GRUB_SAVEDEFAULT=true

 

GRUB_DEFAULT は起動時に選択されている項目の指定、

GRUB_SAVEDEFAULT は自動生成される項目に
savedefdult を付加するかを設定します。

 

カスタムで menuentry を追加する場合、

GRUB_SAVEDEFAULT は反映されません。

menuentry の頭で savedefault を付加して下さい。


GRUB 2 を使用するパーティション

GRUB 2 はステージ 2 をパーティションの先頭にインストールします。

これは MBR の領域では GRUB 2 の容量が足りないためです。

 

そのため、GRUB 2 が起動するパーティションの先頭位置を動かすと

GRUB 2 が起動しなくなります。

例えば他の OS で生成する GRUB 2 を MBR で起動するようにしてから

パーティションの位置を動かすようにします。

 

GRUB 1・GRUB4DOS はこれが発生しないため、

MBR・BIOS 環境ではあえて GRUB 1・GRUB4DOS を使う手もあります。 


GRUB のカスタマイズ

Ubuntu では GRUB Customizer が存在します。

GUI でメニューの編集や背景などを設定できます。

例えば Ubuntu フレーバーを複数インストールしている場合は

すべて同じ名称になってしまうため、使う事になるでしょう。

 

$ sudo add-apt-repository ppa:danielrichter2007/grub-customizer

$ sudo apt-get update

$ sudo apt-get install grub-customizer

 

Ubuntu 以外の Linux でも使用できますが、ソースからのビルドが必要です。
(一部 Debian で .deb からインストールする方法が記載されていますが、
 依存関係の違いによりインストールできない事を運営者が確認しています)


レスキューモードから起動する

GRUB が参照するパーティションを移動し、リストが検出できなくなった場合、

GRUB はレスキューモード表示を行います。

その場合でも起動が可能な場合があります。

 

例えば sda5 に GRUB の情報がある場合、
下記のコマンドで起動できる場合があります。

 

grub rescue> set prefix=(hd0,5)/boot/grub

grub rescue> set root=(hd0,5)

grub rescue> insmod normal

grub rescue> normal

 

具体的な起動で改善できるかもしれません。

 

grub rescue> insmod linux

grub rescue> linux /vmlinuz root=/dev/sda5

grub rescue> initrd /initrd.img

grub rescue> boot

 

無事起動できたら、grub-install で GRUB をインストールしなおして下さい。 update-grub で GRUB のメニュー更新も行っておきましょう。

 

$ sudo grub-install /dev/sda

$ sudo update-grub

 

これで再起動し、改善を確認します。


GRUB2 を復旧できる Linux

GRUB から起動できない場合に USB メモリや CD・DVD から起動して
GRUB を復旧できる Linux がいくつか存在します。

  • Rescatux - GRUB 以外に Windows の復旧も対応しています。
  • Super Grub2 Disk - GRUB メニューと OS を検出して一覧表示。起動可能に。
  • Boot-Repeir-Disk - 起動時で Boot-Repair を起動し、GRUB を復旧します。

Super Grub2 Disk はメニューを表示させるたけです。
Linux などをを起動した後、 update-grub で GRUB を復旧します。


bios_grub フラグの領域

Ubuntu などでは UEFI 領域に GRUB 2 のインストールを行った場合、

bios_grub フラグを付けたパーティション領域を生成する事があります。

これは GRUB 2 のステージ2プログラム本体が入った領域です。

 

GParted はこれを不明の領域として認識し、パーティション操作を行えません。

移動を要する場合は次のようにします。

  1. bios_grub のパーティション領域を削除
  2. 1MB のパーティション領域を生成(できるだけ頭の方に)
  3. 生成したパーティションに bios_grub フラグを付ける
  4. MBR へ書き込むように update-grub を実行する
    GRUB 2 はこれで bios_grub を自動認識し、プログラムを保存します。
    例えば Ubuntu を /media/Ubuntu をマウントした前提で
    下記のように実行します。
     $ sudo grub-install --root-directory=/media/Ubuntu/boot /dev/sda

ISO を起動する

いくつか方法があります。UEFI 環境では起動できない場合があります。

ISO が大きいと起動までの読み込みに少し時間かかる場合があります。

ISO を実メモリに読み込んで実行するため、

メモリサイズがある程度大きい必要があります。

 

起動する ISO によって、起動直後のメニューで

起動オプションを表示し編集する必要があります。

例えば Ubuntu は次の起動オプションを加えて下さい。

 

iso-scan/filename=/(パス/ISO ファイル名) noprompt noeject

 

Ubuntu のインストーラーはハードディスクからライブ起動し、

同じハードディスク内の別パーティションへ

インストールするようにはできません。

(起動パーティションをアンインストールしようとします)

必ず別のディスクなどから起動してインストールする必要があります。

 

ISO ファイルをパーティションに展開して起動する方法もあります。

 

grml-rescueboot

Ubuntu・Debian が GRUB 2 を管理している場合、

grml-rescueboot を用いると、
簡単に ISO ファイルの起動をメニューに追加できます。

 

パッケージをインストールします。

 

$ sudo apt install grml-rescueboot

 

/boot フォルダ内に grml フォルダができています。

この /boot/grml フォルダ内に ISO ファイルを入れます。

root 権限で行う必要があります。

 

入れた後に GRUB を更新します。

 

$ sudo update-grub

 

再起動して GRUB 2 を表示し、

ISO ファイルの一覧表示と起動ができる事を確認して下さい。

 

memdisk 経由で起動

syslinux パッケージに含まれる memdisk を用いて ISO を起動します。

/usr/lib/syslinux 内に memdisk がある場合があります。

これを ISO ファイルと同じところに入れます。ここでは /boot/iso とします。

 

$ sudo cp /usr/lib/syslinux/memdisk /boot/iso/

 

あとはメニュー項目を追加します。linux-111.iso が起動する ISO です。

 

menuentry "ISO" {

    set root=(hd0,1)

    linux16 /boot/iso/memdisk

    initrd16 /boot/iso/linux-111.iso

}

 

update-grub を忘れないで下さい。

 

起動オプションを付けて起動

上記以外に loopback で ISO ファイルを展開しつつ、

linux・initrd にカーネルと起動オプションを付けて起動する方法があります。

Linux の種類によって記載が変わってくるため、ここでは紹介しません。