如何在 CentOS 8 中恢复 GRUB 2 引导加载程序

GRUB (GRand Unified Bootloader) 2 是 RHEL、CentOS、Ubuntu 等著名 Linux 发行版的默认引导程序。

GRUB 是第一个在计算机启动时运行的软件程序。
GRUB 负责加载内核软件。
然后内核初始化操作系统的其余部分。

在某些情况下 GRUB 引导加载程序已损坏。
在这种情况下,系统管理员必须执行 GRUB 的恢复。

在本文中,我们将讨论以下四种情况以及如何在 CentOS 8 服务器中恢复 GRUB 2 引导加载程序。

  • GRUB 菜单例如:grub.cfg 已损坏或者丢失。
  • CentOS 8 内核例如:vmlinuz-4.x 已损坏或者丢失。
  • CentOS 8 initrd 例如:initramfs-4.x 已损坏或者丢失。
  • /boot 目录已损坏或者丢失。

如何在 CentOS 8 中恢复 /boot 目录:

为了演示此恢复方案,我们将删除 /boot 目录。

[root@grub-recovery-01 ~]# rm -rf /boot/*

重新启动系统。

[root@grub-recovery-01 ~]# systemctl reboot

重新启动后,GRUB 将显示“grub rescue”提示。

.
error: ../../grub-core/fs/fshelp.c:258:file '/grub2/i386-pc/normal.mod' not found.
Entering rescue mode...
grub rescue>

重新启动系统并使用 CentOS 8 ISO/DVD 引导。

在 CentOS 8 安装菜单中,选择故障排除并按 <ENTER>。

选择 Rescue a CentOS Linux system 并按 <ENTER>。

它将要求我们安装文件系统,选择选项和“1”,然后按 <ENTER>。

再次按 <ENTER> 以获取shell。

CentOS 8 DVD/ISO 安装在 mnt 目录中。

转到 BaseOS 包目录。

sh-4.4# cd /mnt/install/repo/BaseOS/Packages

使用以下命令重新安装内核核心包。

sh-4.4# rpm -ivh --root=/mnt/sysimage --replacepkgs kernel-core-4.18.0-80.el8.x86_64.rpm
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:kernel-core-4.18.0-80.el8        ################################# [100%]
grub2-editenv: error: cannot open '/boot/grub2/grubenv.new': No such file or directory.

忽略上述错误,我们将手动创建此文件。

运行 chroot 将 /mnt/sysimage 挂载为根目录。

sh-4.4# chroot /mnt/sysimage

使用以下命令重新安装 GRUB 2.

bash-4.4# grub2-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.

使用 grub2-mkconfig 命令重新创建 grub.cfg(GRUB 菜单)。

bash-4.4# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
done

如果我们使用的是 SELinux,则创建以下文件以在下次启动时触发 SELinux 文件重新标记过程。

bash-4.4# touch /.autorelabel

最后退出 chrooted 环境并重新启动系统。

bash-4.4# exit
sh-4.4# reboot

使用硬盘启动,这次它会显示 GRUB 启动菜单。

我们已成功恢复 CentOS 8 上的 /boot 目录。

我们已经讨论了所有四种情况,并演示了如何在 CentOS 8 中恢复 GRUB 2 引导加载程序。

更多: zhilu jiaocheng

如何在 CentOS 8 中恢复 initrd 镜像:

为了进行此恢复方案,我们将删除 initramfs-4.18.0-80.el8.x86_64.img 文件。

[root@grub-recovery-01 ~]# rm -f /boot/initramfs-4.18.0-80.el8.x86_64.img

重新启动系统。

[root@grub-recovery-01 ~]# systemctl reboot

重新启动后,GRUB 将显示以下警告并且无法找到 initramfs-4.x 文件。

error: ../../grub-core/fs/fshelp.c:258:file
'/initramfs-4.18.0-80.el8.x86_64.img' not
found.
Press any key to continue...

重新启动系统并使用 CentOS 8 ISO/DVD 引导。

在 CentOS 8 安装菜单中,选择故障排除并按 <ENTER>。

选择 Rescue a CentOS Linux system 并按 <ENTER>。

它将要求我们安装文件系统,选择选项和“1”,然后按 <ENTER>。

再次按 <ENTER> 以获取shell。

执行 chroot 命令来访问我们的文件系统。

sh-4.4# chroot /mnt/sysimage

使用 dracut 命令重新创建 initramfs-4.x 文件。

bash-4.4# dracut

验证 initramfs-4.x 文件是否由 dracut 命令创建。

bash-4.4# ls /boot/initramfs-*
/boot/initramfs-0-rescue-9239012f800e401d86d70eef6bc4f8b6.img
/boot/initramfs-4.18.0-80.el8.x86_64.img

