跳至内容

如何解决 EC2 实例的“Kernel panic - not syncing”(内核崩溃 - 无法同步)错误?

3 分钟阅读
0

由于缺少 initramfs 或内核模块,我想升级内核或重启我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例。但是,我收到“Kernel panic - not syncing”(内核崩溃 - 无法同步)错误。

简短描述

当设备或地址不存在时,会出现“Kernel panic - not syncing”(内核崩溃 - 无法同步)错误。要解决此问题,请启动一个临时实例,然后将故障根磁盘作为辅助驱动器连接以执行诊断。

**重要事项:**在停止并启动实例之前,请执行以下操作:

**注意:**当停止并启动某个实例时,该实例的公共 IP 地址将发生变化。最佳做法是使用弹性 IP 地址而不是公共 IP 地址将外部流量路由到您的实例。

有关详细信息,请参阅在停止实例时发生的情况

解决方法

**注意:**以下解决步骤仅适用于 Amazon Linux 2、Amazon Linux 2023、Fedora 16 及更高版本以及 Red Hat Enterprise Linux (RHEL) 7 及更高版本。

要将根磁盘连接到临时实例,请完成以下步骤:

  1. 获取原始实例的根卷的卷 ID 和设备名称

  2. 停止原始实例

  3. 从同一可用区内具有相同 Linux 操作系统 (OS) 版本的亚马逊机器映像 (AMI) 启动一个临时实例

  4. 将根卷与原始实例分离,然后将其作为辅助卷连接到临时实例。记下卷设备名称。

  5. 使用 SSH 密钥对连接到临时实例

  6. 要更改为根用户,请运行以下命令:

    sudo su
  7. 要确定块设备名称和分区,请从临时实例运行以下命令:

    lsblk

    示例输出:

    NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0    8G  0 disk
    └─xvda1 202:1    0    8G  0 part /
    xvdf    202:80   0  101G  0 disk
    └─xvdf1 202:81   0  101G  0 part
    xvdg    202:80   0   10G  0 disk

    此示例使用带有 blkfront 驱动程序的 XEN 实例。

  8. 如果您使用分区卷,请运行以下命令来挂载分区 /dev/xvdf1,而不是设备 /dev/xvdf

    mount -o nouuid  /dev/xvdf1 /mnt

    注意:****/dev/xvda/dev/xvdf 都是分区卷,而 /dev/xvdg 不是。
    如果您使用基于 AWS Nitro System 构建的实例,则卷设备名称类似于 /dev/nvme[0-26]n1。要将分区挂载到 /mnt 目录上,请运行以下命令:

    mount -o nouuid  /dev/nvme1n1p1 /mnt

    **注意:**请将 nvme1n1p1 替换为您在步骤 7 中确定的块设备名称。有关详细信息,请参阅 Amazon EC2 实例上卷的设备名称

  9. 要在 /mnt 目录中创建 chroot 环境,请运行以下命令:

    for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt

    此示例从原始根文件系统中绑定挂载 /dev/proc/sys/run 目录。此配置允许在 chroot 环境中运行的进程访问这些系统目录。

  10. 要在 / 目录中创建 initramfs 的备份,请运行以下命令:

for file in /boot/initramfs-*.img; do cp "${file}" "/$(basename "$file")_$(date +%Y%m%d)"; done
  1. 要列出默认内核,请运行以下命令:
grubby --default-kernel

示例输出:

/boot/vmlinuz-5.15.156-102.160.amzn2.x86_64

上述输出将列出启动时启动的内核。 要列出启动目录中的内核和 initramfs,请运行以下命令:

 ls -lh /boot/vmlinuz* && ls -lh /boot/initr*

示例输出:

-rwxr-xr-x. 1 root root 9.7M Apr 23 20:37 /boot/vmlinuz-5.10.215-203.850.amzn2.x86_64-rwxr-xr-x. 1 root root 9.9M Apr 23 17:00 /boot/vmlinuz-5.15.156-102.160.amzn2.x86_64
-rw-------. 1 root root 12M May 3 23:45 /boot/initramfs-5.10.215-203.850.amzn2.x86_64.img
-rw-------. 1 root root 9.8M May 14 08:03 /boot/initramfs-5.15.156-102.160.amzn2.x86_64.img

记下具有相应 initramfs 文件的 vmlinuz 内核文件。 要重建 initramfs,请运行以下命令:

dracut --force --verbose /boot/initramfs-kernelVersion.img kernelVersion

**注意:**将 kernelVersion 替换为最新的内核版本。 要确定该实例是在 UEFI 还是 BIOS 上启动,请运行以下命令:

boot_mode=$(ls /sys/firmware/efi/efivars >/dev/null 2>&1 && echo "EFI" || echo "BIOS"); echo "Boot mode detected: $boot_mode"
  1. 更新 grub 配置。如果实例在 BIOS 上启动,请运行以下命令:
grub2-mkconfig -o /boot/grub2/grub.cfg

**注意:**运行上述命令时,您可能会收到“device-mapper:在 osprober-linux-xvda2 (253:0) 上重新加载 ioctl 失败: 设备或资源繁忙,命令失败”错误消息。要解决此问题,请将 GRUB_DISABLE_OS_PROBER=true 参数添加到 /etc/default/grub 文件中,然后再次运行该命令。
如果实例在 UEFI 上启动,请根据您的操作系统运行以下命令。
UEFI:
Amazon Linux 2 和 Amazon Linux 2023:

grub2-mkconfig -o /boot/efi/EFI/amzn/grub.cfg

Fedora 16+:

grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

Red Hat 7+:

grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
  1. 要退出并分离卷,请运行下面的命令:
exit; umount -fl /mnt
  1. 将辅助卷与临时实例分离,并将其作为根设备连接到原始实例。使用您在步骤 4 中记下的设备名称。
  2. 连接到原始实例
AWS 官方已更新 1 年前