如何恢复因 GRUB2 BLS 配置文件问题而启动失败的 Red Hat 8 或 CentOS 8 实例?
我在运行一个使用 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。有关更多信息,请参阅 Amazon EBS 和 NVMe on Linux 实例。
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. 使用正确的块储存设备映射将设备重新挂载到原实例。设备现在将使用默认内核启动。
相关信息

相关内容
- 已提问 4 个月前lg...
- 已提问 4 个月前lg...
- 已提问 3 个月前lg...
- 已提问 4 个月前lg...
- 已提问 3 个月前lg...
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前