如何从 GRUB 丢失其条目以及在启动时仅面临“grub> _”的情况中恢复?

如何从 GRUB 丢失其条目以及在启动时仅面临“grub> _”的情况中恢复?

我成功地将系统从 CentOS 7 升级到了 AlmaLinux 8(如上所述这里)。在此过程中,发生了一些奇怪的事情,GRUB 完全丢失了它的启动项,而我为重建它们/它所做的有限努力(我真的只需要 AlmaLinux 8 内核项,而且到目前为止更新后只有一个vmlinuz+initrd图像)都失败了(特别是自从几十年前使用 Gentoo 以来,我还没有直接摆弄过 GRUB)。

目前,为了让服务器启动,我必须转到 Linode 服务器上的 LISH(特别是 Glish)控制台,这是我在重启时得到的结果:

英语:

SeaBIOS (version rel-1.12.1-0.ga5ca58e9aef-prebuilt.qemu.org)

iPXE (http://ipxe.org) 00:04.0 C980 PCI2.10 PnP PMM+7FF90F20+7FEF0F20 C980


Booting from ROM...
Welcome to GRUB!

error: variable `prefix' isn't set.

然后在 Lish 和 Weblish 中:

                             GNU GRUB  version 2.04
   Minimal BASH-like line editing is supported. For the first word, TAB
   lists possible command completions. Anywhere else TAB lists possible
   device or file completions.


grub> _

然后我必须输入下面的一些内容,这些都是我自己拼命拼凑起来的,ls (hd0)/boot/只是为了让系统启动到非单用户模式,以使其启动:

set root=(hd0)
linux /boot/vmlinuz-4.18.0-372.9.1.el8.x86_64 root=/dev/sda console=ttyS0,19200n8
initrd /boot/initramfs-4.18.0-372.9.1.el8.x86_64.img
boot

(后来经过调查和讨论,发现了一组可能应该发布的完善的启动参数:

set root=(hd0)
linux /boot/vmlinuz-4.18.0-372.9.1.el8.x86_64 root=/dev/sda ro crashkernel=auto rhgb console=ttyS0,19200n8 net.ifnames=0
initrd /boot/initramfs-4.18.0-372.9.1.el8.x86_64.img
boot

我想我可以grub2-mkconfig通过以下命令简单地修复这个问题,但正如你所看到的,它根本找不到任何条目:

$ grub2-mkconfig --output /boot/grub2/grub.cfg
Generating grub configuration file ...
done

当我们查看生成的b2/grub.cfg :: 10_linux部分时,我们看到:

### BEGIN /etc/grub.d/10_linux ###
insmod ext2
set root='hd1'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd0 --hint-efi=hd0 --hint-baremetal=ahci0 --hint='hd1'  06e9a827-47b4-43f9-8e01-91b3852f86a8
else
  search --no-floppy --fs-uuid --set=root 06e9a827-47b4-43f9-8e01-91b3852f86a8
fi
insmod ext2
set boot='hd1'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=boot --hint-bios=hd0 --hint-efi=hd0 --hint-baremetal=ahci0 --hint='hd1'  06e9a827-47b4-43f9-8e01-91b3852f86a8
else
  search --no-floppy --fs-uuid --set=boot 06e9a827-47b4-43f9-8e01-91b3852f86a8
fi

# This section was generated by a script. Do not modify the generated file - all changes
# will be lost the next time file is regenerated. Instead edit the BootLoaderSpec files.
#
# The blscfg command parses the BootLoaderSpec files stored in /boot/loader/entries and
# populates the boot menu. Please refer to the Boot Loader Specification documentation
# for the files format: https://www.freedesktop.org/wiki/Specifications/BootLoaderSpec/.

# The kernelopts variable should be defined in the grubenv file. But to ensure that menu
# entries populated from BootLoaderSpec files that use this variable work correctly even
# without a grubenv file, define a fallback kernelopts variable if this has not been set.
#
# The kernelopts variable in the grubenv file can be modified using the grubby tool or by
# executing the grub2-mkconfig tool. For the latter, the values of the GRUB_CMDLINE_LINUX
# and GRUB_CMDLINE_LINUX_DEFAULT options from /etc/default/grub file are used to set both
# the kernelopts variable in the grubenv file and the fallback kernelopts variable.
if [ -z "${kernelopts}" ]; then
  set kernelopts="root=/dev/sda ro crashkernel=auto rhgb console=ttyS0,19200n8 net.ifnames=0 "
fi

insmod blscfg
blscfg
### END /etc/grub.d/10_linux ###

确实也/boot/loader/entries/有一个文件似乎与应该通过 BLS 启动的内容相对应:

title AlmaLinux (4.18.0-372.9.1.el8.x86_64) 8.6 (Sky Tiger)
version 4.18.0-372.9.1.el8.x86_64
linux /boot/vmlinuz-4.18.0-372.9.1.el8.x86_64
initrd /boot/initramfs-4.18.0-372.9.1.el8.x86_64.img $tuned_initrd
options $kernelopts $tuned_params
id almalinux-20220510130458-4.18.0-372.9.1.el8.x86_64
grub_users $grub_users
grub_arg --unrestricted
grub_class kernel

至于grubenv

$ grub2-editenv list
saved_entry=4f09fa5fdd3642fa85221d7c11370603-4.18.0-372.9.1.el8.x86_64
kernelopts=root=/dev/sda ro crashkernel=auto rhgb console=ttyS0,19200n8 net.ifnames=0
boot_indeterminate=1

看起来启动期间的 GRUB 条目应该包含:

linux /boot/vmlinuz-4.18.0-372.9.1.el8.x86_64 root=/dev/sda ro crashkernel=auto rhgb console=ttyS0,19200n8 net.ifnames=0

但事实并非如此...而且我此时实际上还没有手动修改任何内容,所以我不知道 GRUB 在哪里/如何变得混乱。

作为健全性检查,我验证了软件包是否按预期安装:

$ dnf install kernel grub2
Last metadata expiration check: 2:31:00 ago on Fri Jun 17 13:43:41 2022.
Package kernel-4.18.0-372.9.1.el8.x86_64 is already installed.
Package grub2-pc-1:2.02-123.el8.alma.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!

最终,看起来好像 GRUB 没有找到或者无法解析grub.cfg...

我认为也许发生了某种涉及 EFI 的变化,因为看起来更新正在发生/boot/grub2/grub.cfg,并且我注意到在 生成了一个新的 EMPTY 文件夹/boot/efi/EFI/almalinux/,因此我grub.cfg也尝试在那里生成:

$ grub2-mkconfig --output /boot/efi/EFI/almalinux/grub.cfg
Generating grub configuration file ...
done

但正如您所看到的,在生成过程中仍然没有任何条目,并且当我重新启动时,也没有执行 BLS 自动生成/使用(我认为我理解它可能发生)。

以下是各个可能相关的文件夹的内容/boot/https://gist.github.com/ylluminate/d469ce8ace202a57f67f5aed255154cd

我该怎么做才能让 GRUB 重新构建和/或解析并使用正确的配置?

答案1

事实证明,在 Linode 服务器环境中解决此问题的关键是禁用GRUB_ENABLE_BLSCFG并重新运行grub2-mkconfig,例如:

$ nano /etc/default/grub
### set: GRUB_ENABLE_BLSCFG=false
$ grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.18.0-372.9.1.el8.x86_64
Found initrd image: /boot/initramfs-4.18.0-372.9.1.el8.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-4f09fa5fdd3642fa85221d7c11370603
Found initrd image: /boot/initramfs-0-rescue-4f09fa5fdd3642fa85221d7c11370603.img
done

相关内容