日曜日, 3月 11, 2018

Windowsアップデート後にGRUBが死んだ話

Windows10でいきなり邪魔しに来た「更新が必要です」というキャンセル不可なアップデートをさせたら、共存させていたDebianが起動しなくなりました。(別にWindows関係ないかもしんない)

詳しく言うとDebianが起動しないのではなく、あのGRUBブートローダのメニューすら出ない状態で、Rescue modeに入ってそれっきりなんです。
でもGRUBブートローダが死んだだけなので、電源投入後にF11連打して出てくる「起動するデバイスを選択」みたいなメニュー(機種によっては無いかも)からだとWindowsに限ってダイレクトに起動できました。何ででしょうね。

で、その死んだGRUB(厳密に言うと死んでいませんが)のRescue modeでDebianを復帰させるまでの過程をメモしておきます。
こういう話は調べるとたくさん出てくるのですが、環境によって名前が違ったり場所が違ったりしているので完全自分用メモです。

はい

参考というかほぼ丸パクだけど全てはこの記事のおかげです: grub rescueの正しい付き合い方


まずコマンド ls をするとパーティションの一覧が出ます
> (hd0) (hd1) (hd1,gpt1) (hd1,gpt2) ...などなど
自分のはgpt8までありました。

それから ls (hd*,gpt*) でパーティションのファイルシステムを調べることができます
> (hd1,gpt6) is ext2 filesystem.
みたいな文章だったり、Unknown filesystemだったりします。 とりあえずunknownじゃなければヒットだと思います。

ls (hd1,gpt6)/ のようにヒットしたパーティション番号にスラッシュをつけてタイプすると、そのパーティション内に入っているディレクトリの一覧が出ます
> /root /boot /etc /home /dev ...などなど
見覚えのあるやつですね。 もしこれが出なかったらLinux系のインストール時に/boot と/を分けていた可能性があるので他のパーティションをあたります。

さて次に set と打ちます
> なんて書いてあったか忘れたけど prefix=(hd1,gpt5)/boot/grub みたいな短いパスが4行くらい出ます
先ほどlsコマンドでbootの場所を調べてgpt6だと分かったのに、このprefixでgpt5が指定されているのが諸悪の根源です。bootディレクトリに辿りつけなかったんじゃないかな。

prefix=(hd1,gpt6)/boot/grub と打ってprefixを修正します
> 何も返ってきません 成功です

normal というコマンドを使うことで、この修正したset内容でGRUBを起動させることができます。(もちろん間違えてたら起動できませんが僕は一回で成功しました)
...が、その前に insmod (場所) と打ってそのnormalコマンドの場所を定義する必要があります。

参考記事をそのまま引用すると insmod (hd1,gpt6)/boot/grub/normal.mod と打てば定義してくれるはず...なんですが、「normal.modなんてファイルはない」と返ってきたので、適当に ls (hd1,gpt6)/boot/grub でmodファイルの入ってそうなディレクトリを探します。
> /x86_64-efi ...そのほかディレクトリやファイル(ここにnormal.modはありませんでした)
このx86〜というディレクトリが怪しいのでlsで調べると、modファイルがめっちゃいっぱい出てきます。残念ながらABC順で並んでないようなので適当に確信して、再び insmod (hd1,gpt6)/boot/grub/x86_64-efi/normal.mod と打ちます
> 何も返ってきません

それから normal と打って起動実行です。いつものWinかDebianかを選べるGRUBメニューが起動しました。やったね!
もちろん起動させるのはDebianです。


あくまでもこれは即席の変更で、シャットダウンするなり何なりすればまた打った内容は元に戻るそうです。 せっかく狂ったのを直したのにまた狂い戻ってしまうんですね。
/boot/grub内のファイルをいじることで直せそうな気もしますが、コメントアウトで「絶対に編集するなよ」と釘が打ってあるので、素直にGRUBの再インストールで是正してあげます。


GRUB再インストールがなんか怖かったのでバックアップを取りました。怖くない人は取らなくていいと思います。端末を開きます。
参考: GRUBを再インストールするには
こちらの記事ではhdaと指定してありますが自分のをgpartedとかで見たらsdaだったので、sudo dd if=/dev/sda of=mbr-backup.img bs=512 count=1 と打つと
 1+0 records in
 1+0 records out
 512 bytes (512 B) copied, 0.000248244 s, 2.1 MB/s
綺麗に512バイトなんですね...じゃなくて、これでバックアップ完了です。でもこれ要らないんじゃないかな(結局使わなかったので)。

それから sudo grub-install /dev/sda と打ってGRUBを上書きでインストールします。これもhdaかsdaかは機種によりますね。
 Installing for x86_64-efi platform.
 Installation finished. No error reported.
おっと見覚えのある名前が。 特にエラーも出なかったので成功です。これで再起動しても大丈夫!だと思います。

実は今ディスプレイが謎の接触不良を起こしてしまい、信号認識するかしないかハッキリしない液晶テレビで代用しているんですが、これと同時にOS起動にエラーが出ると「画面がつかないのはディスプレイのせいなのか本体のせいなのか全く分からない」という状態になって大変です。
今度はHDMI一本で音声も映像も出るディスプレイがいいなあ。

0 件のコメント:

コメントを投稿