GRUB が壊れた時の対処法

（2025/05/09 更新）

ひとつの PC で、例えば Ubuntu と Windows というように、GRUB から dual boot の設定をしていると、GRUB が突然記憶喪失になって、`grub> ` というコマンドプロンプトを表示するのみで boot 出来なくなってしまうことがあります。

この原因は apt などによる grub2 パッケージの更新です。なのでパッケージ名を指定しない apt upgrade では grub2 は自動的に更新されません。

これが嫌だからと言って grub2 を更新しないままでいると、いつまでも notification が残って非常にうざったいです。ちょっとした操作で簡単に修復できますので、時間が空いた時に更新・修復した方が良いでしょう。

そのためには、３点、覚えておかなければならないことがあります。

* 起動システムとしてレガシーな BIOS を使っているのか、UEFI を使っているのか
* デバイス（HDD, SDD）（のパーティッション）をそのままマウントしているのか、LVM を使って複数のデバイスをまとめ上げた論理ボリュームとしてマウントしているのか
* どのデバイス（もしくは LVM の論理ボリューム）をファイルシステムの root directory としてマウントしているのか

要するに、一番最初に Ubuntu をインストールした際の設定を覚えておかなければならないということです。

覚えられないという人は、このように Qiita 記事にしておくのも良いのではないでしょうか。（この記事が私の備忘録みたいなものです）

※ 以下の対処法は私の環境での話です。みなさまが行う場合には各々の環境に併せてコマンドの中身を変更し、自己責任で行っていただくようお願いします。

# 私の環境

* PC に HDD（SSD）を２台搭載しているので、１台に Ubuntu、もう１台に Windows をインストールしている
* GRUB でそれらを dual boot できるように設定している
* Ubuntu をインストールした HDD は２つの partition に分けていて、ひとつ（`/dev/sda1`）を EFI に使い、もうひとつ（`/dev/sda2`）をファイルシステムの root (`/`) にマウントしている
    * `/dev/sda1` のマウントポイントは `/boot/efi`

# 情報の確認方法

GRUB が記憶喪失になってしまったら、まずは以下の操作をして boot に必要な情報を確認します。

* `grub> ls` コマンドを実行して、デバイスの一覧を確認する
    * 例）`(hd0,gpt1)  (hd0,gpt2) ...`
* 例えば `grub> ls (hd0,gpt2)/` と入力して TAB で補完を表示させると、その下のディレクトリ等が表示されるので、その中に boot ディレクトリがあることなどを確認することによって、どのデバイスが root となるデバイスなのかを確認する
* 例えば `grub> ls (hd0,gpt2)/boot/` を実行することで、最新バージョンの vmlinux と initrd (initramfs) のファイル名を確認する
* 例えば `grub> cat (hd0,gpt2)/etc/fstab` を実行することで、fstab に書かれているデバイス名やマウントポイントを確認する

私は UEFI を使っているので、デバイスの partition として GPT を使っており、そのためにデバイス名が `(hd0,gpt1)` 等のように見えています。レガシーな BIOS の場合は直接 `(hd0,sda1)` 等のように見えると思います。

LVM を使っている場合はちょっとややこしいですが、fstab を見れば大体は分かるのではないでしょうか。
結局、Ubuntu インストールの際に親切にも fstab に残してくれていた情報に頼り切っています。なので、fstab のコメントは消さずに残しておいた方が良いでしょう。

ここで確認するのは、以下の４点です。今回の私の例も併せて載せます。

* root となるデバイス名： `(hd0,gpt2)`
* Ubuntu 内部から見たときの上記デバイス名： `/dev/sda2`
* 最新の Linux イメージファイル名： `/boot/vmlinuz-6.11.0-25-generic`
* 最新の initrd イメージファイル名： `/boot/initrd.img-6.11.0-25-generic`

# Ubuntu を起動する

上記で確認した情報を使い、以下のようにすることで Ubuntu を起動できます。

```
grub> set root=(hd0,gpt2)
grub> linux /boot/vmlinuz-6.11.0-25-generic root=/dev/sda2
grub> initrd /boot/initrd.img-6.11.0-25-generic
grub> boot
```

