发送诊断中断(适用于高级用户) - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

发送诊断中断(适用于高级用户)

警告

诊断中断供高级用户使用。使用不当会对您的实例产生负面影响。向实例发送诊断中断可能会触发实例崩溃和重新启动,从而导致数据丢失。

您可以将诊断中断发送到无法访问或无响应的 Linux 实例以手动触发内核错误

在出现内核错误时,Linux 操作系统通常会发生崩溃并重启。操作系统的具体行为取决于其配置。内核错误也可用于使实例的操作系统内核执行任务,例如生成崩溃转储文件。然后,您可以使用崩溃转储文件中的信息进行根本原因分析并调试实例。

崩溃转储数据由操作系统在实例本身上本地生成。

在向您的实例发送诊断中断之前,我们建议您查阅适合您操作系统的文档,然后进行必要的配置更改。

支持的实例类型

除 Amazon Graviton 处理器支持的实例类型外的所有基于 Nitro 的实例类型均支持诊断中断。有关更多信息,请参阅基于 Amazon Nitro System 构建的实例Amazon Graviton

先决条件

在使用诊断中断之前,必须配置实例的操作系统。这可确保它在发生内核错误时执行所需的操作。

将 Amazon Linux 2 配置为在发生内核错误时生成崩溃转储
  1. 连接到您的 实例。

  2. 安装 kexeckdump

    [ec2-user ~]$ sudo yum install kexec-tools -y
  3. 配置内核以便为辅助内核预留适当的内存量。要预留的内存量取决于实例的总可用内存。使用首选文本编辑器打开 /etc/default/grub 文件,找到以 GRUB_CMDLINE_LINUX_DEFAULT 开始的行,然后按以下格式添加 crashkernel 参数:crashkernel=memory_to_reserve。例如,要预留 160MB,请修改 grub 文件,如下所示:

    GRUB_CMDLINE_LINUX_DEFAULT="crashkernel=160M console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0" GRUB_TIMEOUT=0 GRUB_DISABLE_RECOVERY="true"
  4. 保存更改并关闭 grub 文件。

  5. 重新构建 GRUB2 配置文件。

    [ec2-user ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  6. 在基于 Intel 和 AMD 处理器的实例上,send-diagnostic-interrupt 命令将未知的非屏蔽中断 (NMI) 发送到实例。您必须将内核配置为在收到未知 NMI 时发生崩溃。使用首选文本编辑器打开 /etc/sysctl.conf 文件,并添加以下内容。

    kernel.unknown_nmi_panic=1
  7. 重启实例并重新连接到它。

  8. 使用正确的 crashkernel 参数验证是否已启动内核。

    $ grep crashkernel /proc/cmdline

    以下示例输出指示成功的配置。

    BOOT_IMAGE=/boot/vmlinuz-4.14.128-112.105.amzn2.x86_64 root=UUID=a1e1011e-e38f-408e-878b-fed395b47ad6 ro crashkernel=160M console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0
  9. 确认 kdump 服务正在运行。

    [ec2-user ~]$ systemctl status kdump.service

    以下示例输出显示在 kdump 服务正在运行的情况下的结果。

    kdump.service - Crash recovery kernel arming Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled) Active: active (exited) since Fri 2019-05-24 23:29:13 UTC; 22s ago Process: 2503 ExecStart=/usr/bin/kdumpctl start (code=exited, status=0/SUCCESS) Main PID: 2503 (code=exited, status=0/SUCCESS)
注意

默认情况下,崩溃转储文件将保存到 /var/crash/。要更改位置,请使用首选文本编辑器修改 /etc/kdump.conf 文件。

将 Amazon Linux 配置为在发生内核错误时生成崩溃转储
  1. 连接到您的 实例。

  2. 安装 kexeckdump

    [ec2-user ~]$ sudo yum install kexec-tools -y
  3. 配置内核以便为辅助内核预留适当的内存量。要预留的内存量取决于实例的总可用内存。

    $ sudo grubby --args="crashkernel=memory_to_reserve" --update-kernel=ALL

    例如,要为崩溃内核预留 160MB,请使用以下命令。

    $ sudo grubby --args="crashkernel=160M" --update-kernel=ALL
  4. 在基于 Intel 和 AMD 处理器的实例上,send-diagnostic-interrupt 命令将未知的非屏蔽中断 (NMI) 发送到实例。您必须将内核配置为在收到未知 NMI 时发生崩溃。使用首选文本编辑器打开 /etc/sysctl.conf 文件,并添加以下内容。

    kernel.unknown_nmi_panic=1
  5. 重启实例并重新连接到它。

  6. 使用正确的 crashkernel 参数验证是否已启动内核。

    $ grep crashkernel /proc/cmdline

    以下示例输出指示成功的配置。

    root=LABEL=/ console=tty1 console=ttyS0 selinux=0 nvme_core.io_timeout=4294967295 LANG=en_US.UTF-8 KEYTABLE=us crashkernel=160M
  7. 确认 kdump 服务正在运行。

    [ec2-user ~]$ sudo service kdump status

    如果该服务正在运行,则命令将返回 Kdump is operational 响应。

注意

默认情况下,崩溃转储文件将保存到 /var/crash/。要更改位置,请使用首选文本编辑器修改 /etc/kdump.conf 文件。

配置 SUSE Linux Enterprise、Ubuntu 或 Red Hat Enterprise Linux

在基于 Intel 和 AMD 处理器的实例上,send-diagnostic-interrupt 命令将未知的非屏蔽中断 (NMI) 发送到实例。必须通过调整操作系统的配置文件,将内核配置为在收到未知 NMI 时发生崩溃。有关如何将内核配置为发生崩溃的信息,请参阅适用于操作系统的文档:

发送诊断中断

在完成必要的配置更改后,您可以使用 Amazon CLI 或 Amazon EC2 API 将诊断中断发送到实例。

将诊断中断发送到实例 (Amazon CLI)

使用 send-diagnostic-interrupt 命令并指定实例 ID。

aws ec2 send-diagnostic-interrupt --instance-id i-1234567890abcdef0