有馬総一郎のブログ

(彼氏の事情)

2022年09月23日 11:54:21 JST - 4 minute read - Linux

UEFI画面をぐるぐる回るので、Alter Linux(Arch Linux)のGRUBを修復する

/etc/default/grubを以下のように、

# press ESC key to display menu.
- GRUB_TIMEOUT_STYLE=menu
+ GRUB_TIMEOUT_STYLE=hidden

編集後、sudo grub-mkconfig -o /boot/grub/grub.cfgして、GRUBメニューを非表示にしようとした。すると、UEFI画面をぐるぐる回ってOS起動できなくなってしまった。

以前、同じような現象を遭遇した。それはGRUBメニューのデフォルト(GRUB_DEFAULT=)が起動システム(OS)でなく、UEFI画面UEFI Firmware Settingsを選択していたために、GRUBメニュー非表示にしただけの変更でOSが起動できなくなってしまっていたのだった。

Ubuntu系ならBoot Repairで修復可能

その時は、原因・解決方法が良く分からなかったので、ブートローダ GRUBUbuntu Boot Repair その1 - OSの起動に関する問題を修復するアプリの紹介・インストールと起動 - kledgebにあるとおり、 Boot Repair をインストールして、実行することで修復した。

sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt install -y boot-repair
boot-repair

Boot Repair を起動したら、おすすめの修復またはRecommended repairを選択、確認はい、またはYesで修復実行、そして完了となる。

万が一、上手くいかない場合、以下のやり方(sdbはディスク、Xはパーティション番号で環境毎に異なる)でいけるらしいが試してない。 Boot Repair は実行ログを出力できるので、確認してみるのも良いかも知れない。

sudo mount /dev/sdbX /mnt
sudo mount --bind /dev /mnt/dev/
sudo mount --bind /dev/pts /mnt/dev/pts
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo chroot /mnt
grub-install /dev/sdb
grub-install --recheck /dev/sdb
update-grub
exit
sudo umount /mnt/sys
sudo umount /mnt/proc
sudo umount /mnt/dev/pts

Arch Linux系はBoot Repairで修復不可

そして、今回、 Alter Linux上で、同事象に再遭遇した。原因は分かっていた。しかし、/bootルートとなるパーティションをmountして、chroot(Acrh Linuxだとarch-chroot)して修復作業するのは、怖かった。 Boot Repair を実行した。しかし、Please enable a repository containing the [grub2] packages in the software sources of Alter Linux (sdb2). Then try againのようなエラーが出て修復できなかった。

これは自力で直すしかないと腹を括ってググって How to Reinstall the Boot Loader in Arch Linux - Jeremy Morgan’s Tech Blogを発見。

Alter LinuxのインストールメディアからLive USBで実行した。そのためか、efiのパスが違っていたり、os-probersudoを付けないと失敗した1。ともあれ、以下の手順で/etc/default/grubGRUB_TIMEOUT_STYLE=menuに戻して、復活した。

$ sudo mkdir /mnt/arch
$ sudo mount -t auto /dev/sda2 /mnt/arch
$ sudo arch-chroot /mnt/arch
# mount -t auto /dev/sda1 /boot/efi
# sudo os-prober
# vim /etc/default/grub
# grub-mkconfig > /boot/grub/grub.cfg
# grub-install --efi-directory=/boot/efi --target=x86_64-efi /dev/sda
# exit
$ reboot

GRUBメニュー非表示

まあ、これに凝りて、GRUBメニュー非表示にするときは、GRUB_DEFAULT=も確認、変更すべきだし、 Grubで前に起動したシステムを記憶する | Terakinizers’ Tellsのように、

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

としてしまっても良いだろう。ちなみにGRUBメニュー非表示にしても# press ESC key to display menu.と書いてあるとおり、ESCキーを押せばGRUBメニューに入れる2。速すぎると、UEFIブートメニューを出してしまう端末もあるので、タイミングが難しい。

UEFIブートメニューの削除

UEFIブートメニューもOSインストールを繰り返すとゴミが溜まっていく一方なのでメモしておく。

$ efibootmgr
BootCurrent: 0001
Timeout: 1 seconds
BootOrder: 0001,0007,0008
Boot0001* alter	HD(1,GPT,eed94499-e964-cd49-b330-c61ef647edfa,0x1000,0x96000)/File(\EFI\ALTER\GRUBX64.EFI)
Boot0007* UEFI OS	HD(1,GPT,eed94499-e964-cd49-b330-c61ef647edfa,0x1000,0x96000)/File(\EFI\BOOT\BOOTX64.EFI)0000424f
Boot0008* UEFI: Sony Storage Media 0100, Partition 2	PciRoot(0x0)/Pci(0x14,0x0)/USB(3,0)/HD(2,GPT,a9a0241c-393d-4b59-84dc-6d8754fd648e,0x3f9d64,0x40000)0000424f

efibootmgr3で確認。sudo efibootmgr -b 表示された4桁数字 -Bで削除。これ次にOSをインストールするときやLive USBを起動するときに見易くなる。


  1. rootなのにos-proberを実行するとERROR: mkdir /var/lock/dmraidと失敗。 ↩︎

  2. 焦ってるとそういうことをググろうとか、思いつかないのよねぇ。 ↩︎

  3. efibootmgr その1 - UEFIブートマネージャーを操作するコマンドの紹介・UEFIブートマネージャーに登録されているエントリーの一覧を表示する - kledgebなど参考されたし。 ↩︎