家の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
すると、ロードしてあるモジュールにext4やzfsは出てきますが、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> lsmod
やるとxfsがロードされてるのを確認できました。
この状態で(hd0,1)/efi/ubuntu/grub.cfgの一行目、つまりsearch.fs_uuidを叩くと、おお。通りました。
対処まとめ
(1) esp上にxfs.modを置く。
(2) /boot/efi/EFI/ubuntu/grub.cfgの一行目に以下を挿入。
もとの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
すれば通りそうですね。