AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
如何解决 EC2 实例的“Kernel panic - not syncing”(内核崩溃 - 无法同步)错误?
由于缺少 initramfs 或内核模块,我想升级内核或重启我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例。但是,我收到“Kernel panic - not syncing”(内核崩溃 - 无法同步)错误。
简短描述
当设备或地址不存在时,会出现“Kernel panic - not syncing”(内核崩溃 - 无法同步)错误。要解决此问题,请启动一个临时实例,然后将故障根磁盘作为辅助驱动器连接以执行诊断。
**重要事项:**在停止并启动实例之前,请执行以下操作:
- 创建您的 Amazon Elastic Block Store (Amazon EBS) 卷的备份。
**注意:**如果您的实例是由实例存储支持,或者具有包含数据的实例存储卷,则 Amazon EC2 会在实例停止时删除这些数据。 - 完成解决步骤后,暂时将该实例从其 Amazon EC2 Auto Scaling 组中移除。
**注意:**如果您停止 Amazon EC2 Auto Scaling 组中的实例,则可以根据缩容保护设置终止该实例。使用 Amazon EMR、AWS CloudFormation 或 AWS Elastic Beanstalk 启动的实例可能位于自动扩缩组中。 - 将实例关闭行为设置为 Stop(停止),以确保实例在您停止时不会终止。
**注意:**当停止并启动某个实例时,该实例的公共 IP 地址将发生变化。最佳做法是使用弹性 IP 地址而不是公共 IP 地址将外部流量路由到您的实例。
有关详细信息,请参阅在停止实例时发生的情况。
解决方法
**注意:**以下解决步骤仅适用于 Amazon Linux 2、Amazon Linux 2023、Fedora 16 及更高版本以及 Red Hat Enterprise Linux (RHEL) 7 及更高版本。
要将根磁盘连接到临时实例,请完成以下步骤:
-
从同一可用区内具有相同 Linux 操作系统 (OS) 版本的亚马逊机器映像 (AMI) 启动一个临时实例。
-
将根卷与原始实例分离,然后将其作为辅助卷连接到临时实例。记下卷设备名称。
-
要更改为根用户,请运行以下命令:
sudo su -
要确定块设备名称和分区,请从临时实例运行以下命令:
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 实例。
-
如果您使用分区卷,请运行以下命令来挂载分区 /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 实例上卷的设备名称。
-
要在 /mnt 目录中创建 chroot 环境,请运行以下命令:
for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt此示例从原始根文件系统中绑定挂载 /dev、/proc、/sys 和 /run 目录。此配置允许在 chroot 环境中运行的进程访问这些系统目录。
-
要在 / 目录中创建 initramfs 的备份,请运行以下命令:
for file in /boot/initramfs-*.img; do cp "${file}" "/$(basename "$file")_$(date +%Y%m%d)"; done
- 要列出默认内核,请运行以下命令:
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"
- 更新 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
- 要退出并分离卷,请运行下面的命令:
exit; umount -fl /mnt
- 将辅助卷与临时实例分离,并将其作为根设备连接到原始实例。使用您在步骤 4 中记下的设备名称。
- 连接到原始实例。

