ArchLinuxとWindows10のデュアルブートで、Windowsの大型アップデートとかでGrubが消えるたびに再インストールしているのでメモ
ほとんどの情報は既出ですが、BIOSの操作とか、文字が小さい問題とか、matebook特有のことも書いていきます(といっても大したことないけど)
STEP0: ホントにgrubが消えたのか確認
手持ちの「Matebook X Pro」には、insydeH20が入っています。F2でBIOS設定画面の表示で、F12でデバイスを選択してbootできます。
F12を押しながら電源を入れた画面で、まずは本当にgrubがなくなっているか確認してみました。
Grubがない -> STEP1へ
Grubがある -> STEP4に進む。うまくいかなかったら、STEP1をやったあと、STEP3。それでもダメならSTEP2もしてみる
STEP1: USBブートでの設定とSSD内のLinuxに入るまで
まずはUSBからArchLinuxを起動する。起動する方のWindowsで、archのisoを落としてきて balenaEtcher で焼いちゃいます。
キーボードの配列がおかしい
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」ができてしまいました。
これの原因は、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のパスワードで入ると、ほとんどのサービスが起動できておらずネット接続等もできない状態であることが分かりました。
いろいろ調べてみると、どうやらシステム上で認識されているlinuxのバージョンとインストールされているlinuxのバージョンが違っているようです。
この場合、bootがうまくマウント出来ていない可能性があるようです。 参考
この方法が正しいのかは分かりませんが、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
に置くことを徹底することをおすすめします。