UEFIブートでGrubが消えたときにやること(matebook x pro)

ArchLinuxとWindows10のデュアルブートで、Windowsの大型アップデートとかでGrubが消えるたびに再インストールしているのでメモ

ほとんどの情報は既出ですが、BIOSの操作とか、文字が小さい問題とか、matebook特有のことも書いていきます(といっても大したことないけど)

# STEP0: ホントにgrubが消えたのか確認

手持ちの「Matebook X Pro」には、insydeH20が入っています。F2でBIOS設定画面の表示で、F12でデバイスを選択してbootできます。

F12を押しながら電源を入れた画面で、まずは本当にgrubがなくなっているか確認してみました。

![Screenshot from 2019-11-09 08-08-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/3de64a9d-2a88-98a0-0da3-37565c8d3023.png)

Grubがない -> STEP1へ
Grubがある -> STEP4に進む。うまくいかなかったら、STEP1をやったあと、STEP3。それでもダメならSTEP2もしてみる

# STEP1: USBブートでの設定とSSD内のLinuxに入るまで

まずはUSBからArchLinuxを起動する。起動する方のWindowsで、archのisoを落としてきて [balenaEtcher](https://www.balena.io/etcher/) で焼いちゃいます。

## キーボードの配列がおかしい

```
loadkeys jp106
```

## 文字が小さすぎる！

デフォルトで入っているコンソールフォントの中で、一番大きいものを指定します。多分これ。

```
setfont latarcyrheb-sun32
```

## SSDのLinuxをマウントしていく

lsblkで容量とかフォーマットを見てそれっぽいものをマウントするらしい。(ここでマウント漏れとかが出るから、fstabでの確認[次項]はしたほうがいい！

```
mount /dev/nvme0n1p6 /mnt
mount /dev/nvme0n1p7 /mnt/home
```

## fstabを開いてホントにそれでいいか確認

`/etc/fstab` に元のマウント情報が含まれているのでマウントが合ってるか確認しておきます。マウントし忘れてて穴にハマったりした。。

```
$ cat /mnt/etc/fstab
# Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>
# /dev/nvme0n1p6
UUID=abedad77-97c7-42f2-a2e6-0f7d010651f6	/         	ext4      	rw,relatime	0 1

# /dev/nvme0n1p1 LABEL=SYSTEM
UUID=DE8B-DACA      	/boot/efi 	vfat      	rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro	0 2

# /dev/nvme0n1p7
UUID=c949921b-691f-495e-b637-61dfb72bbac9	/home     	ext4      	rw,relatime	0 2
```

というわけではい、今回の場合は `/dev/nvme0n1p1`を`/boot/efi`にマウントするのを忘れていたみたいです。マウントしておきます。

```
mount /dev/nvme0n1p1 /mnt/boot/efi
```

## マウントした環境に入って作業する

```
arch-chroot /mnt
```

# STEP2: grub-installでUEFIを復活！

まずはUEFIのメニューにgrubが復活するようにやっていきましょう！！といってもこれを実行するだけです。

```
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub
```

`No error reported.`で終了すれば成功です！

もし、`grub-install: error: cannot find EFI directory.` 的なエラーが出た場合は、 「fstabを開いてホントにそれでいいか確認」に戻って正しくマウントできているか確認してみてください。

ここまでの作業が終わったら一旦再起動して確認してみましょう。F12のメニュー上にgrubが出ていると思います。それを選択して、通常通りarchが起動するようならSTEP4、起動しないならSTEP3に進んでください。

# STEP3: grub-mkconfigでgrubの設定ファイルを更新

STEP2までで成功しない場合は、grubの設定自体がうまくいってないのかも。。
そんな場合は、次のコマンドでうまくいくはずです。

```
grub-mkconfig -o /boot/efi/grub/grub.cfg
```

ただし、僕の場合、これをそのままやっても「Windowsしか起動できないgrub」ができてしまいました。

![Screenshot from 2019-11-09 08-52-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/fe7621db-c14b-a097-e436-2e865736f0aa.png)


これの原因は、grub-mkconfigがLinuxを認識できていないからです。
具体的には、起動するために、下のような「vmlinuz-linux」含むimgファイルが必要でした。

```
# pwd
/boot/efi
# ls
EFI  grub  initramfs-linux-fallback.img  initramfs-linux.img  intel-ucode.img  vmlinuz-linux
```

今回は`\boot`のバックアップをとっていたので、それを利用しました。とっていない場合でも、`pacman -S linux`をしたらうまく行きました。

この操作が完了したらまた上の`grub-mkconfig`を実行して設定ファイルを更新します。

# STEP4: bootの優先順位をあげる

これでメニューからarchを立ち上げられるようになりましたが、普通に起動してもwindowsのほうが起動順序が高くてgrubに行きません。僕が知る限り、matebookのBIOSから起動順序の変更はできなそうなので、コマンドでやってみます。

```
# efibootmgr 
Timeout: 0 seconds
BootOrder: 0001,0002,2001,2002,2003
Boot0000* EFI USB Device (TOSHIBA)
Boot0001* Windows Boot Manager
Boot0002* arch_grub
Boot2001* EFI USB Device
Boot2002* EFI DVD/CDROM
Boot2003* EFI Network

# efibootmgr -o "0002,0001,2001,2002,2003"
Timeout: 0 seconds
BootOrder: 0002,0001,2001,2002,2003
Boot0000* EFI USB Device (TOSHIBA)
Boot0001* Windows Boot Manager
Boot0002* arch_grub
Boot2001* EFI USB Device
Boot2002* EFI DVD/CDROM
Boot2003* EFI Network
```

で、arch_grubを先にブートするようにできました！
これで普通に使えると思います。ありがとうございました。

# [追記] Failed to start Load Kernel Modulesとなったとき

ある日、起動しようとすると今度は `Failed to start Load Kernel Modules`が起きて動作しませんでした。
書いてあるとおりにrootのパスワードで入ると、ほとんどのサービスが起動できておらずネット接続等もできない状態であることが分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/bba292f9-a432-bec8-79e1-35a5c97169e0.png)

いろいろ調べてみると、どうやらシステム上で認識されているlinuxのバージョンとインストールされているlinuxのバージョンが違っているようです。

![Screenshot from 2019-12-03 11-16-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/27469ba9-ba96-df06-c5ac-b1fc40d08a6f.png)

この場合、bootがうまくマウント出来ていない可能性があるようです。 [参考](https://bbs.archlinux.org/viewtopic.php?id=237249)

この方法が正しいのかは分かりませんが、boot以下を削除して以下のようにlinuxを再インストールすることでうまく行きました。

まずはインストールメディアから起動し、上記のSTEP1でarch-chrootまでします。

ルートの中身を消して

```
# cd boot
# rm -r *
```

```
# pacman -S linux base base-devel
```

で、あとはSTEP2、STEP3をやれば終了です。
`\boot`自体はrootパーテーションに、`\boot\efi`にgrubという構成にしていて混乱して時間がかかってしまいました。当たり前ですがbootパーテーションはefiの部分だけでなくて`\boot`に置くことを徹底することをおすすめします。