GRUB (GRand Unified Bootloader)2 作为 GNU 项目的一部分,是很多著名 Linux 发行版例如 RHEL、CentOS 以及 Ubuntu 等的默认引导程序。GRUB 是主机启动时最先运行的程序,其主要任务是加载内核程序,加载成功后,由内核程序初始操作系统的其他程序。
如果 GRUB 程序出现问题,则最直接的后果就是主机不能正常启动。如果作为系统管理人员,当遇到这类问题,可以尝试恢复 GRUB 程序而解决启动故障。
本教程将详细讨论 CentOS 8 出现以下三种情形时,如何通过修复 GRUB 程序来重新启动主机:
- GRUB 配置文件 grub.cfg 出错或丢失
- CentOS 8 的内核程序例如 vmlinuz-4.x 出错或丢失
- CentOS 8 的初始化进程例如 initramfs-4.x 出错或丢失
1] 实验环境
- 操作系统:CentOS 8
- 主机名:CentOS-8
- IP 地址:172.16.200.1
2] CentOS 8 系统如何恢复 gurb.cfg
首先登录到主机,然后使用如下命令模拟 grub.cfg 文件丢失:
# rm -rf /boot/grub2/grub.cfg
命令执行后,系统仍然可以顺畅的运行,直到我们重新启动主机,系统就会因为找不到 grub.cfg 文件而启动失败:
图.1 删除 grub.cfg 文件后系统启动失败
见到这个界面后,也不必着急,因为还有处理办法。
首先将 CentOS 8 的系统安装盘装入主机,通过光盘启动主机,使用系统盘的恢复功能修复问题:
图.2 CentOS 8 镜像启动后选择进入故障处理界面
系统启动后,将光标移动至”Troubleshooting”,然后回车,进行故障处理界面:
图.3 选择故障处理内容
我们想要让已经安装的系统重新启动,当然选择”Rescue a CentOS Linux system”进行系统恢复,将光标移动至此项目后,点击回车继续:
图.4 进入恢复命令提示行
恢复工具首先要要求选择是否挂载原来的文件系统,输入”1″选择挂载后按回车,我们之前的系统就会被挂载到”/mnt/sysimage”目录,之后,会进入恢复程序的命令提示符。
根据前面的提示,输入如下命令即可以使用我们原来的文件系统:
sh-4.4# chroot /mnt/sysimage
使用如下命令,则会重新生成”grub.cfg”文件:
bash-4.4# grub2-mkconfig -o /boot/grub2/grub.cfg
如果主机采用 UEFI 方式启动,则使用如下命令:
bash-4.4# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
如果系统启用了SELinux,则使用如下命令创建一个触发重标记进程的文件:
bash-4.4# touch /.autorelabel
最后,退出当前SHELL并重新启动主机:
bash-4.4# exit sh-4.4# reboot
图.5 使用重新创建的启动菜单文件启动 CentOS 8
至此,我们已经成功恢复了”grub.cfg”文件,系统可以正常启动。
3] CentOS 8 系统如何恢复内核文件 vmlinuz-4.x
同样,我们首先模拟一个破坏性操作,注意要删除当然系统启动的内核,否则达不到破坏效果:
# rm -f /boot/vmlinuz-4.18.0-80.el8.x86_64
找不到内核文件,系统在启动时会提示出错,之后的操作同恢复启动菜单类似,通过 CentOS 8 系统盘启动系统,进入故障处理程序,然后选择系统恢复菜单,进入恢复命令提示符。使用如下命令重新安装一个内核文件:
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 sh-4.4# reboot
图.6 CentOS 8 系统恢复内核文件
从图.6中可以明显的看到命令执行的效果,原来没有的内核文件被成功创建。重新系统后,会以此内核重新启动系统,我们也成功的将内核文件受到破坏的系统进行了修复。
4] CentOS 8 系统如何恢复初始化守护进程 initrd
系统初始化进程同样位于”/boot”目录,使用如下命令模拟初始化进程文件损坏:
# rm -f /boot/initramfs-4.18.0-80.el8.x86_64.img
之后的步骤同前面一样,进入恢复命令提示符,使用如下命令恢复初始化程序:
sh-4.4# chroot /mnt/sysimage bash-4.4# dracut bash-4.4# ls /boot/initramfs-* bash-4.4# exit sh-4.4# reboot
图.7 CentOS 8 系统恢复初始化进程
以上就是关于 CentOS 8 系统修复 GRUB 2 的所有内容。