こんにちは壁紙です。
突然なんですが、Ubuntuが起動しなくなってしまいました…。
いや正確に言うと、Ubuntuが起動しないのではなくてブートローダーであるgrubくんがうまいこと動いてくれないんです。
起動してブートメニューからUbuntuの入っているディスクを選択すると以下のような画面が出てきます。
さてどうしたものでしょうか。
ということで、この問題現在進行中なのですが、解決までの道程とたどり着いた答えを記録します。
現象発現前
これが絶対原因なのですが…パーティションの変更を行いました。Ubuntuのプライマリディレクトリが容量不足で必要なパッケージを導入することができなかったので、LENOVOのパーティションを少し削ってUbuntuに食わせてやろうとしました。これがいけなかった…。
対処
ネットで調べると、やはり同様の現象を確認している人はいました。
msykk.org
こちらのサイトを参考に、grub rescueに戻って作業を続けます。
まずは"ls"コマンドを使って/bootが入っているパーティションを探します。
※どのパーティションにあるかは人によって違います。
error: unknown filesystem Entering rescue mode... grub rescue>ls (hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3) (hd0,gpt4) (中略) (hd0,gpt8) grub rescue>ls (hd0,1) (hd0,gpt1):filesystem is unknown. grub rescue>ls (hd0,2) (hd0,gpt2);filesystem is unknown. grub rescue>ls (hd0,3) (hd0,gpt3);filesystem is ext2. grub rescue>ls (hd0,3)/ (略) /boot (略)
(hd0,gpt3)と打つことと(hd0,3)と打つことは同値とみなされます
こうして(hd0,gpt3)にbootディレクトリが存在することが分かりましたので、次のステップに移ります。
grub rescue>set prefix=(hd0,3)/boot/grub grub rescue>root=(hd0,3) grub rescue>insmod normal grub rescue>normal
これで一応Ubuntuは起動します。私のUbuntuさんはデフォルトのカーネルだとうまく起動しないのでgrubオプションを起動するためにhit enterしたらすぐに左Shiftキーを押します。普通に起動する方は別にそのままで結構です。
Ubuntuが起動したらまずTerminal(端末)を開きます。そしてgrubを再インストールするために次のコマンドを実行します。
ここでファイルシステムの名前(例えば/dev/sda1など)が必要になります。Ubuntuのアプリ画面から「ディスク」ないし「disk」と検索して「ディスク(disks)」を開き、bootディレクトリがある(基本的にはUbuntuがインストールしてある)ディスクの「デバイス」以下を覚えるなりメモを取っておきましょう。ちなみに私の環境ですと「/dev/nvme0n1p3」という名前です。
$ sudo update-grub $ sudo grub-install /dev/nvme0n1p3
普通はこれで行きます。普通は。しかし私の環境だと…
$ sudo grub-install /dev/nvme0n1p3 Installing for i386-pc platform. grub-install: エラー: cannot find a GRUB drive for /dev/nevm0n1p3. Check your device.map.
一応引数に--forceを取って以下のコマンドを実行すると
$ sudo grub-install --force /dev/nvme0n1p3
一応処理は完了しますが、同じエラーを吹きながらなので意味はありません。
試しにBoot-repairもやってみます。
$ sudo add-apt-repository ppa:yannubuntu/boot-repair $ sudo apt install boot-repair
Boot-repairがアプリ一覧に追加されますので開いてみましょう。それかTerminalでそのままboot-repairと打っても起動できます。
ここは「おすすめの修復」を選びます。すると処理が開始してしばらくすると、
WindowsEFI を検出しました。 Please disable BIOS-compatibility/CSM/Legacy mode in your UEFI firmware, and use this software from a live-CD (or live-USB) that is compatible with UEFI booting mode. 例えば、BIOSでUSBがEFIモードでブートする設定になっているか確認した後にBoot-Repair-Disk-64bit (www.sourceforge.net/p/boot-repair-cd)のライブUSBを使用してください。
やはりダメみたいです。
どうすればいいか
調べてみたら、パーティションの名前がヒントでした。他のサイト様をみていると大体が
(hd0,msdos1) (hd0,msdos2) ...
と、"msdos"という名前がついています。これは内蔵ディスクが「BIOSモードで起動する」という事です。一方で"gpt"というのは「UEFIモードで起動する」ということです。これはどういうことか??ブートローダの基本に立ち戻って考えます。
ブートローダの定義は曖昧ですが、一般には「BIOSとOSの間に入って仲介するもの」です。このブートローダは普通ディスクデバイスの「一番先頭のパーティション」に住んでいます。
ところが私のインストールの仕方だともともとWindows EFIというブートローダが入っていたので、grubが「Ubuntuがインストールされているパーティションの一番先頭(ブートセクタという)」にあります。grubが中途半端な位置にあるせいでパーティションをいじったときにgrubが自分とUbuntuの位置関係を見誤ってしまったのが原因なのではないかと言うわけです。
grub-installやboot-repairもgrubが本来いるべき「ディスクデバイスの先頭のパーティション」にgrubを再インストールしようとするのですが、そこにはWindows EFIがあるのでうまくできないというわけです。
ちなみにUEFIはWindows EFIの入っているパーティション(ESP)を呼び出します。同じようにgrubをUEFIモードで起動できればUbuntuを問題なく起動できます。