现在退出 chroot 并重新启动系统。

bash-4.4# exit
sh-4.4# reboot

GRUB 现在将能够加载 initrd 镜像,并且我们将在成功启动后到达登录提示。

CentOS Linux 8 (Core)
Kernel 4.18.0-80.el8.x86_64 on an x86_64
grub-recovery-01 login:

CentOS 8 initrd 镜像已恢复。

如何在 CentOS 8 中恢复 vmlinuz-4.x(内核):

为了说明这种恢复方案,我们将删除 vmlinuz-4.18.0-80.el8.x86_64 文件。

[root@grub-recovery-01 ~]# rm -f /boot/vmlinuz-4.18.0-80.el8.x86_64

重新启动系统。

[root@grub-recovery-01 ~]# systemctl reboot

启动时,GRUB 将显示以下警告并且无法加载内核文件。

error: ../../grub-core/fs/fshelp.c:258:file '/vmlinuz-4.18.0-80.el8.x86_64' not 
found.
error: ../../grub-core/loader/i386/pc/linux.c:413:you need to load the kernel
first.
Press any key to continue...

重新启动系统并使用 CentOS 8 ISO/DVD 启动。

在 CentOS 8 安装菜单中,选择故障排除并按 <ENTER>。

选择 Rescue a CentOS Linux system 并按 <ENTER>。

它将要求我们安装文件系统,选择选项和“1”,然后按 <ENTER>。

再次按 <ENTER> 以获取shell。

转至 ISO/DVD 中的 Packages 目录。

sh-4.4# cd /mnt/install/repo/BaseOS/Packages

使用以下命令重新安装 CentOS 8 内核。

sh-4.4# rpm -ivh --root=/mnt/sysimage --replacepkgs kernel-core-4.18.0-80.el8.x86_64.rpm
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:kernel-core-4.18.0-80.el8        ################################# [100%]

验证 vmlinuz-4.x 文件是否由安装程序创建。

sh-4.4# ls /mnt/sysimage/boot/vmlinuz*
/mnt/sysimage/boot/vmlinuz-0-rescue-9239012f800e401d86d70eef6bc4f8b6
/mnt/sysimage/boot/vmlinuz-4.18.0-80.el8.x86_64

如果我们使用的是 SELinux,则创建以下文件以在下次启动时触发 SELinux 文件重新标记过程。

sh-4.4# touch /mnt/sysimage/.autorelabel

现在重新启动系统。

sh-4.4# reboot

GRUB 现在将能够加载内核,并且我们将在成功启动后到达登录提示。

CentOS Linux 8 (Core)
Kernel 4.18.0-80.el8.x86_64 on an x86_64
grub-recovery-01 login:

我们已经成功恢复了 CentOS 8 内核。

如何在 CentOS 8 中恢复 grub.cfg(GRUB 菜单):

为了测试,我们删除了 grub.cfg。

[root@grub-recovery-01 ~]# rm -f /boot/grub2/grub.cfg

系统将继续顺利运行,除非我们重新启动它,然后它将无法找到 grub.cfg 文件并且无法启动 CentOS 8 操作系统。

现在重新启动系统。

[root@grub-recovery-01 ~]# systemctl reboot

由于缺少 grub.cfg 文件,机器现在将引导至 GRUB 提示符。

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>

重新启动系统并使用 CentOS 8 ISO/DVD 引导。

在 CentOS 8 安装菜单中,选择故障排除并按 <ENTER>。

选择 Rescue a CentOS Linux system 并按 <ENTER>。

它将要求我们安装文件系统,选择选项和“1”,然后按 <ENTER>。

再次按 <ENTER> 以获取shell。

执行 chroot 命令来访问你的文件系统。

sh-4.4# chroot /mnt/sysimage

通过使用 grub2-mkconfig 命令,我们可以重新生成 grub.cfg 文件。

bash-4.4# grub2-mkconfig -o /boot/grub2/grub.cfg

如果我们在基于 UEFI 的机器上工作,那么我们必须在 /boot/efi/EFI/centos/ 目录中生成 grub.cfg 文件。

如果我们正在使用 SELinux ,则创建以下文件以在下次启动时触发 SELinux 文件重新标记过程。

bash-4.4# touch /.autorelabel

最后退出 chrooted 环境并重新启动系统。

bash-4.4# exit
sh-4.4# reboot

使用硬盘启动,这次它会显示 GRUB 启动菜单。

我们已经在 CentOS 8 上成功恢复了 grub.cfg 文件。

日期:2020-09-17 00:12:55 来源:oir作者:oir