为什么我的 EC2 Linux 实例无法访问并且其状态检查失败?

3 分钟阅读
0

我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例无法访问,并且其状态检查失败。

简短描述

Amazon EC2 使用三种状态检查来监控 EC2 实例的运行状况:

系统状态检查

系统状态检查会检测实例底层硬件的问题。如果由于网络、硬件或软件问题,底层硬件无响应或无法访问,则系统状态检查便会失败。

实例状态检查

实例状态检查失败表明该实例无法访问。以下问题会导致实例状态检查失败:

  • 未能启动操作系统 (OS)。
  • 未能正确挂载卷。
  • CPU 和内存耗尽。
  • 内核崩溃。
  • 网络故障。

**警告:**以下某些解决方法要求先停止实例,然后再启动实例。在停止并启动实例之前,请注意以下条件:

  • 当实例停止时,存储在实例存储卷中的数据会丢失。在停止实例之前,请务必备份数据。与 Amazon Elastic Block Store (Amazon EBS) 支持的卷不同,实例存储卷不支持数据持久化。
  • Amazon EC2 在启动或开始时自动分配给实例的静态公有 IPv4 地址在停止和开始后会发生变化。要保留公有 IPv4 地址,让其在停止实例后不会发生变化,请使用弹性 IP 地址

有关详细信息,请参阅停止和启动 Amazon EC2 实例

附加的 EBS 状态检查

附加的 EBS 状态检查可监控附加到实例的 Amazon EBS 卷是否可以访问并能够完成 I/O 操作。有关详细信息,请参阅附加的 EBS 状态检查

解决方法

要查看是实例状态检查失败还是系统状态检查失败,请查看实例的状态检查指标

如果系统状态检查失败,请参阅为什么我的 EC2 Linux 实例未能通过系统状态检查?

如果实例状态检查失败,请检查实例的系统日志以查看失败的原因。然后,使用以下可能的解决方法之一来解决问题。

未能启动操作系统

如果系统日志包含启动错误,请参阅如何对因操作系统问题而未能通过实例状态检查的 EC2 Linux 实例进行故障排除?

未能正确挂载卷

挂载点故障会导致实例状态检查失败。挂载点故障命令示例:

[FAILED] Failed to mount /
See 'systemctl status mnt-nvme0n1p1.mount' for details.
[DEPEND] Dependency failed for Local File Systems.

有关详细信息,请参阅以下 AWS Knowledge Center 文章:

当您将实例类型从 Xen 更改为基于 Nitro 的实例时,卷挂载可能会失败。挂载失败是因为 Amazon EBS 卷在基于 Nitro 的实例上暴露为 NVMe 块设备。例如,设备名称为 /dev/nvme0n1/dev/nvme1n1。您在块设备映射中指定的设备名称将被重命名为 NVMe 设备名称 (/dev/nvme[0-26]n1)。

**注意:**块设备驱动程序可能会按与您在块设备映射中指定的顺序不同的顺序分配 NVMe 设备名称。为避免在基于 Nitro 的实例上挂载失败,最佳做法是使用标签或 UUID 作为设备名称。有关详细信息,请参阅使 Amazon EBS 卷可供使用

CPU 和内存耗尽

CPU 利用率高

如果 CPUUtilization 指标等于或接近 100%,则表明实例没有足够的计算容量来运行内核。

对于 T2 或 T3 实例,请检查 Amazon CloudWatch CPU 积分指标,以查看 UPC 积分是否等于或接近零。如果 CPU 积分为零,则 CPUUtilization 指标显示实例的基准性能处于饱和稳定状态。例如,基准性能可能为 20% 或 40%。CPU 利用率等于或接近 100%,这表明状态检查失败是由于资源过度使用而导致的。T2 或 T3 实例已达到饱和稳定状态,这表明状态检查失败是由于过度使用而导致的。

要对此问题进行故障排除,请参阅如何对因资源过度使用而未通过状态检查的 EC2 Linux 实例进行故障排除?

块设备错误、软件错误或内核崩溃会导致 CPU 使用率异常激增。如果 CPU 利用率为 100%,请首先检查系统日志中是否存在块设备或内存问题错误或者其他异常系统错误。然后,重启或者停止并启动实例。

