開放より2段絞ったところ

徒然なるままに…主にカメラの事を書いていくことになるかと。

Ubuntuが起動しない…grubとパーティションについて

こんにちは壁紙です。



突然なんですが、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と打っても起動できます。

f:id:kabegamikamio:20200516234505p:plain
boot-repairのGUI

ここは「おすすめの修復」を選びます。すると処理が開始してしばらくすると、

f:id:kabegamikamio:20200516234620p:plain
Windows EFIがあるからなんともならんと言われてしまいます

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があるのでうまくできないというわけです。

ちなみにUEFIWindows EFIの入っているパーティション(ESP)を呼び出します。同じようにgrubUEFIモードで起動できればUbuntuを問題なく起動できます。

結論

結びとしては正直自分でも納得が行きませんが、Ubuntuの再インストールを検討しています。Ubuntu 20.04 LTSの日本語版Remixもちょうどリリースされたタイミングですのでまぁ悪くはないかもしれませんが。