使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

更新导致 Amazon EC2 实例无法成功重启时,我如何恢复到已知的稳定内核?

4 分钟阅读
0

更新导致我的 Amazon Elastic Compute Cloud (Amazon EC2) 实例无法成功重启,我想恢复到稳定的内核。

简短描述

如果您对 Amazon EC2 Linux 实例进行了内核更新,但内核现在已损坏,则该实例无法重启。您无法使用 SSH 连接到受损实例。

解决方法

**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误消息,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

访问实例的根卷

访问根卷的方法有两种。选择最适合您的用例的一种方法。

使用 EC2 Serial Console

如果您启用了适用于 Linux 的 EC2 Serial Console,则可以将其用于对基于 Nitro 的实例类型进行故障排除。Serial Console 可帮助您解决启动问题、网络配置和 SSH 配置问题。Serial Console 无需有效的网络连接即可连接到您的实例。使用 Amazon EC2 控制台或 AWS 命令行界面 (AWS CLI) 访问 Serial Console。

在使用 Serial Console 之前,在账户级别授予其访问权限。然后,创建 AWS Identity and Access Management (IAM) 策略,向您的 IAM 用户授予访问权限。每个使用 Serial Console 的实例都必须包含至少一个基于密码的用户。有关详细信息,请参阅配置对 EC2 Serial Console 的访问

如果您的实例无法访问,且您没有配置对串行控制台的访问权限,请按照以下部分中的说明操作。

使用救援实例

创建一个临时救援实例,然后将您的 Amazon Elastic Block Store (Amazon EBS) 卷重新挂载到该救援实例上。在救援实例中,将您的 GNU GRUB 配置为使用以前的内核。

