GRUB を復旧したメモ

あるマシンで,某 OS のアップデートがどうしても失敗するので諦めて October 2018 Update のインストールメディアを作成して [ref]これが簡単にできるようになったのは素晴らしい。そもそも同じメジャーバージョン内でアップデートに失敗するなよという話ではあるけど……[/ref]クリーンインストールしたため,MBR が書き換えられてしまいました。これでは,メインの OS である Debian GNU/Linux が起動できません。

以下は GRUB (GRUB2) を再導入することで問題を解決したメモです。

前提

  • Linux 関連領域は /(DM-Crypt で暗号化)と /boot(平文)に切り分けられている
  • 両パーティションともデータは無傷で,MBR が書き換えられているだけ

手順

1. Linux システムを USB ブートする

世に言う Live ディスクですね。Debian ではここにあります。

USB メモリへの書き込みは,Linux の場合,GNOME Disks (gnome-disk-utility) [ref]なお,インストールするには gnome-disk-utility,起動するには gnome-disks とパッケージ名が微妙に変わりますが,GNOME Disks (gnome-disks) とは,ツール群である GNOME Disk Utility (gnome-disk-utility) に含まれるソフトウェアのひとつの名称ということのようです。[/ref] を使うのが簡便でしょう。GParted (gparted) にはない機能もあり,入れておいて損はないソフトです。

使用するのはできれば同じディストリビューションの同じバージョン・アーキテクチャが望ましいでしょうが,GRUB 関連パッケージのバージョンがそれなりに近ければなんでも構わないかと思います。ちなみに今回は 64 bit Debian GNU/Linux 9 に対し 32bit の Linux Mint 19 で実行しましたが特に問題は生じませんでした。

2. 内蔵ドライブのパーティションをマウントする

内蔵ドライブの各パーティションを,/ をマウントした場所を起点に元あったように並べていくイメージです。

実例で説明したほうが早いでしょう。
修復したいシステムで

/dev/sda5 が /boot
/dev/sda6 が /

だったとしたら,
/mnt をマウントポイントにするとして,

/dev/sda5 を /mnt/boot
/dev/sda6 を /mnt

にマウントすればいいわけです。簡単ですね。

具体的には,以下のようになるでしょう。

# mount /dev/sda6 /mnt
# mount /dev/sda5 /mnt/boot

自分の場合,/ は DM-Crypt で暗号化されており手動でマウントするのはちょっと面倒だからと,Thunar(xfce 標準のファイルマネージャ)でダブルクリックして /media/ 以下にふつーにマウントしてしまいました。もちろん,これでも特に問題はありません [ref]例は以下も引き続き /mnt として説明します。[/ref]。

3. GRUB をインストールする

いよいよお待ちかね(?),GRUB をインストールします。

ここで注意すべきは,BIOS 互換モードでインストールされたシステムでは通常アーキテクチャ等を意識する必要がないのに対し,EFI モードでインストールされたシステムに対しては,対象システムにあわせたオプションを指定しなければならないということです。

詳しくは Gentoo Wiki の表と Arch Wiki の該当項目をご覧いただくとして,i386 や x64 といった target と BIOS や EFI といった platform の組み合わせで指定すべきオプションが異なり,また,UEFI 関連ファイルのディレクトリを指定する –efi-directory や UEFI にどのような名前で登録するかを指定する –bootloader-id といった EFI 特有のオプションを指定する必要があります。

もっとも,実用上は「BIOS 互換か 64bit EFI か」だけに気をつければよいかと思います。

BIOS 互換モードか 64bit EFI モードか判別する方法として,修復したいシステムの /boot(上記の例の /dev/sda5)を見るというものがあり,EFI モードでインストールされたシステムには /boot/efi が存在し,/boot/grub/i386-pc ではなく /boot/grub/x86_64-efi が存在します。

BIOS 互換モードの場合(64bit/32bit 問わず)

# grub-install --root-directory=/mnt /dev/sda

なお,設定ファイルが破損している場合は,いったん削除して再構築する必要があります。その場合は以下のようになります。

# grub-install --root-directory=/mnt --recheck /dev/sda
# update-grub

64bit EFI モードの場合

# grub-install --root-directory=/mnt --target=x86_64-efi --efi-directory=/mnt/boot/efi --bootloader-id=grub --recheck /dev/sda

–recheck しているのは bootloader-id がディストリビューションにより異なる場合があるためであり,できればディストリビューションが使用している bootloader-id (e.g. Debian 9 では "debian")を確認し,それを指定することで,わざわざ再構築せずにそのまま流用するのが無難かと思います。

さて,これで完成です。

Installation finished. No error reported.

となれば問題ないはずです。再起動してみましょう。

ダメなら手順に誤りがないか確認して再実行です。

感想

以前にも経験はありましたが,もう5年くらい前の話で,実のところすぐにうまくいくとは思っていなかったのですが,ほんの小手調べのつもりでいじっただけで修復できてしまいました。

やはり Linux は血圧に優しい素晴らしい OS です……どこかの OS とは違って。

参考

GRUB – ArchWiki

GRUB2 – Gentoo Wiki

※ "GRUB 2" というのはいわば俗称で,公式には "GRUB" のみでバージョン2を指し,バージョン1は "GRUB Legacy" と呼ばれます。

2019/1/10 EFI モードでインストールされている場合について追記

コメントを残す

投稿にあたり,完全な IP アドレスが保存されます(公開されません)。

コメントはスパムフィルタで処理され,承認後に公開されます。