EFIな環境のgrub2でbootできんようになってしもうた

家のPCはubuntuで動かしてるんですが、upgradeしたらbootできなくなってしまいました。kernelだと4.13.0-41 -> 4.15.0-20なんですが、ubuntuだとなんなのかよくわからんな。たぶん17.10 -> 18.04だな。

じたばたしてみたらなんとかなりましたので、とりあえず経緯と手順を残しておきます。

 

bootできない状態、というのはgrub2の画面が出て止まってしまいます。ls叩くと

grub> ls

(hd0) (hd0,gpt1) (hd0,gpt2)

 

 

などとしおらしく返してきます。

partition 1はfat32で、bootし終わったら/boot/efiにマウントされてるアイツ。

partition2はxfsで、/です。

ちょっと特殊かもしれんのはここで、私の環境では/bootを/に含んでて(つまり専用パーティションにしてない)、しかもxfsなのです。あんまり考えずに無邪気にこう切ってたんですが、これがハマりポイントでした。

grub shellで

grub> ls (hd0,1)/

efi/

 

 

fat32の領域については従順ですが、

grub> ls (hd0,2)/

(hd0,2): Filesystem is unknown.

 

 

などと、わけのわからないエラーが出ます。なんだFilesystem is unknownって。xfsに決まってんだろ。

また、(hd0,1)/efi/ubuntu/grub.cfgをcatしてみると

search.fs_uuid xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx root hd0,gpt2

などと書いてあるんですが、grub shellで上記を叩くと

error: no such device:  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx

と怒られます。こりゃbootしないわけですが、grubにもefiにも、なんならOSにも疎いのでわけがわかりません。

ubuntu18.04のisoイメージをUSBメモリに焼いて、起動し、こちらのgrub2を使って

jp.linux.comを参考に起動してみると、ちゃんと起動しました。つまりディスク上のファイルシステムやOS環境が壊れてるわけではなさそうです。

となるとgrub2が何かやらかしてるはずなので再度hddで起動し、grub2に落ちたところで

 

grub> pager=1

してから

grub> lsmod

すると、ロードしてあるモジュールにext4zfsは出てきますが、xfsがありません。どうも私の環境のesp上のgrub2はxfsを知らんらしい。

とりあえず再度usbで起動してから、hdd上の/boot/grub/x86_64-efi/xfs.modというやつを/boot/efi/EFI/ubuntu/x86_64-efi/xfs.modにコピーし、再度hddで起動。

grub shellのhelpでinsmodというコマンドがあるので

grub> insmod xfs.mod

とやると、エラー。esp上のパスを参照してないようなので絶対パス

grub> insmod (hd0,1)/efi/ubuntu/x86_64-efi/xfs.mod

とやって

grub> lsmod

やるとxfsがロードされてるのを確認できました。

この状態で(hd0,1)/efi/ubuntu/grub.cfgの一行目、つまりsearch.fs_uuidを叩くと、おお。通りました。

 

対処まとめ

(1) esp上にxfs.modを置く。

(2) /boot/efi/EFI/ubuntu/grub.cfgの一行目に以下を挿入。

insmod (hd0,1)/efi/ubuntu/x86_64-efi/xfs.mod

 

もとのesp上のgrub.cfgがどうなってたのかはわからず・・・・upgrade前に/bootと/boot/efiのバックアップは取っておくべき。

 

追記

2022年ころから、xfs.modをロードしないgrub.cfgでもbootできるようになりました。

git.launchpad.netここでGRUB EFI バイナリにxfs.modを組み込んだ、らしいです。(ずいぶん前のことなのでいまひとつ腑に落ちませんが・・・)
いままで全く気にしてなかったのですが、/bootをmdでRAID1している場合もinsmod mdraid1xすれば通りそうですね。