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 とは別のパーティションにあるカーネルの起動が行えません。

ただし、ライブ起動ではパーティション構成が固定されているため

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


GRUB 2 を管理する Linux

パソコン起動時の MBR・ESP から起動する GRUB は

次を除いた Linux で管理するのがおすすめです。

  • GRUB 2 以外が標準ブートローダーになっている
  • Frugal インストール

一部の Linux はインストール時に GRUB 2 を MBR・ESP へインストールします。

その場合に自動検出される Linux であれば、メニューから選択して起動し、

GRUB のインストールをしなおす事で復旧が可能です。


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つのブートローダーを経由する必要があるかもしれません。

 

逆に検出したくない場合、
(例えばパーティションが多く update-grub に時間を要する)

root 権限で  /etc/default/grub を開き、次の1行を追加します。

Linux によってはすでに記載されている場合があるので、ご注意下さい。

 

GRUB_DISABLE_OS_PROBER="true"

 

またはターミナルより次のコマンドで os-prober の実行権を外す、

os-prober パッケージを削除(この場合は依存関係のパッケージも影響を受けます)
/etc/grub.d/30_os-prober(30 は異なる場合あり)の実行権をなくすか移動する
方法もあります。

 

その後 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

}

 

よく GRUB の項目を編集する場合、

update-grub で自動検出される表示を編集したい場合は

Grub Customizer を使用すると良いでしょう。


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

/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 で起動するようにしてから

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

起動しなくなっても Super Grub2 Disk 経由で起動し、update-grub するか、

Rescatux や Boot-Repeir-Disk で修復が可能です。

 

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

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

 

比較的最近のバージョンでは改善があるようで、

GRUB 2 が起動するパーティションの先頭を GParted で変更しても

正常に GRUB が起動するようになっています。


GRUB 2 のカスタマイズ

GRUB Customizer が存在します。


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

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 を復旧します。

 

MX Linux は Boot Repair (MX 起動の修正) で容易に GRUB の復旧を行えます。

ISO から起動して実行して下さい。


bios_grub フラグの領域

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 の種類によって記載が変わってくるため、ここでは紹介しません。