Ubuntuアップグレードでgrubが破壊された場合の対処方法

先日VirtualBox上のUbuntuを18.04から20.04にアップグレードした際にgrubが壊れて起動出来なくなった場合に行った対象方法


エラー内容

  • do-release-upgradeで18.04から20.04にアップグレード
  • アップグレード自体は正常に終了し、システム再起動を実施
  • “‘grub_file_filters’ not found”と表示され、起動出来ず…
error: symbol 'grub_file_filters' not found. 
Entering rescue mode... 
grub rescue>

修正方法

grubの再インストールを実施すれば修正できるのですが、システムが起動しないためこのままでは何も出来ません。そこでDVD/CD/USBなどからLinuxを起動、ディスクをマウント、grubの再インストールという流れで修正していきます

Live DVD/USBでの起動

世の中色々なLinux Liveディストリビューションがあると思いますが、今回は安直にUbuntuの.isoイメージをダウンロードしました。おそらくもっとサイズの小さいお手軽なものがあると思います。

UbuntuのISOイメージはこちらからダウンロードできます

ダウンロード後、VirtualBoxの設定->ストレージ->光学ドライブのメニューからISOファイルをマウントし、VMを起動します

DVDから起動すると、最初にDVDからUbuntuを起動するか、Ubuntuをディスクにインストールするかを選択するメニューが表示されるため、”Try Ubuntu”を選択します

Try Ubuntu before you install it | Ubuntu

起動後、端末を立ち上げてgrubの再インストールを実施していきます

grub再インストール

ディスクの特定

最初にlsblkコマンドでインストールされているディスク、パーティションを特定します。下記の場合はsda1が対象パーティションです

% lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0  99.4M  1 loop /snap/core/11420
loop1    7:1    0  55.5M  1 loop /snap/core18/2074
...
loop20   7:20   0    51M  1 loop /snap/snap-store/547
loop21   7:21   0   2.5M  1 loop /snap/gnome-calculator/826
sda      8:0    0   128G  0 disk 
└─sda1   8:1    0   128G  0 part /
sr0     11:0    1  1024M  0 rom  

次に対象ディスクをマウントしていきます

# rootで実行
% sudo su

# "sda1"の部分は上記で特定したパーティションを使用
% mount /dev/sda1 /mnt
% mount --bind /dev /mnt/dev
% mount --bind /dev/pts /mnt/dev/pts
% mount --bind /proc /mnt/proc
% mount --bind /sys /mnt/sys

% chroot /mnt

ここまで出来たらgrubのインストールは一行です

# 対象ディスクにgrubをインストール
% grub-install /dev/sda
Installation finished. No error reported

grubのインストールで指定するのはパーティション (/dev/sda1)ではなくディスク(/dev/sda)ですので注意してください

最後に念のためumountして再起動します (再起動後はDVDではなく、ディスクからブートします)

# chroot終了
% exit

# 逆順にumount
% umount /mnt/dev/pts
% umount /mnt/dev
% umount /mnt/proc
% umount /mnt/sys
% umount /mnt

# 再起動
% reboot

おすすめ