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 引导加载程序。
如何在 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 文件。