Windows10更新したら画面真っ黒になってgrub rescueが出た

Windows10を更新したらgrubで起動しなくなった件。なんかよくわからんが、Windowsが勝手にパーティション切ったらしい。

grub rescue出現

自作PCはUbuntuとWindows10のデュアルブートで、今回Windows10を起動しようとしたらログイン前に更新し始めたので待った。この更新は結構長かったので、Anniversary Updateというやつだったのかもしれない。とにかくこの更新中に何回か再起動するのだが、再起動するとブートローダのgrubがおかしくなっていた。いつもは紫色の画面(Ubuntuで入れたから)になって起動するOSを選択させてくれるのに、真っ黒な画面でgrub rescue>という味も素っ気もないプロンプトを出すようになった。exitquitshutdownも、補完すら利かないパンクなシェル。

起動方法(その場しのぎ)

grubのシェルはほとんどいじったことがない(いじりたくない)ので焦った。調べるとWindows10の更新でこうなる人は多いようで、情報はそれなりにあった。ありがたい。
結局対処法は簡単で

ls

とやって出たパーティションたちのどれにbootがあるか、一つ一つ調べていけばいい。例えば(hd0,msdos3)がbootを持つか調べたいときは

ls (hd0,msdos3)/boot

みたいな感じだ。これでなにやらごちゃごちゃ出るものがbootのあるパーティション。補完ができないので面倒なこと甚だしいが、やるしかない。
(ただし、人によってはこのコマンドで何も出てこないこともあるようだ。そのときはLiveUSBとか作ってLinuxを起動して調べないといけないっぽい。)

さてbootのあるパーティション(ここでは(hd0,msdos3)とする)が見つかったら、grubがそこを見るようにすればいい。これはsetというコマンドがあり、引数なしで入力すると現在の値が見れる。今回大事なのはprefixで

set prefix=(hd0,msdos3)/boot/grub

のようにして設定できる。これでgrubに正しいブート位置を教えることができた。あとは

insmod normal
normal

と打って、grubをノーマルモードにする。これでいつものgrubの画面に戻る。そしてOS選択して、ちゃんと起動できるようになる。

修正方法

上の方法でやっても、次回起動時にはまた同じことが起きる。setしてもgrubの設定はその1回限り変わるだけだからだ。設定を恒久的に変えるにはgrubの設定ファイルを更新し、インストールし直さないといけない。grubの設定ファイルは/boot/grub/grub.cfgで、たしかにファイル内にはhd0がどうこうという部分があり、ここでbootを指定しているようだ。だがファイルの冒頭に”DO NOT EDIT THIS FILE”と素敵なことが書いてある。このファイルは直接編集するものではなく、/etc/default/grubから生成するものだからだ。実は今回は何も編集しなくていい。

# update-grub

とすれば勝手にbootがどこにあるか探して、/boot/grub/grub.cfgを適切に変更してくれる。あとは

# grub-install /dev/sda

でその設定が反映される。/dev/sdaのところはブートローダを入れたいストレージを入れる。(lsblkとかgpartedとかで調べられる。)

なお、update-grubがないディストリビューションもある。そもそもupdate-grubは特別なものではなく、

$ cat $(which update-grub)

とすれば

#!/bin/sh
set -e
exec grub-mkconfig -o /boot/grub/grub.cfg "$@"

となり、grub-mkconfigしているだけだとわかる。なのでそうすればいいんじゃないかな……実際に試してないのでよくわからん。

参考

windows10アップデートでデュアルブートマシンが起動不能になった話
boot – Windows 10 upgrade lead into grub rescue – Ask Ubuntu