**重要事项:**请勿在实例存储支持的实例上执行此过程。由于恢复过程需要停止和启动您的实例,因此该实例上的所有数据均将丢失。有关更多信息,请参阅确定实例的根设备类型

  1. 创建根卷的 Amazon EBS 快照。有关更多信息,请参阅创建 Amazon EBS 快照
  2. 打开 Amazon EC2 控制台
    **注意:**请确保您位于正确的区域。
  3. 从导航窗格中选择 Instances(实例),然后选择受损实例。
  4. 选择 Instance State(实例状态)、Stop instance(停止实例),然后选择 Stop(停止)。
  5. Storage(存储)选项卡的 Block devices(块设备)下,选择 /dev/sda1/dev/xvda卷 ID
    **注意:**根设备因 AMI 而异,但是 /dev/xvda/dev/sda1 是为根设备保留的。例如,Amazon Linux 1、Amazon Linux 2 和 Amazon Linux 2023 使用 /dev/xvda。其他发行版(如 Ubuntu 14、16、18、CentOS 7 和 RHEL 7.5)使用 /dev/sda1
  6. 选择 Actions(操作)、Detach Volume(分离卷),然后选择 Yes, Detach(是,分离)。
    **注意:**为了帮助在后续步骤中识别 EBS 卷,请在分离该卷之前对其进行标记
  7. 在快照所在的同一可用区内启动救援 EC2 实例。
    **注意:**根据产品代码,您可能需要启动相同操作系统类型的 EC2 实例。例如,如果受损的 EC2 实例是付费 RHEL AMI,则必须启动具有相同产品代码的 AMI。有关详细信息,请参阅获取您的实例的产品代码
  8. 救援实例启动后,从导航窗格中选择 Volumes(卷)。然后选择受损实例的已分离根卷。
  9. 选择 Actions(操作)、Attach Volume(连接卷)。
  10. 选择救援实例 ID (id-#####),然后设置未使用的设备。在此示例中,为 /dev/sdf
  11. 使用 SSH 连接到救援实例。
  12. 要查看可用的磁盘设备,请运行 lsblk 命令: 以下是输出示例:
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0     0   15G  0 disk
└─xvda1 202:1     0   15G  0 part /
xvdf    202:0     0   15G  0 disk
    └─xvdf1 202:1 0   15G  0 part

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

NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1        259:0    0    8G  0 disk
└─nvme0n1p1    259:1    0    8G  0 part /
└─nvme0n1p128  259:2    0    1M  0 part
nvme1n1        259:3    0  100G  0 disk
└─nvme1n1p1    259:4    0  100G  0 part /
  1. 要成为 root 用户,请运行以下命令:
sudo -i
  1. 将已挂载卷的根分区挂载到 /mnt。在以下示例中,/dev/xvdf1/dev/nvme1n1p1 是已挂载卷的根分区。有关详细信息,请参阅使 Amazon EBS 卷可用。将 /dev/xvdf1 替换为卷的正确根分区。
mount -o nouuid /dev/xvdf1 /mnt

**注意:**如果您的配置中不存在 /mnt,则创建挂载目录。然后,将已挂载卷的根分区挂载到新目录中。

mkdir /mnt
mount -o nouuid /dev/xvdf1 /mnt

接着,您可以通过挂载目录访问受损实例的数据。 将救援实例的 /dev/run/proc/sys 挂载到与新挂载的卷相同的路径上:

for m in dev proc run sys; do mount -o bind {,/mnt}/$m; done

调用 chroot 函数以切换到挂载目录。

**注意:**如果您有单独的 /boot 分区,请在运行以下命令之前将其挂载到 /mnt/boot

chroot /mnt

更新 GRUB 引导加载程序中的默认内核

当前损坏的内核在列表中的位置为 0(零)。最近的一个稳定内核位于位置 1。要将损坏的内核替换为稳定的内核,请根据您的发行版使用以下过程之一。

适用于 Red Hat 6 和 Amazon Linux 1 的 GRUB1(旧版 GRUB)

使用 sed 命令将损坏的内核替换为 /boot/grub/grub.conf 文件中的稳定内核:

sed -i '/^default/ s/0/1/' /boot/grub/grub.conf

适用于 Ubuntu 14 LTS、16.04 和 18.04 的 GRUB2

完成以下步骤:

  1. 将损坏的 GRUB_DEFAULT=0 默认菜单项替换为 /etc/default/grub 文件中稳定的 GRUB_DEFAULT=saved 值:

    sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub
  2. 要确保 GRUB 识别出更改,请运行 update-grub 命令:

    update-grub
  3. 运行 grub-set-default 命令,以便在下次重启时加载稳定的内核。在以下示例中,grub-set-default 在位置 0 处设为 1

    grub-set-default 1

适用于 RHEL 7 和 Amazon Linux 2 的 GRUB2

完成以下步骤:

  1. 将损坏的 GRUB_DEFAULT=0 默认菜单项替换为 /etc/default/grub 文件中稳定的 GRUB_DEFAULT-saved 值:

    sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/g' /etc/default/grub
  2. 更新 GRUB 以重新生成 /boot/grub2/grub.cfg 文件:

    grub2-mkconfig -o /boot/grub2/grub.cfg
  3. 要确保在下次重启时加载稳定的内核,请运行 grub2-set-default 命令。在以下示例中,grub2-set-default 在位置 0 处设为 1

    grub2-set-default 1

适用于 RHEL 8 和 CentOS 8 以及 Amazon Linux 2023 的 GRUB2

GRUB2 使用 blscfg 文件和 /boot/loader 中的条目进行启动配置,而不是之前的 grub.cfg 格式。最佳实践是使用 grubby 工具来管理 blscfg 文件并从 /boot/loader/entries/ 检索信息。如果 blscfg 文件丢失或损坏,则 grubby 不会显示任何结果。您必须重新生成文件才能恢复功能。内核的索引取决于 /boot/loader/entries 下的 .conf 文件以及内核版本。索引使最新的内核保持最低的索引。如需更多信息,请参阅我如何恢复由于 GRUB2 BLS 配置文件问题无法启动的 Red Hat 8 或 CentOS 8 实例?

完成以下步骤:

  1. 要查看当前的默认内核,运行 grubby --default-kernel 命令:

    grubby --default-kernel
  2. 要查看所有可用的内核及其索引,请运行 grubby --info=ALL 命令:

    grubby --info=ALL

    以下是 --info=ALL 命令的输出示例:

    root@ip-172-31-29-221 /]# grubby --info=ALL
    index=0
    kernel="/boot/vmlinuz-4.18.0-305.el8.x86_64"
    args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto $tuned_params"
    root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
    initrd="/boot/initramfs-4.18.0-305.el8.x86_64.img $tuned_initrd"
    title="Red Hat Enterprise Linux (4.18.0-305.el8.x86_64) 8.4 (Ootpa)"
    id="0c75beb2b6ca4d78b335e92f0002b619-4.18.0-305.el8.x86_64"
    index=1
    kernel="/boot/vmlinuz-0-rescue-0c75beb2b6ca4d78b335e92f0002b619"
    args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto"
    root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
    initrd="/boot/initramfs-0-rescue-0c75beb2b6ca4d78b335e92f0002b619.img"
    title="Red Hat Enterprise Linux (0-rescue-0c75beb2b6ca4d78b335e92f0002b619) 8.4 (Ootpa)"
    id="0c75beb2b6ca4d78b335e92f0002b619-0-rescue"
    index=2
    kernel="/boot/vmlinuz-4.18.0-305.3.1.el8_4.x86_64"
    args="ro console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto $tuned_params"
    root="UUID=d35fe619-1d06-4ace-9fe3-169baad3e421"
    initrd="/boot/initramfs-4.18.0-305.3.1.el8_4.x86_64.img $tuned_initrd"
    title="Red Hat Enterprise Linux (4.18.0-305.3.1.el8_4.x86_64) 8.4 (Ootpa)"
    id="ec2fa869f66b627b3c98f33dfa6bc44d-4.18.0-305.3.1.el8_4.x86_64"

    记下您为实例设置的默认内核路径。在此示例中,索引 2 处的内核的路径为**/boot/vmlinuz- 0-4.18.0-80.4.2.el8_1.x86_64**。

  3. 要更改实例的默认内核,请运行 grubby --set-default 命令:

    grubby --set-default=/boot/vmlinuz-4.18.0-305.3.1.el8_4.x86_64

    **注意:**将 4.18.0-305.3.1.el8_4.x86_64 替换为您的内核版本号。

  4. 要验证前面的命令是否成功,请运行 grubby --default-kernel 命令:

    grubby --default-kernel

    如果您通过 EC2 Serial Console 访问实例,则现在会加载稳定的内核,您可以重启该实例。如果您使用救援实例,请完成下一节中的步骤。

卸载卷,从救援实例上分离根卷,然后将该卷连接到受损实例

如果您使用救援实例访问根卷,请完成以下步骤:

  1. 运行以下命令退出 chroot,然后卸载 /dev/run/proc/sys

    exit
    umount /mnt/{dev,proc,run,sys,}
  2. Amazon EC2 控制台中,选择 **Instances(实例)。**然后,选择救援实例。

  3. 选择 Instance State(实例状态)、Stop instance(停止实例),然后选择 Yes, Stop(是,停止)。

  4. 将根卷的受损实例与救援实例分离。

  5. 将您分离到受损实例的根卷作为根卷 (/dev/sda1) 附加到受损实例。然后,启动实例。

**注意:**根设备因 AMI 而异。名称 /dev/xvda/dev/sda1 是为根设备保留的。例如,Amazon Linux 1、Amazon Linux 2 和 Amazon Linux 2023 使用 /dev/xvda。其他发行版(如 Ubuntu 14、16、18、CentOS 7 和 RHEL 7.5)使用 /dev/sda1。

现在,稳定的内核已加载,您的实例将重新启动。

AWS 官方
AWS 官方已更新 6 个月前