Mac Book Air にデュアルブートで入れたUbuntuをアップデートしたら起動しなくなった件


サブ機として使っているMacBook Airには、展示会やイベントでのオフラインデモ用にUbuntuを入れてあるのですが、それを18.04にアップデートした際に起動しなくなってしまった件の対応方法を記録しておきます。

GRUBメニューを表示させる

僕の環境では通常Ubuntuが起動する時はGRUBメニューは表示されませんでした。電源ボタンを押して、option/altボタンを押しっぱなしにしてMacの起動メニューを表示して、そこに表示される「EFI」というHDDを選択するとUbuntuが起動する感じでした。

この時、EFIを選択してからescボタンを押しっぱなしにしてるとGRUBメニューが表示されます。

とにかく起動させる

GRUBメニューが表示されてから「c」キーを押すとGRUBのコマンドラインインターフェイスになるので、lsコマンドでUbuntuがインストールされているパーティーションを探します。

GRUB ls
(hd0) (hd0,gpt4) (hd0,gpt3) (hd0,gpt2) (hd0,gpt1) (cd0) (cd1) (cd2) (cd3) 

僕の環境ではこんな感じの出力になりました。
lsコマンドでディスク+「/」でディスクのルートディレクトリが表示されるので、中身を見ていきます。

GRUB ls (hd0)
error: unknown filesystem.
GRUB ls (hd0,gpt1)
efi/ bootlog .Trashes/
GRUB ls (hd0,gpt2)
error: unknown filesystem.
GRUB ls (hd0,gpt3)
./ ../ lost+found/ boot/ etc/ media/ bin/ dev/ home/ lib/ lib64/ mnt/ opt/ proc/ root/ run/ sbin/ snap/ srv/ sys/ tmp/ usr/ var/ vmlinuz initrd.img cdrom/ initrd.img.old vmlinuz.old
GRUB ls (hd0,gpt4)
error: unknown filesystem.

これで(hd0,gpt3) がUbuntuのディレクトリという事がわかったので、rootに設定します。

GRUB set root=(hd0,gpt3)

vmlinuzとinitrb.imgを設定

GRUB linux /vmlinuz root=/dev/nvme0n1p3
GRUB initrd /initrd.img

この時、MacはEFIなのでlinuxlinuxefiinitrbinitrbefiにしてもOK。ダメだったら試してください。
あと、linuxコマンドでルートにマウントするデバイスを指定しないといけないのですが、この時点で

GRUB ls (hd0,gpt3)/dev/

としてもなぜか/dev/nvme0n1p3はありません。適当に/dev/mapper/controlとかをrootに設定してbootすると、起動はできないんですが、devの中身にnvme***が出てくる様になるので、そこでデバイス名をゲット。
GRUBのコンソールでlsした際に出てきたパーテーションがこんな感じで対応しています。

ls dev
(hd0) nvme0
(hd0,gpt1) nvme0n1p1
(hd0,gpt2) nvme0n1p2
(hd0,gpt3) nvme0n1p3
(hd0,gpt4) nvme0n1p4

適時、自分の環境に読み替えてください。nvme0が物理ドライブの0番で、nvme0n1がその1番目のGPTパーテーショングループ、nvme0n1p1がその1番目のパーテーション、って事だと思います。たぶん

上記を設定したら起動します。

GRUB boot

無事、起動したらgrub.cfgを変更します。

grub.cfgを編集する

grub.cfgは/boot/efiにある方を編集します。僕の環境では、/dev/nvme0n1p1がブートパーテーションで、ubuntuだと/boot/efiにマウントされます。
/boot/efi/EFI/ubuntu/grub.cfgが起動時に使われるGRUBの設定ファイルなので、これを修正します。
なぜかgrub-mkconfigとかしてもちゃんと起動するgrub.cfgが正成されなかったので、中身見て手動で変更しました。
grub.cfgを開くと、

grub.cfg
#
# DO NOT EDIT THIS FILE
#

と書いてあってビビりますが、無視しますw

grub.cfgをざーっと読んでいって、linuxコマンドを実行してるとこを見つけ、その前でrootを設定します

grub.cfg
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-dev/nvme0n1p3' {
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_gpt
    set root=(hd0,gpt3)
        linux /boot/vmlinuz-4.15.0-62-generic root=/dev/nvme0n1p3 ro quiet splash $vt_handoff
    initrd /boot/initrd.img-4.15.0-62-generic
}

このset root=(hd0,gpt3)が追記した部分です。
なぜかこれを書かないと、/boot/vmlinuz-4.15.0-62-genericが見つからないってエラーで起動できませんでした。

以上、ご参考までに。