内存不足

内存压力过高会导致实例状态检查失败。在以下示例日志摘录中,操作系统内存不足,oom-killer 已启动。要解决此错误,请停止内存消耗最多的进程。

[115879.769795] Out of memory: kill process 20273 (httpd) score 1285879 or a child
[115879.769795] Killed process 1917 (php-cgi) vsz:467184kB, anon-rss:101196kB, file-rss:204kB

默认情况下,EC2 实例内存和磁盘指标不会发送到 Amazon CloudWatch。有关详细信息,请参阅使用 CloudWatch 代理收集指标、日志和跟踪信息

要排查并解决内存不足问题,请将实例升级到更大的实例类型。或者,向实例添加交换存储空间以缓解内存压力。有关详细信息,请参阅以下 AWS Knowledge Center 文章:

磁盘已满错误

如果系统日志包含磁盘已满错误,则表明由于根设备已满,实例处于紧急模式。

系统日志示例:

$: sudo service apache2 restart
Error: No space left on device

$: sudo /etc/init.d/mysql restart
[....] Restarting mysql (via systemctl):
mysql.serviceError: No space left on device

$: df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       7.7G  7.7G     0 100% /

有关如何排查和解决磁盘已满错误的详细说明,请参阅以下 Knowledge Center 文章:

内核崩溃

当内核在操作过程中检测到内部致命错误时,就会发生内核崩溃。如果错误发生在操作系统启动期间,则表明内核未正确加载。内核加载失败会导致实例启动失败。

内核崩溃错误消息示例:

Linux version
2.6.16-xenU (builder@xenbat.amazonsa) (gcc version 4.0.1 20050727 (Red Hat4.0.1-5)) #1 SMP Mon May 28 03:41:49 SAST 2007
Kernel command
line:  root=/dev/sda1 ro 4
Registering block device major 8
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,1)

有关如何排查和解决内核崩溃错误的信息,请参阅以下 Knowledge Center 文章:

网络故障

您的网络可能由于以下原因而出现故障:

  • 实例上未安装 cloud-init
  • cloud-init 包用于在启动时更新网络配置。

要更正此错误并在您的实例上安装 cloud-init 包,请运行以下命令:

对于 Amazon、Amazon Linux 2、Amazon Linux 2023 或 RedHat 操作系统:

$ sudo yum install cloud-init -y

对于 Ubuntu 或 Debian 操作系统:

$ sudo apt install cloud-init -y

MAC 地址硬编码在配置文件中

硬编码的 MAC 地址位于 Linux 配置文件和 udev 配置文件中。您可以在以下位置找到日志文件:

  • /etc/udev/rules.d/
  • /etc/udev/rules.d/70-persistent-net.rules
  • /etc/udev/rules.d/80-net-name-slot.rules

要解决由硬编码的 MAC 地址引起的网络问题,请删除条目或配置文件,然后运行以下命令:

$ sudo mv /etc/udev/rules.d/70-persistent-net.rules /root/

移动配置文件后,请重启网络服务以确保获取新的 MAC 地址。

IP 地址硬编码在网络配置文件中

当您从具有静态配置 IP 地址的实例创建亚马逊机器映像 (AMI) 时,配置文件将包含硬编码的 IP 地址。要更正此错误,请将您的网络接口设置为使用 DHCP。

**注意:**您无法更新已经存在的 AMI。在创建新的 AMI 之前,您必须将网络接口设置为使用 DHCP。

缺少 ENA 或 Intel 增强型网络驱动程序

有关缺少弹性网络适配器 (ENA) 或 Intel 增强型网络驱动程序的详细信息,请参阅 Amazon EC2 实例上的增强联网功能

网络接口在启动时被自动重命名

要停用可预测的网络接口重命名,请向内核命令行中添加 net.ifnames=0。要使用占位符,您必须使用 ENA 激活增强联网功能,并重新构建或更新 grub 配置文件。

相关信息

对状态检查失败的 Amazon EC2 Linux 实例进行故障排除

为什么我的 EC2 Windows 实例因系统状态检查失败或状态检查 0/2 而关闭?

为什么我的 EC2 Windows 实例因实例状态检查失败而关闭?

状态检查类型

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