もっと良い方法があるかとは思いますが（linux ではなく linuxefi を使う、root は UUID で指定する等）、とりあえず上記で boot できるのでヨシとします。

# その他の Ubuntu を起動する方法

GRUB の画面では情報がどうしても分からなかった、どうしても Ubuntu が起動できないという場合は、以下の方法があります。

## USB から boot し、HDD 上のデバイスを mount する

PC に Ubuntu のインストール USB を刺し、PC の BIOS の Boot Selector で USB を指定して Ubuntu を立ち上げ、デバイスを mount 下後に chroot で強引に root を差し替えることも可能です。

BIOS の Boot Selector を起動するには、PC の電源を入れた後に（私の PC の BIOS では） F11 を連打します。

Ubuntu を立ち上げたら、適当にターミナルを開き、以下のコマンドを入力することによって HDD 上のデバイスを強制的にマウントし、chroot でマウントポイントが root になるよう変更します。

```
> sudo su -
> mount /dev/sda2 /mnt
> mount -B /dev/sda1 /mnt/boot/efi
> for i in /dev /dev/pts /proc /sys /run; do mount -B $i /mnt/$i; done
> chroot /mnt
```

## Boot Selector で Ubuntu のデバイスを指定する

F11 の連打で BIOS の Boot Selector を立ち上げ、そこから Ubuntu のデバイスを指定することで、あっさり立ち上がることもあります。

この方法が一番簡単かもしれません。

# GRUB の設定確認・変更

Ubuntu が起動したら、まずは GRUB の設定を確認します。もしかしたら書き換わってしまっているかもしれないので。自分の好みの設定が失われていたら、元に戻しましょう。
変更するファイルは `/etc/default/grub` のみ。
以下は私の設定なので、お好みで。

* GRUB の表示画面
    * `GRUB_TIMEOUT_STYPE=menu`
* GRUB のタイムアウト
    * `GRUB_TIMEOUT=0`
* GRUBのスタイル
    * `GRUB_CMDLINE_LINUX_DEFAULT="quiet text"`
        * "quiet splash" だとフォントが小さすぎて見にくいから
* Windows がインストールされているデバイスを検索して表示する
    * `GRUB_DISABLE_OS_PROBER=false`

# GRUB の再インストールとアップデート

```
> sudo grub-install --efi-directory=/boot/efi
> sudo update-grub
```

# BIOS に EFI を再認識させる

上記を行い再起動しても、まだ症状は直りません。

一旦 PC の電源を入れ直し、F2 の連打で（F2 かどうかは BIOS 依存）BIOS のメニューを立ち上げます。

そして Boot の設定から、一旦 boot device を全部 disable にしてから、再度 Ubuntu や Windows のデバイスを設定します。

最後に、もう一度 PC の電源を入れ直せば、全部直っている、はず。

# 最後に

dual boot じゃなければ、こんなことは発生しないので、一番の原因は dual boot。

しかし Ubuntu も Windows も使いたいし、でも何台も PC を買うお金なんか無い、という場合には、私は dual boot したい。
（どちらかを Host にして他方を仮想 PC 上で動かすという方法もあるけど、どちらの OS でもハードの性能を存分に使いたいという場合は、やっぱり dual boot という選択肢になる）

ということは、どうしても dual boot をしたい場合は、最初の Ubuntu のインストール時に以下のポイントを守ったほうが良いということになる。

* デバイスを細かく partition しない
    * EFI 用 partition と root 用 partition の２つのみ！
* LVM は使わない
* root のファイルシステムは、ext3 等、枯れきって GRUB でも読めるものを使う

これらは後から変更できるものではないので、Ubuntu インストール時に複雑な設定にしてしまうと後から泣きを見るという、悪辣な罠が存在している。

世知辛い世の中ですね。

後は、grub を更新したら、再起動する前に忘れずに grub-install, update-grub するという方法もあるかもしれません。ただ、私は確実に忘れますし、いままでもずっと忘れてきました。なのでこの方法が有効かどうかは分かりません。

そして最後に重ねて、この記事に載せていることを行う場合は、あくまで自己責任でお願いします。