如何恢复因 GRUB2 BLS 配置文件问题而启动失败的 Red Hat 8 或 CentOS 8 实例?

上次更新时间:2020 年 2 月 3 日

我在运行一个使用 Red Hat 8 或 CentOS 8 的 Amazon Elastic Compute Cloud (Amazon EC2) 实例。如果 /boot/loader/entries/ 下的 BLS 配置文件 (blscfg) 损坏或被删除,我该如何恢复它?

简短描述

RHEL 8 和 Centos 8 中的 GRUB2 将 blscfg 文件和 /boot/loader 中的条目用作启动配置,不再使用以前的 grub.cfg 格式。建议使用 grubby 工具来管理 blscfg 文件和检索 /boot/loader/entries/ 中的信息。如果在此缺失 blscfg文件或该文件损坏,则 grubby 不会显示任何结果。您必须重新生成文件才能恢复功能。要重新生成 blscfg 文件,请创建一个临时救援实例,然后将您的 Amazon Elastic Block Store (Amazon EBS) 卷重新挂载到该救援实例上。从救援实例重新生成任何已安装内核的 blscfg 文件。

重要提示:请勿在实例存储支持的实例上执行此操作。此恢复方法需要首先停止然后再重启实例,这意味着该实例上的任何数据都将丢失。有关更多信息,请参阅确定实例的根设备类型

解决方法

将根卷连接到救援 EC2 实例

1.    为根卷创建 EBS 快照。有关详细信息,请参阅创建 Amazon EBS 快照

2.    打开 Amazon EC2 控制台

注意:请确保您位于正确的 区域。Amazon EC2 控制台在账户信息的右侧显示您所在的区域。如果需要,您可以从下拉菜单中选择其他区域。

3.    从导航窗格中选择实例,然后选择受损的实例。

4.    依次选择操作实例状态停止

5.    在描述选项卡中的根设备下,选择 /dev/sda1,然后选择 EBS ID

6.    依次选择操作分离卷是,分离。记下可用区

7.    在同一可用区中启动一个类似的救援 EC2 实例。此实例将成为您的救援实例。

8.    启动救援实例后,从导航窗格中选择,然后选择已分离的受损实例根卷。

9.    选择操作,然后选择挂载卷

10.    选择救援实例 ID (id-xxxxx),然后设置一个未使用的设备。在此例中,未使用的设备为 /dev/sdf

挂载受损实例的卷

1.    使用 SSH 连接到救援实例。

2.    运行 lsblk 命令以查看可用的磁盘设备。

[ec2-user@ip-10-10-1-111 /]s lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  10G  0 disk
├─xvda1 202:1    0   1M  0 part
└─xvda2 202:2    0  10G  0 part /
xvdf    202:80   0  10G  0 disk
├─xvdf1 202:81   0   1M  0 part
└─xvdf2 202:82   0  10G  0 part 

注意:基于 Nitro 的实例会将 EBS 卷作为 NVMe 块储存设备公开。lsblk 命令在基于 Nitro 的实例上生成的输出显示磁盘名称为 nvme[0-26]n1。有关更多信息,请参阅 Linux 实例上的 Amazon EBS 和 NVMe

3.    创建一个挂载目录,然后将挂载卷的根分区挂载到此新目录。在上例中,挂载卷的根分区为 /dev/xvdf2。有关更多信息,请参阅使 Amazon EBS 卷可在 Linux 上使用

sudo mkdir /mount
sudo mount /dev/xvdf2 /mount

4.    将救援实例的 /dev/run/proc/sys 挂载至与新挂载卷相同的路径。

sudo mount -o bind /dev /mount/dev
sudo mount -o bind /run /mount/run
sudo mount -o bind /proc /mount/proc 
sudo mount -o bind /sys /mount/sys

5.    启动 chroot 环境。

sudo chroot /mount

重新生成 blscfg 文件

1.    运行 rpm 命令。记下实例的可用内核。

[root@ip-10-10-1-111 ~]# rpm -q --last kernel
kernel-4.18.0-147.3.1.el8_1.x86_64 Tue 21 Jan 2020 05:11:16 PM UTC
kernel-4.18.0-80.4.2.el8_0.x86_64 Tue 18 Jun 2019 05:06:11 PM UTC

2.    要重新创建 blscfg 文件,请运行 kernel-install 命令。

注意:kernel-install 二进制文件随 systemd-udev rpm 安装包一起提供。

sudo kernel-install add 4.18.0-147.3.1.el8_1.x86_64 /lib/modules/4.18.0-147.3.1.el8_1.x86_64/vmlinuz 

4.18.0-147.3.1.el8_0.x86_64 替换为您的内核版本号。

指定内核的 blscfg 文件将在 /boot/loader/entries/ 下重新生成。

[root@ip-10-10-1-111 ~]# ls /boot/loader/entries/
2bb67fbca2394ed494dc348993fb9b94-4.18.0-147.3.1.el8_1.x86_64.conf

3.    如果需要,请为实例上安装的其他内核重复第 2 步。最新内核将被设为默认内核。

4.    运行 grubby 命令 --default kernel 以查看当前默认内核。

sudo grubby --default-kernel

5.    退出 chroot 并卸载 /dev/run/proc/sys 挂载。

Exit
sudo umount /mount/dev
sudo umount /mount/run
sudo umount /mount/proc
sudo umount /mount/sys
sudo umount /mount

6.    使用正确的块储存设备映射将设备重新挂载到原实例。设备现在将使用默认内核启动。